diff --git a/.eslintrc.js b/.eslintrc.js index 16a6e79e..7b88ee1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js
@@ -56,4 +56,9 @@ // TODO(dpapad): Add more checks according to our styleguide. }, + + 'overrides': [{ + 'files': ['**/*.ts'], + 'parser': './third_party/node/node_modules/@typescript-eslint/parser', + }] };
diff --git a/BUILD.gn b/BUILD.gn index f53f8e1a..7169f53 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -365,7 +365,7 @@ "//base/android/linker:chromium_android_linker", "//build/android/gyp/test:hello_world", "//build/android/stacktrace:java_deobfuscate", - "//build/android/test:android_lint_test", + "//build/android/test:android_nocompile_tests", "//build/config/android/test/proto:test_build_protos", "//chrome/android/monochrome:monochrome_public_apk_checker", "//chrome/android/webapk/shell_apk:maps_go_webapk",
diff --git a/DEPS b/DEPS index 6e60be1a1..9830a21 100644 --- a/DEPS +++ b/DEPS
@@ -209,11 +209,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': 'dd84dd09f30459ed9a22caee4fa019e425e89f7d', + 'skia_revision': 'd6c51edd524307088b15ed90aa3b13443ff157df', # 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': '0cf641358acebb26c2b7ddc047b1b41597d344c8', + 'v8_revision': 'ee2b79f9798a2f9b589f76751c0144c835e33b69', # 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. @@ -221,7 +221,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': '5e5d17cdbc479f2d2979bfe290a01a004f76cc11', + 'angle_revision': '222a81cfaaf0be64e64fe1e8ec04753e287532fe', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -229,7 +229,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': 'd18ccc01ffa743bf5e0a406b7c12c7ce0973fa24', + 'pdfium_revision': '67a8dda2c2aa682028b4687f094b2b78a4b62398', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -244,7 +244,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling googletest # and whatever else without interference from each other. - 'googletest_revision': 'aa533abfd4232b01f9e57041d70114d5a77e6de0', + 'googletest_revision': 'e2239ee6043f73722e7aa812a459f54a28552929', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling lighttpd # and whatever else without interference from each other. @@ -288,7 +288,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': 'c5db59f19211ab8ed03c8d3c1dc91740cf4c7f75', + 'devtools_frontend_revision': '37858a9cec8b5dd5a02af9316d227c9ae7e6c4db', # 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. @@ -328,7 +328,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': 'f102e1138be00f090cc0830c3ca50100c4781c8d', + 'dawn_revision': '6681114e5e03398ddc1def0a4ae359c2ebb677c9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -376,7 +376,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': '950faeeabc1ee25569e62ec4ce749f013169482d', + 'libunwind_revision': '7e85c7a26be09db769732d59a829cc0d310e3ef6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -395,7 +395,7 @@ 'libcxx_revision': '8fa87946779682841e21e2da977eccfb6cb3bded', # GN CIPD package version. - 'gn_version': 'git_revision:695504d72a30e0b58705b2a1a23964ebf7bca030', + 'gn_version': 'git_revision:e0c476ffc83dc10897cb90b45c03ae2539352c5c', } # Only these hosts are allowed for dependencies in this DEPS file. @@ -573,7 +573,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '07075f8e7a9e8db5422cd62b37e7f93967292d8f', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '906a507ab0798635cd30b79e7fd250b218baeca9', 'condition': 'checkout_ios', }, @@ -643,7 +643,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'fUHNjtOsTXQPpZZSCbVSpBzwT1UEOifKZOdnCIEcuiAC', + 'version': 'XV77VIGsRzSJHtWjNROSVWfks6it9uwpKWEivm8jQlQC', }, ], 'dep_type': 'cipd', @@ -654,7 +654,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': '6E_C3M-uXDzoEFijqiH_UQgFu35eSqZj0nA0I8XWnKYC', + 'version': 'XXJRzIGsgYdI5YzOTBXaH22ZHhp8m_mMWkTrVaapGmkC', }, ], 'dep_type': 'cipd', @@ -665,7 +665,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'mKdjsaIEiqF8OQx_o8e82_ujIkVb80jizxrnxLZiZuIC', + 'version': 'Kv7IZ-a9Nc_tLUjjMSmCs_DdBjFx33olTDbh0b0ML3QC', }, ], 'dep_type': 'cipd', @@ -946,7 +946,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd1c188da7c6ade87bef128a7b7b3bef4d25dda57', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ab32be9f5abb982a53b035e1034e60ea8f3541f7', 'condition': 'checkout_chromeos', }, @@ -966,7 +966,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e5d455cca7848b948865330188cf7a4720cdfc51', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ef579a1192d2dace337b752245ba1c121f12b7ea', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1018,7 +1018,7 @@ Var('chromium_git') + '/external/github.com/Maratyszcza/FP16.git' + '@' + 'febbb1c163726b5db24bed55cc9dc42529068997', 'src/third_party/gemmlowp/src': - Var('chromium_git') + '/external/github.com/google/gemmlowp.git' + '@' + 'fda83bdc38b118cc6b56753bd540caa49e570745', + Var('chromium_git') + '/external/github.com/google/gemmlowp.git' + '@' + '8589f2084b738e2285d5e8547b8b699c03a177dd', 'src/third_party/grpc/src': { 'url': Var('chromium_git') + '/external/github.com/grpc/grpc.git' + '@' + '54dc182082db941aa67c7c3f93ad858c99a16d7d', @@ -1335,7 +1335,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '3dd5b80bc4f172dd82925bb259cb7c82348409c5', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '0f37d8d302ee7da5c2ed5eafb93898709b9a0d9c', + Var('chromium_git') + '/openscreen' + '@' + '423f5afa0824473d502cc0d66f007ea000890df8', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '97cfe495bb7a3853266b646d1c79e169387f9c7a', @@ -1352,7 +1352,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'adce539a59a382b5617e7b8b6817593c78fa697d', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '9834c0b42685d73191ef86d127f4e283d8cb6277', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1441,7 +1441,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'gfelhsY7VgvfD42f6dk62r6yT6yAjzWSGKAIOUd0le4C' + 'version': 'KF0Sz0CG_sURJodN44_YMwy0VU9tagOFFB_3EDTux1kC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1545,10 +1545,10 @@ 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '22ba62ffe79c3881581ab430368bf3764d9533eb', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7e098c965711254a3d72c4eb35736263f0d410b8', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@ddf3235b7621a2903cba288dc4c93ea4a5848747', 'src/third_party/vulkan_memory_allocator': - Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '732a76d9d3c70d6aa487216495eeb28518349c3a', + Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'f67d7fa397e83060b76a1ec53579116a0bbdff7a', # Display server protocol for Linux. 'src/third_party/wayland/src': { @@ -1578,13 +1578,13 @@ Var('chromium_git') + '/external/github.com/SeleniumHQ/selenium/py.git' + '@' + 'd0045ec570c1a77612db35d1e92f05e1d27b4d53', 'src/third_party/webgl/src': - Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a0b8774ce8cec1dc8f4308810bf05eb8867c62de', + Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'aca1420b74cd8420e73670e56dc4c61394a2ad90', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '5465b5ca4ad3a5c8a9800157d8d3eafef6f7b018', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '8ab02d2228c649ba0e581f846a44674d1fb59ef1', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '9dea393f17ed34a3e62366ac6e1275f8bef5dcda', + Var('webrtc_git') + '/src.git' + '@' + '13dac0c268854cfb0c0526b91298e74c77cc81ce', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1645,7 +1645,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d55746abd668d92e0fa06f9bf13be3472b290184', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@469a9c6ef22d4ac086d2670080d12e62617ddd6e', 'condition': 'checkout_src_internal', }, @@ -1664,7 +1664,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'BjWI5eQsG-z-QTw7w1KsRmOO6FmbJYMWsp1bnh8O8f4C', + 'version': 'dcwqCRfaOIOB75sJfdKXRLMIU8MJp5myUl5Hx8_4NwoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1675,7 +1675,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'vQyQC81g5zPW9Jhezjlbv8i8FGhW3t-emvZqpotIEQAC', + 'version': 'n-lStNG-D7Fpiih0AwpOYIk6nDT8zKB0l6OXwR5mCfoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc index 11c99bc..265f03d 100644 --- a/android_webview/browser/aw_contents.cc +++ b/android_webview/browser/aw_contents.cc
@@ -1131,7 +1131,7 @@ const JavaParamRef<jobject>& obj, jint color) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - render_view_host_ext_->SetBackgroundColor(color); + web_contents_->SetPageBaseBackgroundColor(color); } void AwContents::ZoomBy(JNIEnv* env,
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc index 6dc9b6b..3ade51cd 100644 --- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc +++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
@@ -56,7 +56,6 @@ content::WebContents* contents) : content::WebContentsObserver(contents), client_(client), - background_color_(SK_ColorWHITE), has_new_hit_test_data_(false), frame_host_receivers_(contents, this) { DCHECK(client_); @@ -124,15 +123,6 @@ local_main_frame_remote_->SetInitialPageScale(page_scale_factor); } -void AwRenderViewHostExt::SetBackgroundColor(SkColor c) { - if (background_color_ == c) - return; - background_color_ = c; - if (local_main_frame_remote_) { - local_main_frame_remote_->SetBackgroundColor(background_color_); - } -} - void AwRenderViewHostExt::SetWillSuppressErrorPage(bool suppress) { will_suppress_error_page_ = suppress; } @@ -149,8 +139,6 @@ local_main_frame_remote_.reset(); frame_host->GetRemoteAssociatedInterfaces()->GetInterface( local_main_frame_remote_.BindNewEndpointAndPassReceiver()); - - local_main_frame_remote_->SetBackgroundColor(background_color_); } void AwRenderViewHostExt::RenderFrameCreated(
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.h b/android_webview/browser/renderer_host/aw_render_view_host_ext.h index 882db0a..f2d7011 100644 --- a/android_webview/browser/renderer_host/aw_render_view_host_ext.h +++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
@@ -70,7 +70,6 @@ // Sets the initial page scale. This overrides initial scale set by // the meta viewport tag. void SetInitialPageScale(double page_scale_factor); - void SetBackgroundColor(SkColor c); void SetWillSuppressErrorPage(bool suppress); void SmoothScroll(int target_x, int target_y, base::TimeDelta duration); @@ -103,8 +102,6 @@ AwRenderViewHostExtClient* client_; - SkColor background_color_; - // Authoritative copy of hit test data on the browser side. This is updated // as a result of DoHitTest called explicitly or when the FocusedNodeChanged // is called in AwRenderViewExt.
diff --git a/android_webview/common/mojom/frame.mojom b/android_webview/common/mojom/frame.mojom index 4e60e1f..006f75f2 100644 --- a/android_webview/common/mojom/frame.mojom +++ b/android_webview/common/mojom/frame.mojom
@@ -79,9 +79,6 @@ // things that webview needs from the main frame. interface LocalMainFrame { - // Sets the base background color for this view. - SetBackgroundColor(skia.mojom.SkColor color); - // Sets the initial page scale. This overrides initial scale set by // the meta viewport tag. SetInitialPageScale(double page_scale_factor);
diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected index 0eaa3c2..81eb9ad 100644 --- a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
@@ -55,6 +55,13 @@ </intent-filter> # DIFF-ANCHOR: 23298d3b <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" android:value="true"/> </activity> # DIFF-ANCHOR: aeabab17 + <activity-alias # DIFF-ANCHOR: da85c28e + android:name="org.chromium.android_webview.SafeModeState" + android:enabled="false" + android:process=":webview_apk" + android:targetActivity="org.chromium.android_webview.devui.MainActivity" + android:visibleToInstantApps="true"> + </activity-alias> # DIFF-ANCHOR: da85c28e <activity-alias # DIFF-ANCHOR: b7cc06e9 android:name="org.chromium.android_webview.devui.DeveloperModeState" android:enabled="false" @@ -80,6 +87,13 @@ android:process=":webview_service" android:visibleToInstantApps="true"> </provider> # DIFF-ANCHOR: bfe37944 + <provider # DIFF-ANCHOR: ecfff997 + android:name="org.chromium.android_webview.services.SafeModeContentProvider" + android:authorities="$PACKAGE.SafeModeContentProvider" + android:exported="true" + android:process=":webview_service" + android:visibleToInstantApps="true"> + </provider> # DIFF-ANCHOR: ecfff997 <receiver # DIFF-ANCHOR: 0a6f8fa5 android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver" android:exported="false"> @@ -132,6 +146,11 @@ android:process=":webview_service" android:visibleToInstantApps="true"> </service> # DIFF-ANCHOR: eecf2fee + <service # DIFF-ANCHOR: 47046f1b + android:name="org.chromium.android_webview.services.SafeModeService" + android:exported="true" + android:process=":webview_service"> + </service> # DIFF-ANCHOR: 47046f1b <service # DIFF-ANCHOR: dc926e35 android:name="org.chromium.android_webview.services.VariationsSeedServer" android:exported="true"
diff --git a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected index 1964101..ea959fe2 100644 --- a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected +++ b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
@@ -55,6 +55,13 @@ </intent-filter> # DIFF-ANCHOR: 23298d3b <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" android:value="true"/> </activity> # DIFF-ANCHOR: aeabab17 + <activity-alias # DIFF-ANCHOR: da85c28e + android:name="org.chromium.android_webview.SafeModeState" + android:enabled="false" + android:process=":webview_apk" + android:targetActivity="org.chromium.android_webview.devui.MainActivity" + android:visibleToInstantApps="true"> + </activity-alias> # DIFF-ANCHOR: da85c28e <activity-alias # DIFF-ANCHOR: b7cc06e9 android:name="org.chromium.android_webview.devui.DeveloperModeState" android:enabled="false" @@ -80,6 +87,13 @@ android:process=":webview_service" android:visibleToInstantApps="true"> </provider> # DIFF-ANCHOR: bfe37944 + <provider # DIFF-ANCHOR: ecfff997 + android:name="org.chromium.android_webview.services.SafeModeContentProvider" + android:authorities="$PACKAGE.SafeModeContentProvider" + android:exported="true" + android:process=":webview_service" + android:visibleToInstantApps="true"> + </provider> # DIFF-ANCHOR: ecfff997 <receiver # DIFF-ANCHOR: 0a6f8fa5 android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver" android:exported="false"> @@ -132,6 +146,11 @@ android:process=":webview_service" android:visibleToInstantApps="true"> </service> # DIFF-ANCHOR: eecf2fee + <service # DIFF-ANCHOR: 47046f1b + android:name="org.chromium.android_webview.services.SafeModeService" + android:exported="true" + android:process=":webview_service"> + </service> # DIFF-ANCHOR: 47046f1b <service # DIFF-ANCHOR: dc926e35 android:name="org.chromium.android_webview.services.VariationsSeedServer" android:exported="true"
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java index ff5d882..84f4e9b 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -35,6 +35,7 @@ import org.chromium.android_webview.AwBrowserProcess; import org.chromium.android_webview.AwContentsStatics; import org.chromium.android_webview.AwSettings; +import org.chromium.android_webview.BrowserSafeModeActionList; import org.chromium.android_webview.ProductConfig; import org.chromium.android_webview.WebViewChromiumRunQueue; import org.chromium.android_webview.common.AwSwitches; @@ -42,6 +43,7 @@ import org.chromium.android_webview.common.DeveloperModeUtils; import org.chromium.android_webview.common.FlagOverrideHelper; import org.chromium.android_webview.common.ProductionSupportedFlagList; +import org.chromium.android_webview.common.SafeModeController; import org.chromium.base.BuildInfo; import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; @@ -64,6 +66,7 @@ import java.io.File; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; @@ -396,6 +399,22 @@ AwContentsStatics.logFlagOverridesWithNative(flagOverrides); } + try { + SafeModeController controller = SafeModeController.getInstance(); + + controller.registerActions(BrowserSafeModeActionList.sList); + boolean isSafeModeEnabled = controller.isSafeModeEnabled(webViewPackageName); + if (isSafeModeEnabled) { + Set<String> actions = controller.queryActions(webViewPackageName); + Log.w(TAG, "WebViewSafeMode is enabled: received %d SafeModeActions", + actions.size()); + controller.executeActions(actions); + } + } catch (Throwable t) { + // Don't let SafeMode crash WebView. Instead just log the error. + Log.e(TAG, "WebViewSafeMode threw exception: ", t); + } + mAwInit.startVariationsInit(); mShouldDisableThreadChecking = shouldDisableThreadChecking(ctx);
diff --git a/android_webview/java/src/org/chromium/android_webview/common/SafeModeController.java b/android_webview/java/src/org/chromium/android_webview/common/SafeModeController.java index 5d7df50f..59d9f22 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/SafeModeController.java +++ b/android_webview/java/src/org/chromium/android_webview/common/SafeModeController.java
@@ -7,6 +7,8 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -25,6 +27,9 @@ public class SafeModeController { public static final String SAFE_MODE_STATE_COMPONENT = "org.chromium.android_webview.SafeModeState"; + public static final String URI_AUTHORITY_SUFFIX = ".SafeModeContentProvider"; + public static final String SAFE_MODE_ACTIONS_URI_PATH = "/safe-mode-actions"; + public static final String ACTIONS_COLUMN = "actions"; private static final String TAG = "WebViewSafeMode"; @@ -70,6 +75,33 @@ } /** + * Queries SafeModeContentProvider for the set of actions which should be applied. Returns the + * empty set if SafeMode is disabled. This should only be called from embedded WebView contexts. + */ + public Set<String> queryActions(String webViewPackageName) { + Set<String> actions = new HashSet<>(); + + Uri uri = new Uri.Builder() + .scheme("content") + .authority(webViewPackageName + URI_AUTHORITY_SUFFIX) + .path(SAFE_MODE_ACTIONS_URI_PATH) + .build(); + + final Context appContext = ContextUtils.getApplicationContext(); + try (Cursor cursor = appContext.getContentResolver().query(uri, /* projection */ null, + /* selection */ null, /* selectionArgs */ null, /* sortOrder */ null)) { + assert cursor != null : "ContentProvider doesn't support querying '" + uri + "'"; + int actionIdColumnIndex = cursor.getColumnIndexOrThrow(ACTIONS_COLUMN); + while (cursor.moveToNext()) { + actions.add(cursor.getString(actionIdColumnIndex)); + } + } + + Log.i(TAG, "Received SafeModeActions: %s", actions); + return actions; + } + + /** * Executes the given set of {@link SafeModeAction}s. Execution order is determined by the order * of the array registered by {@link registerActions}. *
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SafeModeTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SafeModeTest.java index 2b44aca..d2652d4 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/SafeModeTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/SafeModeTest.java
@@ -41,6 +41,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** @@ -90,6 +91,8 @@ PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP); SafeModeController.getInstance().unregisterActionsForTesting(); + + SafeModeService.clearSharedPrefsForTesting(); } @Test @@ -154,6 +157,111 @@ SafeModeController.getInstance().isSafeModeEnabled(TEST_WEBVIEW_PACKAGE_NAME)); } + @Test + @MediumTest + @Feature({"AndroidWebView"}) + public void testQueryActions_disabled() throws Throwable { + Assert.assertEquals( + "Querying the ContentProvider should yield empty set when SafeMode is disabled", + asSet(), SafeModeController.getInstance().queryActions(TEST_WEBVIEW_PACKAGE_NAME)); + } + + @Test + @MediumTest + @Feature({"AndroidWebView"}) + public void testQueryActions_singleAction() throws Throwable { + Intent intent = new Intent(ContextUtils.getApplicationContext(), SafeModeService.class); + final String variationsActionId = new VariationsSeedSafeModeAction().getId(); + try (ServiceConnectionHelper helper = + new ServiceConnectionHelper(intent, Context.BIND_AUTO_CREATE)) { + ISafeModeService service = ISafeModeService.Stub.asInterface(helper.getBinder()); + service.setSafeMode(Arrays.asList(variationsActionId)); + } + + Assert.assertTrue("SafeMode should be enabled", + SafeModeController.getInstance().isSafeModeEnabled(TEST_WEBVIEW_PACKAGE_NAME)); + Assert.assertEquals("Querying the ContentProvider should yield the action we set", + asSet(variationsActionId), + SafeModeController.getInstance().queryActions(TEST_WEBVIEW_PACKAGE_NAME)); + } + + @Test + @MediumTest + @Feature({"AndroidWebView"}) + public void testQueryActions_autoDisableAfter30Days() throws Throwable { + Intent intent = new Intent(ContextUtils.getApplicationContext(), SafeModeService.class); + final String variationsActionId = new VariationsSeedSafeModeAction().getId(); + final long initialStartTimeMs = 12345L; + SafeModeService.setClockForTesting(() -> { return initialStartTimeMs; }); + try (ServiceConnectionHelper helper = + new ServiceConnectionHelper(intent, Context.BIND_AUTO_CREATE)) { + ISafeModeService service = ISafeModeService.Stub.asInterface(helper.getBinder()); + service.setSafeMode(Arrays.asList(variationsActionId)); + } + + final long beforeTimeLimitMs = + initialStartTimeMs + SafeModeService.SAFE_MODE_ENABLED_TIME_LIMIT_MS - 1L; + SafeModeService.setClockForTesting(() -> { return beforeTimeLimitMs; }); + + Assert.assertTrue("SafeMode should be enabled (before timeout)", + SafeModeController.getInstance().isSafeModeEnabled(TEST_WEBVIEW_PACKAGE_NAME)); + Assert.assertEquals("Querying the ContentProvider should yield the action we set", + asSet(variationsActionId), + SafeModeController.getInstance().queryActions(TEST_WEBVIEW_PACKAGE_NAME)); + + final long afterTimeLimitMs = + initialStartTimeMs + SafeModeService.SAFE_MODE_ENABLED_TIME_LIMIT_MS; + SafeModeService.setClockForTesting(() -> { return afterTimeLimitMs; }); + + Assert.assertTrue("SafeMode should be enabled until querying ContentProvider", + SafeModeController.getInstance().isSafeModeEnabled(TEST_WEBVIEW_PACKAGE_NAME)); + Assert.assertEquals("ContentProvider should return empty set after timeout", asSet(), + SafeModeController.getInstance().queryActions(TEST_WEBVIEW_PACKAGE_NAME)); + Assert.assertFalse("SafeMode should be disabled after querying ContentProvider", + SafeModeController.getInstance().isSafeModeEnabled(TEST_WEBVIEW_PACKAGE_NAME)); + } + + @Test + @MediumTest + @Feature({"AndroidWebView"}) + public void testQueryActions_extendTimeoutWithDuplicateConfig() throws Throwable { + Intent intent = new Intent(ContextUtils.getApplicationContext(), SafeModeService.class); + final String variationsActionId = new VariationsSeedSafeModeAction().getId(); + final long initialStartTimeMs = 12345L; + SafeModeService.setClockForTesting(() -> { return initialStartTimeMs; }); + try (ServiceConnectionHelper helper = + new ServiceConnectionHelper(intent, Context.BIND_AUTO_CREATE)) { + ISafeModeService service = ISafeModeService.Stub.asInterface(helper.getBinder()); + service.setSafeMode(Arrays.asList(variationsActionId)); + } + + // Send a duplicate config after 1 day to extend the SafeMode timeout for another 30 days. + final long duplicateConfigTimeMs = initialStartTimeMs + TimeUnit.DAYS.toMillis(1); + SafeModeService.setClockForTesting(() -> { return duplicateConfigTimeMs; }); + try (ServiceConnectionHelper helper = + new ServiceConnectionHelper(intent, Context.BIND_AUTO_CREATE)) { + ISafeModeService service = ISafeModeService.Stub.asInterface(helper.getBinder()); + service.setSafeMode(Arrays.asList(variationsActionId)); + } + + // 30 days after the original timeout + final long firstTimeLimitMs = + initialStartTimeMs + SafeModeService.SAFE_MODE_ENABLED_TIME_LIMIT_MS; + SafeModeService.setClockForTesting(() -> { return firstTimeLimitMs; }); + + Assert.assertEquals( + "Querying the ContentProvider should yield the action we set (timeout extended)", + asSet(variationsActionId), + SafeModeController.getInstance().queryActions(TEST_WEBVIEW_PACKAGE_NAME)); + + final long secondTimeLimitMs = + duplicateConfigTimeMs + SafeModeService.SAFE_MODE_ENABLED_TIME_LIMIT_MS; + SafeModeService.setClockForTesting(() -> { return secondTimeLimitMs; }); + + Assert.assertEquals("ContentProvider should return empty set after timeout", asSet(), + SafeModeController.getInstance().queryActions(TEST_WEBVIEW_PACKAGE_NAME)); + } + private class TestSafeModeAction implements SafeModeAction { private int mCallCount; private int mExecutionOrder;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SslPreferencesTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SslPreferencesTest.java index c2a73c9..16d00b8 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/SslPreferencesTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/SslPreferencesTest.java
@@ -17,11 +17,9 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.test.TestAwContentsClient.OnReceivedSslErrorHelper; -import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.Feature; import org.chromium.net.test.EmbeddedTestServer; import org.chromium.net.test.ServerCertificate; -import org.chromium.ui.test.util.UiDisableIf; /** * SslError tests. @@ -50,7 +48,6 @@ @Test @Feature({"AndroidWebView"}) @SmallTest - @DisableIf.Device(type = {UiDisableIf.TABLET}) // see crbug.com/1207587 public void testSslErrorNotCalledForOkCert() throws Throwable { mTestServer = EmbeddedTestServer.createAndStartHTTPSServer( InstrumentationRegistry.getInstrumentation().getContext(),
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn index 7465ffb..65054fdb 100644 --- a/android_webview/nonembedded/BUILD.gn +++ b/android_webview/nonembedded/BUILD.gn
@@ -97,6 +97,7 @@ "java/src/org/chromium/android_webview/services/DeveloperModeContentProvider.java", "java/src/org/chromium/android_webview/services/DeveloperUiService.java", "java/src/org/chromium/android_webview/services/MetricsBridgeService.java", + "java/src/org/chromium/android_webview/services/SafeModeContentProvider.java", "java/src/org/chromium/android_webview/services/SafeModeService.java", "java/src/org/chromium/android_webview/services/VariationsSeedHolder.java", "java/src/org/chromium/android_webview/services/VariationsSeedServer.java",
diff --git a/android_webview/nonembedded/java/AndroidManifest.xml b/android_webview/nonembedded/java/AndroidManifest.xml index 820a7ada..640cc51 100644 --- a/android_webview/nonembedded/java/AndroidManifest.xml +++ b/android_webview/nonembedded/java/AndroidManifest.xml
@@ -63,6 +63,15 @@ android:process=":webview_apk" /> {# Explicit process required for monochrome compatibility. #} <!-- End of WebView Developer UI Activities --> + <!-- Don't actually try to launch with this alias: it only exists so we can query its enabled state. --> + <!-- If you change this component make sure to update the corresponding copy in + test/shell/AndroidManifest.xml --> + <activity-alias android:name="org.chromium.android_webview.SafeModeState" + android:targetActivity="org.chromium.android_webview.devui.MainActivity" + android:visibleToInstantApps="true" + android:enabled="false" + android:process=":webview_apk" /> {# Explicit process required for monochrome compatibility. #} + <activity android:name="org.chromium.android_webview.nonembedded.LicenseActivity" android:label="@string/license_activity_title" android:process=":webview_apk" {# Explicit process required for monochrome compatibility. #} @@ -89,6 +98,14 @@ android:authorities="{{ manifest_package }}.DeveloperModeContentProvider" android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} tools:ignore="ExportedContentProvider" /> + <!-- If you change this component make sure to update the corresponding copy in + test/shell/AndroidManifest.xml--> + <provider android:name="org.chromium.android_webview.services.SafeModeContentProvider" + android:visibleToInstantApps="true" + android:exported="true" + android:authorities="{{ manifest_package }}.SafeModeContentProvider" + android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedContentProvider" /> <!-- Disables at startup init of Emoji2. See http://crbug.com/1205141 --> <provider android:authorities="{{ manifest_package }}.androidx-startup" @@ -122,6 +139,10 @@ android:exported="true" android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} tools:ignore="ExportedService" /> + <service android:name="org.chromium.android_webview.services.SafeModeService" + android:exported="true" + android:process=":webview_service" {# Explicit process required for monochrome compatibility. #} + tools:ignore="ExportedService" /> <service android:name="org.chromium.android_webview.services.MetricsBridgeService" android:exported="true" android:visibleToInstantApps="true"
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeContentProvider.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeContentProvider.java new file mode 100644 index 0000000..320fff1 --- /dev/null +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeContentProvider.java
@@ -0,0 +1,66 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.services; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.database.MatrixCursor; +import android.net.Uri; + +import org.chromium.android_webview.common.SafeModeController; + +import java.util.Set; + +/** + * A {@link ContentProvider} to fetch SafeMode state. No special permissions are required to access + * this ContentProvider, and it can be accessed by any context (including the embedded WebView + * implementation). + */ +public final class SafeModeContentProvider extends ContentProvider { + @Override + public boolean onCreate() { + return true; + } + + @Override + public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { + // Not supported + return 0; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + // Not supported + return 0; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + // Not supported + return null; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + if (SafeModeController.SAFE_MODE_ACTIONS_URI_PATH.equals(uri.getPath())) { + final String[] columns = {SafeModeController.ACTIONS_COLUMN}; + Set<String> actions = SafeModeService.getSafeModeConfig(); + MatrixCursor cursor = new MatrixCursor(columns, actions.size()); + for (String action : actions) { + cursor.addRow(new Object[] {action}); + } + return cursor; + } + return null; + } + + @Override + public String getType(Uri uri) { + // Not supported + return null; + } +}
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java index c557ef3..801ee0460 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java
@@ -9,6 +9,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; @@ -31,7 +32,10 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.GuardedBy; @@ -149,6 +153,26 @@ (byte) 0xfa, (byte) 0x00}), }; + // Auto-disable SafeMode after 30 days. + @VisibleForTesting + public static final long SAFE_MODE_ENABLED_TIME_LIMIT_MS = TimeUnit.DAYS.toMillis(30); + + /** + * A mockable clock. Returns the current time in ms since the unix epoch. For reference, the + * default implementation is {@code System.currentTimeMillis()}. + */ + @VisibleForTesting + public interface Clock { + long currentTimeMillis(); + } + + @GuardedBy("sLock") + private static Clock sClock = System::currentTimeMillis; + + private static final String SHARED_PREFS_FILE = "webview_safemode_prefs"; + + private static final String LAST_MODIFIED_TIME_KEY = "LAST_MODIFIED_TIME"; + private boolean isCallerTrusted() { final Context context = ContextUtils.getApplicationContext(); PackageManager pm = context.getPackageManager(); @@ -191,7 +215,7 @@ } synchronized (sLock) { - SafeModeService.this.setSafeMode(actions); + SafeModeService.setSafeMode(actions); } } }; @@ -201,21 +225,83 @@ return mBinder; } + private static SharedPreferences getSharedPreferences() { + final Context context = ContextUtils.getApplicationContext(); + return context.getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE); + } + /** * Sets the SafeMode config. This includes persisting the set of actions, toggling component * state, etc. */ @GuardedBy("sLock") - private void setSafeMode(List<String> actions) { - // TODO(ntfschr): persist the list of actions once we figure out the right representation on - // disk. - ComponentName safeModeComponent = - new ComponentName(this, SafeModeController.SAFE_MODE_STATE_COMPONENT); + private static void setSafeMode(List<String> actions) { + boolean enableSafeMode = actions != null && !actions.isEmpty(); - int newState = actions == null || actions.isEmpty() - ? PackageManager.COMPONENT_ENABLED_STATE_DEFAULT - : PackageManager.COMPONENT_ENABLED_STATE_ENABLED; - getPackageManager().setComponentEnabledSetting( + SharedPreferences.Editor editor = getSharedPreferences().edit(); + if (enableSafeMode) { + long currentTime = sClock.currentTimeMillis(); + editor.putLong(LAST_MODIFIED_TIME_KEY, currentTime); + + // TODO(ntfschr): persist the list of actions once we figure out the right + // representation on disk. + } else { + editor.clear(); + } + + // Ignore errors, since there's no way to recover. Commit changes async to avoid + // blocking the service. + editor.apply(); + + final Context context = ContextUtils.getApplicationContext(); + ComponentName safeModeComponent = + new ComponentName(context, SafeModeController.SAFE_MODE_STATE_COMPONENT); + + int newState = enableSafeMode ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED + : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + context.getPackageManager().setComponentEnabledSetting( safeModeComponent, newState, PackageManager.DONT_KILL_APP); } + + @GuardedBy("sLock") + private static boolean shouldAutoDisableSafeMode() { + long lastModifiedTime = getSharedPreferences().getLong(LAST_MODIFIED_TIME_KEY, 0L); + long currentTime = sClock.currentTimeMillis(); + long timeSinceLastSafeModeConfig = currentTime - lastModifiedTime; + return timeSinceLastSafeModeConfig >= SAFE_MODE_ENABLED_TIME_LIMIT_MS; + } + + @VisibleForTesting + public static void setClockForTesting(Clock clock) { + synchronized (sLock) { + sClock = clock; + } + } + + // This must match the constant in VariationsSeedSafeModeAction.java + private static final String VARIATIONS_SAFEMODEACTION_ID = "delete_variations_seed"; + + public static Set<String> getSafeModeConfig() { + synchronized (sLock) { + final Context context = ContextUtils.getApplicationContext(); + if (!SafeModeController.getInstance().isSafeModeEnabled(context.getPackageName())) { + return new HashSet<>(); + } + if (shouldAutoDisableSafeMode()) { + setSafeMode(Arrays.asList()); + return new HashSet<>(); + } + // TODO(ntfschr): fetch the list of actions from disk once we figure out the right + // representation on disk. At that point, we can delete the VARIATIONS_SAFEMODEACTION_ID + // constant in this class since there's no more benefit to hardcoding actions. + return new HashSet<>(Arrays.asList(VARIATIONS_SAFEMODEACTION_ID)); + } + } + + @VisibleForTesting + public static void clearSharedPrefsForTesting() { + synchronized (sLock) { + getSharedPreferences().edit().clear().apply(); + } + } }
diff --git a/android_webview/renderer/aw_content_renderer_client.cc b/android_webview/renderer/aw_content_renderer_client.cc index 6b75f1bb..17263f1 100644 --- a/android_webview/renderer/aw_content_renderer_client.cc +++ b/android_webview/renderer/aw_content_renderer_client.cc
@@ -151,14 +151,11 @@ new js_injection::JsCommunication(render_frame); new AwSafeBrowsingErrorPageControllerDelegateImpl(render_frame); - // TODO(jam): when the frame tree moves into content and parent() works at - // RenderFrame construction, simplify this by just checking parent(). - content::RenderFrame* parent_frame = - render_frame->GetRenderView()->GetMainRenderFrame(); - if (parent_frame && parent_frame != render_frame) { + content::RenderFrame* main_frame = render_frame->GetMainRenderFrame(); + if (main_frame && main_frame != render_frame) { // Avoid any race conditions from having the browser's UI thread tell the IO // thread that a subframe was created. - GetRenderMessageFilter()->SubFrameCreated(parent_frame->GetRoutingID(), + GetRenderMessageFilter()->SubFrameCreated(main_frame->GetRoutingID(), render_frame->GetRoutingID()); }
diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc index 56c3a50..81329d4 100644 --- a/android_webview/renderer/aw_render_frame_ext.cc +++ b/android_webview/renderer/aw_render_frame_ext.cc
@@ -286,14 +286,6 @@ GetFrameHost()->UpdateHitTestData(std::move(data)); } -void AwRenderFrameExt::SetBackgroundColor(SkColor c) { - blink::WebView* webview = GetWebView(); - if (!webview) - return; - - webview->SetBaseBackgroundColor(c); -} - void AwRenderFrameExt::SetInitialPageScale(double page_scale_factor) { blink::WebView* webview = GetWebView(); if (!webview)
diff --git a/android_webview/renderer/aw_render_frame_ext.h b/android_webview/renderer/aw_render_frame_ext.h index 88cd911..e8e6752 100644 --- a/android_webview/renderer/aw_render_frame_ext.h +++ b/android_webview/renderer/aw_render_frame_ext.h
@@ -48,7 +48,6 @@ void OnDestruct() override; // mojom::LocalMainFrame overrides: - void SetBackgroundColor(SkColor c) override; void SetInitialPageScale(double page_scale_factor) override; void SetTextZoomFactor(float zoom_factor) override; void HitTest(const gfx::PointF& touch_center,
diff --git a/android_webview/test/shell/AndroidManifest.xml b/android_webview/test/shell/AndroidManifest.xml index 8592ea28..a916e4c 100644 --- a/android_webview/test/shell/AndroidManifest.xml +++ b/android_webview/test/shell/AndroidManifest.xml
@@ -111,6 +111,9 @@ <!-- End of Developer UI related components --> <!-- Components for SafeMode, make sure that any changes in these components reflect the corresponding original components in nonembedded/java/AndroidManifest.xml --> + <provider android:name="org.chromium.android_webview.services.SafeModeContentProvider" + android:exported="true" + android:authorities="org.chromium.android_webview.shell.SafeModeContentProvider"/> <service android:name="org.chromium.android_webview.services.SafeModeService" android:exported="true" /> <activity-alias android:name="org.chromium.android_webview.SafeModeState"
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 4ca0def..1bb122c9 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -754,6 +754,8 @@ "quick_answers/ui/quick_answers_pre_target_handler.h", "quick_answers/ui/quick_answers_view.cc", "quick_answers/ui/quick_answers_view.h", + "quick_answers/ui/user_consent_view.cc", + "quick_answers/ui/user_consent_view.h", "quick_answers/ui/user_notice_view.cc", "quick_answers/ui/user_notice_view.h", "root_window_controller.cc", @@ -1030,6 +1032,7 @@ "system/holding_space/holding_space_tray_icon_preview.h", "system/holding_space/holding_space_util.cc", "system/holding_space/holding_space_util.h", + "system/holding_space/holding_space_view_builder.h", "system/holding_space/holding_space_view_delegate.cc", "system/holding_space/holding_space_view_delegate.h", "system/holding_space/pinned_files_bubble.cc", @@ -1819,6 +1822,7 @@ "//ui/wm", ] deps = [ + "//ash/ambient/proto", "//ash/app_list", "//ash/app_menu", "//ash/assistant/model", @@ -2451,6 +2455,7 @@ deps = [ ":ash", ":test_support", + "//ash/ambient/proto", "//ash/app_list", "//ash/app_list:test_support", "//ash/app_list:unit_tests", @@ -2832,6 +2837,7 @@ ] deps = [ "//ash", + "//ash/ambient/proto", "//ash/app_list", "//ash/app_list:test_support", "//ash/app_menu",
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc index 2e73015..d98457f0 100644 --- a/ash/accelerators/accelerator_controller_impl.cc +++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -895,9 +895,7 @@ UnifiedSystemTray* tray = RootWindowController::ForWindow(target_root) ->GetStatusAreaWidget() ->unified_system_tray(); - if (tray->IsBubbleShown()) { - tray->CloseBubble(); - } else { + if (!tray->IsBubbleShown()) { tray->ShowBubble(); tray->ActivateBubble();
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc index 8182e01..61e02fa 100644 --- a/ash/accelerators/accelerator_controller_unittest.cc +++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -38,6 +38,8 @@ #include "ash/system/brightness_control_delegate.h" #include "ash/system/keyboard_brightness_control_delegate.h" #include "ash/system/power/power_button_controller_test_api.h" +#include "ash/system/status_area_widget_test_helper.h" +#include "ash/system/unified/unified_system_tray.h" #include "ash/test/ash_test_base.h" #include "ash/test_media_client.h" #include "ash/test_screenshot_delegate.h" @@ -88,6 +90,7 @@ #include "ui/display/test/display_manager_test_api.h" #include "ui/events/devices/device_data_manager_test_api.h" #include "ui/events/event.h" +#include "ui/events/event_constants.h" #include "ui/events/event_sink.h" #include "ui/events/keycodes/dom/dom_code.h" #include "ui/events/test/event_generator.h" @@ -1318,6 +1321,22 @@ GetAppListTestHelper()->CheckVisibility(true); } +TEST_F(AcceleratorControllerTest, GlobalAcceleratorsToggleQuickSettings) { + UnifiedSystemTray* tray = + StatusAreaWidgetTestHelper::GetStatusAreaWidget()->unified_system_tray(); + auto* generator = GetEventGenerator(); + + // Pressing accelerator once should show the quick settings bubble. + generator->PressKey(ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(tray->IsBubbleShown()); + + // Pressing accelerator a second time should dismiss the bubble. + generator->PressKey(ui::VKEY_S, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN); + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(tray->IsBubbleShown()); +} + TEST_F(AcceleratorControllerTest, GlobalAcceleratorsToggleAppListFullscreen) { base::HistogramTester histogram_tester;
diff --git a/ash/accessibility/accessibility_controller_impl.cc b/ash/accessibility/accessibility_controller_impl.cc index 65d85ca..fc8a1a3a 100644 --- a/ash/accessibility/accessibility_controller_impl.cc +++ b/ash/accessibility/accessibility_controller_impl.cc
@@ -56,7 +56,6 @@ #include "components/prefs/pref_service.h" #include "ui/accessibility/accessibility_features.h" #include "ui/accessibility/accessibility_switches.h" -#include "ui/accessibility/aura/aura_window_properties.h" #include "ui/aura/window.h" #include "ui/base/cursor/cursor_size.h" #include "ui/base/l10n/l10n_util.h" @@ -1351,22 +1350,6 @@ ObservePrefs(prefs); } -void AccessibilityControllerImpl::OnSessionStateChanged( - session_manager::SessionState state) { - // Everything behind the lock screen is in - // kShellWindowId_NonLockScreenContainersContainer. If the session state is - // changed to block the user session due to the lock screen or similar, - // everything in that window should be made invisible for accessibility. - // This keeps a11y features from being able to access parts of the tree - // that are visibly hidden behind the lock screen. - aura::Window* container = - Shell::GetContainer(Shell::GetPrimaryRootWindow(), - kShellWindowId_NonLockScreenContainersContainer); - container->SetProperty( - ui::kAXConsiderInvisibleAndIgnoreChildren, - Shell::Get()->session_controller()->IsUserSessionBlocked()); -} - AccessibilityEventRewriter* AccessibilityControllerImpl::GetAccessibilityEventRewriterForTest() { return accessibility_event_rewriter_; @@ -1776,8 +1759,8 @@ base::UmaHistogramEnumeration(uma_name, uma_value); } - accessibility_event_rewriter_->SetKeyCodesForSwitchAccessCommand(key_codes, - command); + accessibility_event_rewriter_->SetKeyCodesForSwitchAccessCommand(key_codes, + command); } void AccessibilityControllerImpl::UpdateSwitchAccessAutoScanEnabledFromPref() {
diff --git a/ash/accessibility/accessibility_controller_impl.h b/ash/accessibility/accessibility_controller_impl.h index 8e089dc0..7378c484 100644 --- a/ash/accessibility/accessibility_controller_impl.h +++ b/ash/accessibility/accessibility_controller_impl.h
@@ -402,7 +402,6 @@ // SessionObserver: void OnSigninScreenPrefServiceInitialized(PrefService* prefs) override; void OnActiveUserPrefServiceChanged(PrefService* prefs) override; - void OnSessionStateChanged(session_manager::SessionState state) override; // Test helpers: AccessibilityEventRewriter* GetAccessibilityEventRewriterForTest();
diff --git a/ash/accessibility/accessibility_controller_unittest.cc b/ash/accessibility/accessibility_controller_unittest.cc index 941687d4..13496df 100644 --- a/ash/accessibility/accessibility_controller_unittest.cc +++ b/ash/accessibility/accessibility_controller_unittest.cc
@@ -24,7 +24,6 @@ #include "chromeos/dbus/power/fake_power_manager_client.h" #include "components/prefs/pref_service.h" #include "components/prefs/testing_pref_service.h" -#include "ui/accessibility/aura/aura_window_properties.h" #include "ui/message_center/message_center.h" using message_center::MessageCenter; @@ -1203,31 +1202,4 @@ EXPECT_TRUE(user_prefs->GetBoolean(kAccessibilitySwitchAccessEnabled)); } -TEST_P(AccessibilityControllerSigninTest, - UpdatesNonLoginWindowVisibilityOnLogin) { - aura::Window* container = - Shell::GetContainer(Shell::GetPrimaryRootWindow(), - kShellWindowId_NonLockScreenContainersContainer); - - BlockUserSession(BLOCKED_BY_LOCK_SCREEN); - EXPECT_TRUE( - container->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)); - - UnblockUserSession(); - EXPECT_FALSE( - container->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)); - - BlockUserSession(BLOCKED_BY_LOGIN_SCREEN); - EXPECT_TRUE( - container->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)); - - UnblockUserSession(); - EXPECT_FALSE( - container->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)); - - BlockUserSession(BLOCKED_BY_USER_ADDING_SCREEN); - EXPECT_TRUE( - container->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)); -} - } // namespace ash
diff --git a/ash/ambient/ambient_constants.h b/ash/ambient/ambient_constants.h index fb72c06..e0a891b 100644 --- a/ash/ambient/ambient_constants.h +++ b/ash/ambient/ambient_constants.h
@@ -42,9 +42,7 @@ // from disk. constexpr int kMaxConsecutiveReadPhotoFailures = 3; -constexpr char kPhotoFileExt[] = ".img"; -constexpr char kPhotoDetailsFileExt[] = ".txt"; -constexpr char kRelatedPhotoSuffix[] = "_r"; +constexpr char kPhotoCacheExt[] = ".cache"; // Directory name of ambient mode. constexpr char kAmbientModeDirectoryName[] = "ambient-mode";
diff --git a/ash/ambient/ambient_photo_cache.cc b/ash/ambient/ambient_photo_cache.cc index 34cf33a..32dc28f 100644 --- a/ash/ambient/ambient_photo_cache.cc +++ b/ash/ambient/ambient_photo_cache.cc
@@ -4,7 +4,11 @@ #include "ash/ambient/ambient_photo_cache.h" +#include <fstream> +#include <iostream> + #include "ash/ambient/ambient_constants.h" +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "ash/public/cpp/ambient/ambient_client.h" #include "base/bind.h" #include "base/files/file_util.h" @@ -60,12 +64,14 @@ return base::DirectoryExists(path) || base::CreateDirectory(path); } -// Writes |data| to |path| if |data| is not nullptr and is not empty. If |data| -// is nullptr or empty, will delete any existing file at |path|. bool WriteOrDeleteFile(const base::FilePath& path, - const std::string* const data) { - if (!data || data->empty()) - return base::DeleteFile(path); + const ambient::PhotoCacheEntry& cache_entry) { + // If the primary photo is empty, the same as the related photo. + if (!cache_entry.has_primary_photo() || + cache_entry.primary_photo().image().empty()) { + base::DeleteFile(path); + return false; + } if (!CreateDirIfNotExists(path.DirName())) { LOG(ERROR) << "Cannot create ambient mode directory."; @@ -86,9 +92,10 @@ } // Write to the tmp file. - const int size = data->size(); - int written_size = base::WriteFile(temp_file, data->data(), size); - if (written_size != size) { + const char* path_str = temp_file.value().c_str(); + std::fstream output(path_str, + std::ios::out | std::ios::trunc | std::ios::binary); + if (!cache_entry.SerializeToOstream(&output)) { LOG(ERROR) << "Cannot write the temporary file."; base::DeleteFile(temp_file); return false; @@ -98,31 +105,15 @@ if (!base::ReplaceFile(temp_file, path, /*error=*/nullptr)) { LOG(ERROR) << "Cannot replace the temporary file."; base::DeleteFile(temp_file); + base::DeleteFile(path); return false; } return true; } -base::FilePath GetPhotoPath(int cache_index, - const base::FilePath& root_path, - bool is_related = false) { - std::string file_ext; - - // "_r.img" for related files, ".img" otherwise - if (is_related) - file_ext += kRelatedPhotoSuffix; - - file_ext += kPhotoFileExt; - - return root_path.Append(base::NumberToString(cache_index) + file_ext); -} - -base::FilePath GetDetailsPath(int cache_index, - const base::FilePath& root_path) { - return GetPhotoPath(cache_index, root_path) - .RemoveExtension() - .AddExtension(kPhotoDetailsFileExt); +base::FilePath GetCachePath(int cache_index, const base::FilePath& root_path) { + return root_path.Append(base::NumberToString(cache_index) + kPhotoCacheExt); } // -----------------AmbientPhotoCacheImpl--------------------------------------- @@ -137,9 +128,9 @@ ~AmbientPhotoCacheImpl() override = default; // AmbientPhotoCache: - void DownloadPhoto(const std::string& url, - base::OnceCallback<void(std::unique_ptr<std::string>)> - callback) override { + void DownloadPhoto( + const std::string& url, + base::OnceCallback<void(std::string&&)> callback) override { std::unique_ptr<network::SimpleURLLoader> simple_loader = CreateSimpleURLLoader(url); scoped_refptr<network::SharedURLLoaderFactory> loader_factory = @@ -156,9 +147,8 @@ void DownloadPhotoToFile(const std::string& url, int cache_index, - bool is_related, base::OnceCallback<void(bool)> callback) override { - auto file_path = GetPhotoPath(cache_index, root_directory_, is_related); + auto file_path = GetCachePath(cache_index, root_directory_); task_runner_->PostTaskAndReply( FROM_HERE, base::BindOnce( @@ -173,9 +163,9 @@ } void DecodePhoto( - std::unique_ptr<std::string> data, + const std::string& data, base::OnceCallback<void(const gfx::ImageSkia&)> callback) override { - std::vector<uint8_t> image_bytes(data->begin(), data->end()); + std::vector<uint8_t> image_bytes(data.begin(), data.end()); data_decoder::DecodeImageIsolated( image_bytes, data_decoder::mojom::ImageCodec::kDefault, /*shrink_to_fit=*/true, data_decoder::kDefaultMaxSizeInBytes, @@ -183,72 +173,42 @@ base::BindOnce(&ToImageSkia, std::move(callback))); } - void WriteFiles(int cache_index, - const std::string* const image, - const std::string* const details, - const std::string* const related_image, - base::OnceClosure callback) override { + void WritePhotoCache(int cache_index, + const ambient::PhotoCacheEntry& cache_entry, + base::OnceClosure callback) override { DCHECK_LT(cache_index, kMaxNumberOfCachedImages); task_runner_->PostTaskAndReply( FROM_HERE, base::BindOnce( [](int cache_index, const base::FilePath& root_path, - const std::string* const image, const std::string* const details, - const std::string* const related_image) { - bool success = true; - - auto image_path = GetPhotoPath(cache_index, root_path); - success = success && WriteOrDeleteFile(image_path, image); - - auto details_path = GetDetailsPath(cache_index, root_path); - success = success && WriteOrDeleteFile(details_path, details); - - auto related_image_path = - GetPhotoPath(cache_index, root_path, /*is_related=*/true); - success = success && - WriteOrDeleteFile(related_image_path, related_image); - - if (!success) { - LOG(WARNING) << "Error writing files"; - base::DeleteFile(image_path); - base::DeleteFile(details_path); - base::DeleteFile(related_image_path); - } + const ambient::PhotoCacheEntry& cache_entry) { + auto cache_path = GetCachePath(cache_index, root_path); + WriteOrDeleteFile(cache_path, cache_entry); }, - cache_index, root_directory_, image, details, related_image), + cache_index, root_directory_, cache_entry), std::move(callback)); } - void ReadFiles(int cache_index, - base::OnceCallback<void(PhotoCacheEntry)> callback) override { - task_runner_->PostTaskAndReplyWithResult( + void ReadPhotoCache(int cache_index, + ambient::PhotoCacheEntry* cache_entry, + base::OnceCallback<void()> callback) override { + task_runner_->PostTaskAndReply( FROM_HERE, base::BindOnce( - [](int cache_index, const base::FilePath& root_path) { - auto image = std::make_unique<std::string>(); - auto details = std::make_unique<std::string>(); - auto related_image = std::make_unique<std::string>(); + [](int cache_index, const base::FilePath& root_path, + ambient::PhotoCacheEntry* cache_entry) { + auto cache_path = GetCachePath(cache_index, root_path); - auto image_path = GetPhotoPath(cache_index, root_path); - - if (!base::ReadFileToString(image_path, image.get())) - image->clear(); - - auto details_path = GetDetailsPath(cache_index, root_path); - - if (!base::ReadFileToString(details_path, details.get())) - details->clear(); - - auto related_path = - GetPhotoPath(cache_index, root_path, /*is_related=*/true); - - if (!base::ReadFileToString(related_path, related_image.get())) - related_image->clear(); - - return PhotoCacheEntry(std::move(image), std::move(details), - std::move(related_image)); + // Read the existing cache. + const char* path_str = cache_path.value().c_str(); + std::fstream input(path_str, std::ios::in | std::ios::binary); + if (!input || !cache_entry->ParseFromIstream(&input)) { + LOG(ERROR) << "Unable to read photo cache"; + *cache_entry = ambient::PhotoCacheEntry(); + base::DeleteFile(cache_path); + } }, - cache_index, root_directory_), + cache_index, root_directory_, cache_entry), std::move(callback)); } @@ -274,8 +234,8 @@ // Create a temporary file path as target for download to guard against race // conditions in reading. - base::FilePath temp_path = file_path.DirName().Append( - base::UnguessableToken::Create().ToString() + kPhotoFileExt); + base::FilePath temp_path = + file_path.DirName().Append(base::UnguessableToken::Create().ToString()); // Download to temp file first to guarantee entire image is written without // errors before attempting to read it. @@ -289,19 +249,19 @@ } void OnUrlDownloaded( - base::OnceCallback<void(std::unique_ptr<std::string>)> callback, + base::OnceCallback<void(std::string&&)> callback, std::unique_ptr<network::SimpleURLLoader> simple_loader, scoped_refptr<network::SharedURLLoaderFactory> loader_factory, std::unique_ptr<std::string> response_body) { if (simple_loader->NetError() == net::OK && response_body) { - std::move(callback).Run(std::move(response_body)); + std::move(callback).Run(std::move(*response_body)); return; } LOG(ERROR) << "Downloading to string failed with error code: " - << GetResponseCode(simple_loader.get()) << " with network error" + << GetResponseCode(simple_loader.get()) << " with network error " << simple_loader->NetError(); - std::move(callback).Run(std::make_unique<std::string>()); + std::move(callback).Run(std::string()); } void OnUrlDownloadedToFile( @@ -313,7 +273,7 @@ if (simple_loader->NetError() != net::OK || temp_path.empty()) { LOG(ERROR) << "Downloading to file failed with error code: " << GetResponseCode(simple_loader.get()) - << " with network error" << simple_loader->NetError(); + << " with network error " << simple_loader->NetError(); if (!temp_path.empty()) { // Clean up temporary file. @@ -332,16 +292,27 @@ FROM_HERE, base::BindOnce( [](const base::FilePath& to_path, const base::FilePath& from_path) { - if (!base::ReplaceFile(from_path, to_path, - /*error=*/nullptr)) { + ambient::PhotoCacheEntry cache_entry; + ambient::Photo* primary_photo = + cache_entry.mutable_primary_photo(); + std::string image; + bool has_error = false; + + if (!base::ReadFileToString(from_path, &image)) { + has_error = true; + LOG(ERROR) << "Unable to read downloaded file"; + } else { + primary_photo->set_image(std::move(image)); + } + + if (!has_error && !WriteOrDeleteFile(to_path, cache_entry)) { + has_error = true; LOG(ERROR) << "Unable to move downloaded file to ambient directory"; - // Clean up the files. - base::DeleteFile(from_path); - base::DeleteFile(to_path); - return false; } - return true; + + base::DeleteFile(from_path); + return !has_error; }, desired_path, temp_path), std::move(callback)); @@ -354,27 +325,6 @@ } // namespace -// ---------------- PhotoCacheRead -------------------------------------------- - -PhotoCacheEntry::PhotoCacheEntry() = default; - -PhotoCacheEntry::PhotoCacheEntry(std::unique_ptr<std::string> image, - std::unique_ptr<std::string> details, - std::unique_ptr<std::string> related_image) - : image(std::move(image)), - details(std::move(details)), - related_image(std::move(related_image)) {} - -PhotoCacheEntry::PhotoCacheEntry(PhotoCacheEntry&&) = default; - -PhotoCacheEntry::~PhotoCacheEntry() = default; - -void PhotoCacheEntry::reset() { - image.reset(); - details.reset(); - related_image.reset(); -} - // -------------- AmbientPhotoCache -------------------------------------------- // static
diff --git a/ash/ambient/ambient_photo_cache.h b/ash/ambient/ambient_photo_cache.h index 56eceb7..47ceedf 100644 --- a/ash/ambient/ambient_photo_cache.h +++ b/ash/ambient/ambient_photo_cache.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "ash/ash_export.h" #include "base/callback_forward.h" #include "base/files/file_path.h" @@ -18,30 +19,6 @@ namespace ash { -// Holds the return value for |AmbientPhotoCache::ReadFiles| to use with -// |task_runner_->PostTaskAndReplyWithResult|. -// Represented on disk by a file for each of |image|, |details|, and -// |related_image|. -struct ASH_EXPORT PhotoCacheEntry { - PhotoCacheEntry(); - - PhotoCacheEntry(std::unique_ptr<std::string> image, - std::unique_ptr<std::string> details, - std::unique_ptr<std::string> related_image); - - PhotoCacheEntry(const PhotoCacheEntry&) = delete; - PhotoCacheEntry& operator=(const PhotoCacheEntry&) = delete; - PhotoCacheEntry(PhotoCacheEntry&&); - - ~PhotoCacheEntry(); - - void reset(); - - std::unique_ptr<std::string> image; - std::unique_ptr<std::string> details; - std::unique_ptr<std::string> related_image; -}; - // Interface for downloading and decoding photos for Ambient mode. Mocked for // testing to isolate from network and file system. // Each cache entry is written to disk as three files in the |root_path|, with @@ -57,35 +34,29 @@ virtual void DownloadPhoto( const std::string& url, - base::OnceCallback<void(std::unique_ptr<std::string>)> callback) = 0; + base::OnceCallback<void(std::string&&)> callback) = 0; // Saves the photo at |url| to |cache_index| and calls |callback| with a - // boolean that indicates success. Setting |is_related| will change the - // filename to indicate that this is a paired photo. + // boolean that indicates success. virtual void DownloadPhotoToFile(const std::string& url, int cache_index, - bool is_related, base::OnceCallback<void(bool)> callback) = 0; virtual void DecodePhoto( - std::unique_ptr<std::string> data, + const std::string& data, base::OnceCallback<void(const gfx::ImageSkia&)> callback) = 0; - // Write files to disk at |cache_index| and call |callback| when complete. - // |image| and |related_image| are encoded jpg images that must be decoded - // with |DecodePhoto| to display. |details| is human readable text. - virtual void WriteFiles(int cache_index, - const std::string* const image, - const std::string* const details, - const std::string* const related_image, - base::OnceClosure callback) = 0; + // Write photo cache to disk at |cache_index| and call |callback| when + // complete. + virtual void WritePhotoCache(int cache_index, + const ambient::PhotoCacheEntry& cache_entry, + base::OnceClosure callback) = 0; - // Read the files at |cache_index| and call |callback| with a struct - // containing the contents of each file. If a particular file fails to be - // read, it may be represented as nullptr or empty string. - virtual void ReadFiles( - int cache_index, - base::OnceCallback<void(PhotoCacheEntry)> callback) = 0; + // Read the photo cache at |cache_index| and call |callback| when complete. + // If a particular cache fails to be read, |cache_entry| will be empty. + virtual void ReadPhotoCache(int cache_index, + ambient::PhotoCacheEntry* cache_entry, + base::OnceCallback<void()> callback) = 0; // Erase all stored files from disk. virtual void Clear() = 0;
diff --git a/ash/ambient/ambient_photo_cache_unittest.cc b/ash/ambient/ambient_photo_cache_unittest.cc index 8c471014..fabd0b9 100644 --- a/ash/ambient/ambient_photo_cache_unittest.cc +++ b/ash/ambient/ambient_photo_cache_unittest.cc
@@ -4,7 +4,11 @@ #include "ash/ambient/ambient_photo_cache.h" +#include <fstream> +#include <iostream> + #include "ash/ambient/ambient_constants.h" +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "base/bind.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -50,85 +54,60 @@ std::string image("image"); std::string details("details"); std::string related_image("related image"); + std::string related_details("related details"); + bool is_portrait = true; { + ambient::PhotoCacheEntry cache; + cache.mutable_primary_photo()->set_image(image); + cache.mutable_primary_photo()->set_details(details); + cache.mutable_primary_photo()->set_is_portrait(is_portrait); + cache.mutable_related_photo()->set_image(related_image); + cache.mutable_related_photo()->set_details(related_details); + cache.mutable_related_photo()->set_is_portrait(is_portrait); + base::RunLoop loop; - photo_cache()->WriteFiles(cache_index, &image, &details, &related_image, - loop.QuitClosure()); + photo_cache()->WritePhotoCache(cache_index, cache, loop.QuitClosure()); loop.Run(); } { base::RunLoop loop; // Read the files back using photo cache. - photo_cache()->ReadFiles( - cache_index, - base::BindOnce( - [](base::OnceClosure done, PhotoCacheEntry cache_read) { - EXPECT_EQ(*cache_read.image, "image"); - EXPECT_EQ(*cache_read.details, "details"); - EXPECT_EQ(*cache_read.related_image, "related image"); - std::move(done).Run(); - }, - loop.QuitClosure())); + ambient::PhotoCacheEntry cache_read; + photo_cache()->ReadPhotoCache( + cache_index, &cache_read, + base::BindOnce([](base::OnceClosure done) { std::move(done).Run(); }, + loop.QuitClosure())); loop.Run(); + + EXPECT_EQ(cache_read.primary_photo().image(), "image"); + EXPECT_EQ(cache_read.primary_photo().details(), "details"); + EXPECT_TRUE(cache_read.primary_photo().is_portrait()); + EXPECT_EQ(cache_read.related_photo().image(), "related image"); + EXPECT_EQ(cache_read.related_photo().details(), "related details"); + EXPECT_TRUE(cache_read.related_photo().is_portrait()); } } -TEST_F(AmbientPhotoCacheTest, WritesFileToDisk) { - base::FilePath test_path = GetTestPath(); - - int cache_index = 5; - std::string image("image 5"); - std::string details("details 5"); - std::string related_image("related image 5"); - - // Make sure files are not on disk. - EXPECT_FALSE(base::PathExists(test_path.Append(FILE_PATH_LITERAL("5.img")))); - EXPECT_FALSE(base::PathExists(test_path.Append(FILE_PATH_LITERAL("5.txt")))); - EXPECT_FALSE( - base::PathExists(test_path.Append(FILE_PATH_LITERAL("5_r.img")))); - - // Write the data to the cache. - { - base::RunLoop loop; - photo_cache()->WriteFiles(cache_index, &image, &details, &related_image, - loop.QuitClosure()); - loop.Run(); - } - - // Verify that expected files are written to disk. - std::string actual_image; - EXPECT_TRUE(base::ReadFileToString( - test_path.Append(FILE_PATH_LITERAL("5.img")), &actual_image)); - EXPECT_EQ(actual_image, image); - - std::string actual_details; - EXPECT_TRUE(base::ReadFileToString( - test_path.Append(FILE_PATH_LITERAL("5.txt")), &actual_details)); - EXPECT_EQ(actual_details, details); - - std::string actual_related_image; - EXPECT_TRUE(base::ReadFileToString( - test_path.Append(FILE_PATH_LITERAL("5_r.img")), &actual_related_image)); - EXPECT_EQ(actual_related_image, related_image); -} - TEST_F(AmbientPhotoCacheTest, SetsDataToEmptyStringWhenFilesMissing) { base::FilePath test_path = GetTestPath(); EXPECT_FALSE(base::DirectoryExists(test_path)); { base::RunLoop loop; - photo_cache()->ReadFiles( - /*cache_index=*/1, - base::BindOnce( - [](base::OnceClosure done, PhotoCacheEntry cache_read) { - EXPECT_TRUE(cache_read.image->empty()); - EXPECT_TRUE(cache_read.details->empty()); - EXPECT_TRUE(cache_read.related_image->empty()); - std::move(done).Run(); - }, - loop.QuitClosure())); + ambient::PhotoCacheEntry cache_read; + photo_cache()->ReadPhotoCache( + /*cache_index=*/1, &cache_read, + base::BindOnce([](base::OnceClosure done) { std::move(done).Run(); }, + loop.QuitClosure())); + loop.Run(); + + EXPECT_TRUE(cache_read.primary_photo().image().empty()); + EXPECT_TRUE(cache_read.primary_photo().details().empty()); + EXPECT_FALSE(cache_read.primary_photo().is_portrait()); + EXPECT_TRUE(cache_read.related_photo().image().empty()); + EXPECT_TRUE(cache_read.related_photo().details().empty()); + EXPECT_FALSE(cache_read.related_photo().is_portrait()); } }
diff --git a/ash/ambient/ambient_photo_controller.cc b/ash/ambient/ambient_photo_controller.cc index b7a77375..3378741 100644 --- a/ash/ambient/ambient_photo_controller.cc +++ b/ash/ambient/ambient_photo_controller.cc
@@ -13,6 +13,7 @@ #include "ash/ambient/ambient_controller.h" #include "ash/ambient/ambient_photo_cache.h" #include "ash/ambient/model/ambient_backend_model.h" +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "ash/public/cpp/ambient/ambient_backend_controller.h" #include "ash/public/cpp/ambient/ambient_client.h" #include "ash/public/cpp/image_downloader.h" @@ -223,7 +224,6 @@ backup_photo_cache_->DownloadPhotoToFile( backup_photo_urls.at(i), /*cache_index=*/i, - /*is_related=*/false, base::BindOnce(&AmbientPhotoController::OnBackupImageFetched, weak_factory_.GetWeakPtr())); } @@ -270,7 +270,7 @@ } void AmbientPhotoController::ResetImageData() { - cache_entry_.reset(); + cache_entry_.Clear(); image_ = gfx::ImageSkia(); related_image_ = gfx::ImageSkia(); @@ -281,7 +281,11 @@ ResetImageData(); if (topic) { - const int num_callbacks = (topic->related_image_url) ? 2 : 1; + ambient::Photo* photo = cache_entry_.mutable_primary_photo(); + photo->set_details(topic->details); + photo->set_is_portrait(topic->is_portrait); + + const int num_callbacks = (topic->related_image_url.empty()) ? 1 : 2; auto on_done = base::BarrierClosure( num_callbacks, base::BindOnce(&AmbientPhotoController::OnAllPhotoRawDataDownloaded, @@ -291,16 +295,18 @@ topic->url, base::BindOnce(&AmbientPhotoController::OnPhotoRawDataDownloaded, weak_factory_.GetWeakPtr(), - /*is_related_image=*/false, on_done, - std::make_unique<std::string>(topic->details))); + /*is_related_image=*/false, on_done)); - if (topic->related_image_url) { + if (!topic->related_image_url.empty()) { + ambient::Photo* photo = cache_entry_.mutable_related_photo(); + photo->set_details(topic->related_details); + photo->set_is_portrait(topic->is_portrait); + photo_cache_->DownloadPhoto( - *(topic->related_image_url), + topic->related_image_url, base::BindOnce(&AmbientPhotoController::OnPhotoRawDataDownloaded, weak_factory_.GetWeakPtr(), - /*is_related_image=*/true, on_done, - std::make_unique<std::string>(topic->details))); + /*is_related_image=*/true, on_done)); } return; } @@ -341,8 +347,8 @@ DVLOG(3) << "Read from backup cache index: " << backup_cache_index_for_display_; // Try to read a backup image. - backup_photo_cache_->ReadFiles( - /*cache_index=*/backup_cache_index_for_display_, + backup_photo_cache_->ReadPhotoCache( + /*cache_index=*/backup_cache_index_for_display_, &cache_entry_, base::BindOnce(&AmbientPhotoController::OnAllPhotoRawDataAvailable, weak_factory_.GetWeakPtr(), /*from_downloading=*/false)); @@ -360,8 +366,8 @@ cache_index_for_display_ = 0; DVLOG(3) << "Read from cache index: " << current_cache_index; - photo_cache_->ReadFiles( - current_cache_index, + photo_cache_->ReadPhotoCache( + current_cache_index, &cache_entry_, base::BindOnce(&AmbientPhotoController::OnAllPhotoRawDataAvailable, weak_factory_.GetWeakPtr(), /*from_downloading=*/false)); } @@ -369,27 +375,22 @@ void AmbientPhotoController::OnPhotoRawDataDownloaded( bool is_related_image, base::RepeatingClosure on_done, - std::unique_ptr<std::string> details, - std::unique_ptr<std::string> data) { - cache_entry_.details = std::move(details); - + std::string&& data) { if (is_related_image) - cache_entry_.related_image = std::move(data); + cache_entry_.mutable_primary_photo()->set_image(std::move(data)); else - cache_entry_.image = std::move(data); + cache_entry_.mutable_related_photo()->set_image(std::move(data)); std::move(on_done).Run(); } void AmbientPhotoController::OnAllPhotoRawDataDownloaded() { - OnAllPhotoRawDataAvailable(/*from_downloading=*/true, - std::move(cache_entry_)); + OnAllPhotoRawDataAvailable(/*from_downloading=*/true); } -void AmbientPhotoController::OnAllPhotoRawDataAvailable( - bool from_downloading, - PhotoCacheEntry cache_entry) { - if (!cache_entry.image || cache_entry.image->empty()) { +void AmbientPhotoController::OnAllPhotoRawDataAvailable(bool from_downloading) { + if (!cache_entry_.has_primary_photo() || + cache_entry_.primary_photo().image().empty()) { if (from_downloading) { LOG(ERROR) << "Failed to download image"; resume_fetch_image_backoff_.InformOfRequest(/*succeeded=*/false); @@ -401,60 +402,53 @@ if (from_downloading) { // If the data is fetched from downloading, write to disk. - // Note: WriteFiles could fail. The saved file name may not be continuous. + // Note: WritePhotoCache could fail. The saved file name may not be + // continuous. DVLOG(3) << "Save photo to cache index: " << cache_index_for_store_; auto current_cache_index = cache_index_for_store_; ++cache_index_for_store_; if (cache_index_for_store_ == kMaxNumberOfCachedImages) cache_index_for_store_ = 0; - auto* image = cache_entry.image.get(); - auto* details = cache_entry.details.get(); - auto* related_image = cache_entry.related_image.get(); - - photo_cache_->WriteFiles( - /*cache_index=*/current_cache_index, image, details, related_image, + photo_cache_->WritePhotoCache( + /*cache_index=*/current_cache_index, cache_entry_, base::BindOnce(&AmbientPhotoController::OnPhotoRawDataSaved, - weak_factory_.GetWeakPtr(), from_downloading, - std::move(cache_entry))); + weak_factory_.GetWeakPtr(), from_downloading)); } else { - OnPhotoRawDataSaved(from_downloading, std::move(cache_entry)); + OnPhotoRawDataSaved(from_downloading); } } -void AmbientPhotoController::OnPhotoRawDataSaved(bool from_downloading, - PhotoCacheEntry cache_entry) { - bool has_related = - cache_entry.related_image && !cache_entry.related_image->empty(); +void AmbientPhotoController::OnPhotoRawDataSaved(bool from_downloading) { + const bool has_related = cache_entry_.has_related_photo() && + !cache_entry_.related_photo().image().empty(); const int num_callbacks = has_related ? 2 : 1; auto on_done = base::BarrierClosure( num_callbacks, - base::BindOnce(&AmbientPhotoController::OnAllPhotoDecoded, - weak_factory_.GetWeakPtr(), from_downloading, - cache_entry.details ? *cache_entry.details : std::string(), - /*hash=*/base::SHA1HashString(*cache_entry.image))); + base::BindOnce( + &AmbientPhotoController::OnAllPhotoDecoded, + weak_factory_.GetWeakPtr(), from_downloading, + /*hash=*/base::SHA1HashString(cache_entry_.primary_photo().image()))); DecodePhotoRawData(from_downloading, /*is_related_image=*/false, on_done, - std::move(cache_entry.image)); + cache_entry_.primary_photo().image()); if (has_related) { DecodePhotoRawData(from_downloading, /*is_related_image=*/true, on_done, - std::move(cache_entry.related_image)); + cache_entry_.related_photo().image()); } } -void AmbientPhotoController::DecodePhotoRawData( - bool from_downloading, - bool is_related_image, - base::RepeatingClosure on_done, - std::unique_ptr<std::string> data) { +void AmbientPhotoController::DecodePhotoRawData(bool from_downloading, + bool is_related_image, + base::RepeatingClosure on_done, + const std::string& data) { photo_cache_->DecodePhoto( - std::move(data), - base::BindOnce(&AmbientPhotoController::OnPhotoDecoded, - weak_factory_.GetWeakPtr(), from_downloading, - is_related_image, std::move(on_done))); + data, base::BindOnce(&AmbientPhotoController::OnPhotoDecoded, + weak_factory_.GetWeakPtr(), from_downloading, + is_related_image, std::move(on_done))); } void AmbientPhotoController::OnPhotoDecoded(bool from_downloading, @@ -470,7 +464,6 @@ } void AmbientPhotoController::OnAllPhotoDecoded(bool from_downloading, - const std::string& details, const std::string& hash) { if (image_.isNull()) { LOG(WARNING) << "Image decoding failed"; @@ -495,7 +488,9 @@ PhotoWithDetails detailed_photo; detailed_photo.photo = image_; detailed_photo.related_photo = related_image_; - detailed_photo.details = details; + detailed_photo.details = cache_entry_.primary_photo().details(); + detailed_photo.related_details = cache_entry_.related_photo().details(); + detailed_photo.is_portrait = cache_entry_.primary_photo().is_portrait(); detailed_photo.hash = hash; ResetImageData();
diff --git a/ash/ambient/ambient_photo_controller.h b/ash/ambient/ambient_photo_controller.h index f8f1c8ec..6bdb84e 100644 --- a/ash/ambient/ambient_photo_controller.h +++ b/ash/ambient/ambient_photo_controller.h
@@ -14,6 +14,7 @@ #include "ash/ambient/ambient_photo_cache.h" #include "ash/ambient/model/ambient_backend_model.h" #include "ash/ambient/model/ambient_backend_model_observer.h" +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "ash/ash_export.h" #include "ash/public/cpp/ambient/ambient_backend_controller.h" #include "base/callback_forward.h" @@ -117,20 +118,18 @@ void OnPhotoRawDataDownloaded(bool is_related_image, base::RepeatingClosure on_done, - std::unique_ptr<std::string> details, - std::unique_ptr<std::string> data); + std::string&& data); void OnAllPhotoRawDataDownloaded(); - void OnAllPhotoRawDataAvailable(bool from_downloading, - PhotoCacheEntry cache_entry); + void OnAllPhotoRawDataAvailable(bool from_downloading); - void OnPhotoRawDataSaved(bool from_downloading, PhotoCacheEntry cache_entry); + void OnPhotoRawDataSaved(bool from_downloading); void DecodePhotoRawData(bool from_downloading, bool is_related_image, base::RepeatingClosure on_done, - std::unique_ptr<std::string> data); + const std::string& data); void OnPhotoDecoded(bool from_downloading, bool is_related_image, @@ -138,7 +137,6 @@ const gfx::ImageSkia& image); void OnAllPhotoDecoded(bool from_downloading, - const std::string& details, const std::string& hash); void StartDownloadingWeatherConditionIcon( @@ -227,7 +225,7 @@ scoped_refptr<base::SequencedTaskRunner> task_runner_; // Temporary data store when fetching images and details. - PhotoCacheEntry cache_entry_; + ambient::PhotoCacheEntry cache_entry_; gfx::ImageSkia image_; gfx::ImageSkia related_image_;
diff --git a/ash/ambient/ambient_photo_controller_unittest.cc b/ash/ambient/ambient_photo_controller_unittest.cc index 05294235..e14fa1f 100644 --- a/ash/ambient/ambient_photo_controller_unittest.cc +++ b/ash/ambient/ambient_photo_controller_unittest.cc
@@ -11,6 +11,7 @@ #include "ash/ambient/ambient_controller.h" #include "ash/ambient/model/ambient_backend_model.h" #include "ash/ambient/model/ambient_backend_model_observer.h" +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "ash/ambient/test/ambient_ash_test_base.h" #include "ash/public/cpp/ambient/ambient_backend_controller.h" #include "ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h" @@ -59,8 +60,8 @@ return result; } - const PhotoCacheEntry* GetCacheEntryAtIndex(int cache_index, - bool backup = false) { + const ambient::PhotoCacheEntry* GetCacheEntryAtIndex(int cache_index, + bool backup = false) { const auto& files = backup ? GetBackupCachedFiles() : GetCachedFiles(); auto it = files.find(cache_index); if (it == files.end()) @@ -72,12 +73,28 @@ void WriteCacheDataBlocking(int cache_index, const std::string* image = nullptr, const std::string* details = nullptr, - const std::string* related_image = nullptr) { + const std::string* related_image = nullptr, + const std::string* related_details = nullptr, + bool is_portrait = false) { + ambient::PhotoCacheEntry cache_entry; + cache_entry.mutable_primary_photo()->set_image(*image); + + if (details) + cache_entry.mutable_primary_photo()->set_details(*details); + + cache_entry.mutable_primary_photo()->set_is_portrait(is_portrait); + + if (related_image) { + cache_entry.mutable_related_photo()->set_image(*related_image); + cache_entry.mutable_related_photo()->set_is_portrait(is_portrait); + } + + if (related_details) + cache_entry.mutable_related_photo()->set_details(*related_details); + base::RunLoop loop; - photo_cache()->WriteFiles(/*cache_index=*/cache_index, /*image=*/image, - /*details=*/details, - /*related_image=*/related_image, - loop.QuitClosure()); + photo_cache()->WritePhotoCache(/*cache_index=*/cache_index, cache_entry, + loop.QuitClosure()); loop.Run(); } @@ -156,6 +173,7 @@ // Tests that image details is correctly set. TEST_F(AmbientPhotoControllerTest, ShouldSetDetailsCorrectly) { + SetPhotoOrientation(/*portrait=*/true); // Start to refresh images. photo_controller()->StartScreenUpdate(); FastForwardToNextImage(); @@ -236,7 +254,7 @@ auto image = photo_controller()->ambient_backend_model()->GetCurrentImage(); EXPECT_TRUE(image.IsNull()); - // The initial file name to be read is 0. Save a file with 99.img to check + // The initial file name to be read is 0. Save a file with index 99 to check // if it gets read for display. std::string data("cached image"); WriteCacheDataBlocking(/*cache_index=*/99, &data); @@ -345,9 +363,10 @@ EXPECT_TRUE(base::Contains(backup_data, 0)); EXPECT_TRUE(base::Contains(backup_data, 1)); for (const auto& i : backup_data) { - EXPECT_EQ(*(i.second.image), expected_data); - EXPECT_FALSE(i.second.details); - EXPECT_FALSE(i.second.related_image); + EXPECT_EQ(i.second.primary_photo().image(), expected_data); + EXPECT_TRUE(i.second.primary_photo().details().empty()); + EXPECT_TRUE(i.second.related_photo().image().empty()); + EXPECT_TRUE(i.second.related_photo().details().empty()); } } @@ -392,9 +411,10 @@ EXPECT_TRUE(base::Contains(backup_data, 0)); EXPECT_TRUE(base::Contains(backup_data, 1)); for (const auto& i : backup_data) { - EXPECT_EQ(*(i.second.image), "image data"); - EXPECT_FALSE(i.second.details); - EXPECT_FALSE(i.second.related_image); + EXPECT_EQ(i.second.primary_photo().image(), "image data"); + EXPECT_TRUE(i.second.primary_photo().details().empty()); + EXPECT_TRUE(i.second.related_photo().image().empty()); + EXPECT_TRUE(i.second.related_photo().details().empty()); } }
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.cc b/ash/ambient/backdrop/ambient_backend_controller_impl.cc index d4aa577..245c298 100644 --- a/ash/ambient/backdrop/ambient_backend_controller_impl.cc +++ b/ash/ambient/backdrop/ambient_backend_controller_impl.cc
@@ -209,10 +209,15 @@ AmbientModeTopic ambient_topic; ambient_topic.topic_type = topic_type; - if (backdrop_topic.has_portrait_image_url()) + + // If the |portrait_image_url| field is not empty, we assume the image is + // portrait. + if (backdrop_topic.has_portrait_image_url()) { ambient_topic.url = backdrop_topic.portrait_image_url(); - else + ambient_topic.is_portrait = true; + } else { ambient_topic.url = backdrop_topic.url(); + } if (backdrop_topic.has_related_topic()) { if (backdrop_topic.related_topic().has_portrait_image_url()) { @@ -224,6 +229,8 @@ } } ambient_topic.details = BuildBackdropTopicDetails(backdrop_topic); + ambient_topic.related_details = + BuildBackdropTopicDetails(backdrop_topic.related_topic()); screen_update.next_topics.emplace_back(ambient_topic); } } @@ -474,7 +481,6 @@ // When the device is in portrait mode, where only shows one portrait photo, // it will cause unnecessary scaling. To reduce this effect, always requesting // the landscape display size. - // TODO(b/172075868): Support tiling in portrait mode. gfx::Size display_size_px = GetDisplaySizeInPixel(); const int width = std::max(display_size_px.width(), display_size_px.height()); const int height =
diff --git a/ash/ambient/model/ambient_backend_model.cc b/ash/ambient/model/ambient_backend_model.cc index 268c53f..140e981 100644 --- a/ash/ambient/model/ambient_backend_model.cc +++ b/ash/ambient/model/ambient_backend_model.cc
@@ -8,10 +8,73 @@ #include "ash/ambient/model/ambient_backend_model_observer.h" #include "ash/public/cpp/ambient/ambient_ui_model.h" +#include "base/containers/flat_map.h" #include "base/logging.h" namespace ash { +namespace { +int TypeToIndex(AmbientModeTopicType topic_type) { + int index = static_cast<int>(topic_type); + DCHECK_GE(index, 0); + return index; +} + +AmbientModeTopicType IndexToType(int index) { + AmbientModeTopicType topic_type = static_cast<AmbientModeTopicType>(index); + return topic_type; +} + +std::vector<AmbientModeTopic> CreatePairedTopics( + const std::vector<AmbientModeTopic>& topics) { + // We pair two topics if: + // 1. They are in the landscape orientation. + // 2. They are in the same category; + base::flat_map<int, std::vector<int>> topics_by_type; + std::vector<AmbientModeTopic> paired_topics; + int topic_idx = -1; + for (const auto& topic : topics) { + topic_idx++; + + // If a photo is portrait, it is from Google Photos and should have a paired + // photo already. + if (topic.is_portrait) { + paired_topics.emplace_back(topic); + continue; + } + + int type_index = TypeToIndex(topic.topic_type); + auto it = topics_by_type.find(type_index); + if (it == topics_by_type.end()) { + topics_by_type.insert({type_index, {topic_idx}}); + } else { + it->second.emplace_back(topic_idx); + } + } + + // We merge two unpaired topics to create a new topic with related images. + for (auto it = topics_by_type.begin(); it < topics_by_type.end(); ++it) { + size_t idx = 0; + while (idx < it->second.size() - 1) { + AmbientModeTopic paired_topic; + const auto& topic_1 = topics[it->second[idx]]; + const auto& topic_2 = topics[it->second[idx + 1]]; + paired_topic.url = topic_1.url; + paired_topic.related_image_url = topic_2.url; + + paired_topic.details = topic_1.details; + paired_topic.related_details = topic_2.details; + paired_topic.topic_type = IndexToType(it->first); + paired_topic.is_portrait = topic_1.is_portrait; + paired_topics.emplace_back(paired_topic); + + idx += 2; + } + } + return paired_topics; +} +} // namespace + // PhotoWithDetails------------------------------------------------------------ PhotoWithDetails::PhotoWithDetails() = default; @@ -29,6 +92,9 @@ void PhotoWithDetails::Clear() { photo = gfx::ImageSkia(); details = std::string(); + related_photo = gfx::ImageSkia(); + related_details = std::string(); + is_portrait = false; } bool PhotoWithDetails::IsNull() const { @@ -50,7 +116,8 @@ void AmbientBackendModel::AppendTopics( const std::vector<AmbientModeTopic>& topics) { - topics_.insert(topics_.end(), topics.begin(), topics.end()); + std::vector<AmbientModeTopic> related_topics = CreatePairedTopics(topics); + topics_.insert(topics_.end(), related_topics.begin(), related_topics.end()); NotifyTopicsChanged(); }
diff --git a/ash/ambient/model/ambient_backend_model.h b/ash/ambient/model/ambient_backend_model.h index d47cc80..e2842759 100644 --- a/ash/ambient/model/ambient_backend_model.h +++ b/ash/ambient/model/ambient_backend_model.h
@@ -37,8 +37,11 @@ gfx::ImageSkia photo; gfx::ImageSkia related_photo; std::string details; + std::string related_details; // Hash of this image data. Used for de-duping images. std::string hash; + // Whether the image is portrait or not. + bool is_portrait = false; }; // Stores necessary information fetched from the backdrop server to render
diff --git a/ash/ambient/model/ambient_backend_model_unittest.cc b/ash/ambient/model/ambient_backend_model_unittest.cc index b47b9aff..857c7ae 100644 --- a/ash/ambient/model/ambient_backend_model_unittest.cc +++ b/ash/ambient/model/ambient_backend_model_unittest.cc
@@ -34,6 +34,23 @@ MOCK_METHOD(void, OnImageAdded, (), (override)); }; +ash::AmbientModeTopic CreateTopic(const std::string& url, + const std::string& details, + bool is_portrait, + const std::string& related_url, + const std::string& related_details, + AmbientModeTopicType topic_type) { + ash::AmbientModeTopic topic; + topic.url = url; + topic.details = details; + topic.is_portrait = is_portrait; + topic.topic_type = topic_type; + + topic.related_image_url = related_url; + topic.related_details = related_details; + return topic; +} + } // namespace class AmbientBackendModelTest : public AshTestBase { @@ -94,6 +111,14 @@ return ambient_backend_model_.get(); } + void AppendTopics(const std::vector<AmbientModeTopic>& topics) { + ambient_backend_model_->AppendTopics(topics); + } + + const std::vector<AmbientModeTopic>& fetched_topics() { + return ambient_backend_model_->topics(); + } + PhotoWithDetails GetNextImage() { return ambient_backend_model_->GetNextImage(); } @@ -213,4 +238,148 @@ AddNTestImages(3); } +TEST_F(AmbientBackendModelTest, ShouldPairLandscapeImages) { + // Set up 3 featured landscape photos and 3 personal landscape photos. + // Will output 2 paired topics, having one in featured and personal category. + std::vector<ash::AmbientModeTopic> topics; + topics.emplace_back(CreateTopic( + /*url=*/"topic1_url", /*details=*/"topic1_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kPersonal)); + topics.emplace_back(CreateTopic( + /*url=*/"topic2_url", /*details=*/"topic2_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kPersonal)); + topics.emplace_back(CreateTopic( + /*url=*/"topic3_url", /*details=*/"topic3_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"topic3_related_details", + AmbientModeTopicType::kPersonal)); + + topics.emplace_back(CreateTopic( + /*url=*/"topic4_url", /*details=*/"topic4_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + topics.emplace_back(CreateTopic( + /*url=*/"topic5_url", /*details=*/"topic5_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + topics.emplace_back(CreateTopic( + /*url=*/"topic6_url", /*details=*/"topic6_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + + AppendTopics(topics); + EXPECT_EQ(fetched_topics().size(), 2u); + + EXPECT_EQ(fetched_topics()[0].url, "topic1_url"); + EXPECT_EQ(fetched_topics()[0].details, "topic1_details"); + EXPECT_FALSE(fetched_topics()[0].is_portrait); + EXPECT_EQ(fetched_topics()[0].topic_type, AmbientModeTopicType::kPersonal); + EXPECT_EQ(fetched_topics()[0].related_image_url, "topic2_url"); + EXPECT_EQ(fetched_topics()[0].related_details, "topic2_details"); + + EXPECT_EQ(fetched_topics()[1].url, "topic4_url"); + EXPECT_EQ(fetched_topics()[1].details, "topic4_details"); + EXPECT_FALSE(fetched_topics()[1].is_portrait); + EXPECT_EQ(fetched_topics()[1].topic_type, AmbientModeTopicType::kFeatured); + EXPECT_EQ(fetched_topics()[1].related_image_url, "topic5_url"); + EXPECT_EQ(fetched_topics()[1].related_details, "topic5_details"); +} + +TEST_F(AmbientBackendModelTest, ShouldNotPairPortraitImages) { + // Set up 3 featured landscape photos and 3 personal portrait photos. + // Will output 4 topics, having one in featured, and 3 in personal category. + std::vector<ash::AmbientModeTopic> topics; + topics.emplace_back(CreateTopic( + /*url=*/"topic1_url", /*details=*/"topic1_details", /*is_portrait=*/true, + /*related_url=*/"topic1_related_url", + /*related_details=*/"topic1_related_details", + AmbientModeTopicType::kPersonal)); + topics.emplace_back(CreateTopic( + /*url=*/"topic2_url", /*details=*/"topic2_details", /*is_portrait=*/true, + /*related_url=*/"topic2_related_url", + /*related_details=*/"topic2_related_details", + AmbientModeTopicType::kPersonal)); + topics.emplace_back(CreateTopic( + /*url=*/"topic3_url", /*details=*/"topic3_details", /*is_portrait=*/true, + /*related_url=*/"topic3_related_url", + /*related_details=*/"topic3_related_details", + AmbientModeTopicType::kPersonal)); + + topics.emplace_back(CreateTopic( + /*url=*/"topic4_url", /*details=*/"topic4_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + topics.emplace_back(CreateTopic( + /*url=*/"topic5_url", /*details=*/"topic5_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + topics.emplace_back(CreateTopic( + /*url=*/"topic6_url", /*details=*/"topic6_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + + AppendTopics(topics); + EXPECT_EQ(fetched_topics().size(), 4u); + + EXPECT_EQ(fetched_topics()[0].url, "topic1_url"); + EXPECT_EQ(fetched_topics()[0].details, "topic1_details"); + EXPECT_TRUE(fetched_topics()[0].is_portrait); + EXPECT_EQ(fetched_topics()[0].topic_type, AmbientModeTopicType::kPersonal); + EXPECT_EQ(fetched_topics()[0].related_image_url, "topic1_related_url"); + EXPECT_EQ(fetched_topics()[0].related_details, "topic1_related_details"); + + EXPECT_EQ(fetched_topics()[1].url, "topic2_url"); + EXPECT_EQ(fetched_topics()[1].details, "topic2_details"); + EXPECT_TRUE(fetched_topics()[1].is_portrait); + EXPECT_EQ(fetched_topics()[1].topic_type, AmbientModeTopicType::kPersonal); + EXPECT_EQ(fetched_topics()[1].related_image_url, "topic2_related_url"); + EXPECT_EQ(fetched_topics()[1].related_details, "topic2_related_details"); + + EXPECT_EQ(fetched_topics()[2].url, "topic3_url"); + EXPECT_EQ(fetched_topics()[2].details, "topic3_details"); + EXPECT_TRUE(fetched_topics()[2].is_portrait); + EXPECT_EQ(fetched_topics()[2].topic_type, AmbientModeTopicType::kPersonal); + EXPECT_EQ(fetched_topics()[2].related_image_url, "topic3_related_url"); + EXPECT_EQ(fetched_topics()[2].related_details, "topic3_related_details"); + + EXPECT_EQ(fetched_topics()[3].url, "topic4_url"); + EXPECT_EQ(fetched_topics()[3].details, "topic4_details"); + EXPECT_FALSE(fetched_topics()[3].is_portrait); + EXPECT_EQ(fetched_topics()[3].topic_type, AmbientModeTopicType::kFeatured); + EXPECT_EQ(fetched_topics()[3].related_image_url, "topic5_url"); + EXPECT_EQ(fetched_topics()[3].related_details, "topic5_details"); +} + +TEST_F(AmbientBackendModelTest, + ShouldNotPairIfNoTwoLandscapeImagesInOneCategory) { + // Set up 1 personal landscape photo, 1 personal portrait photo, and 1 + // featured landscape photos. Will output 1 topic of 1 personal portrait + // photo. + std::vector<ash::AmbientModeTopic> topics; + topics.emplace_back(CreateTopic( + /*url=*/"topic1_url", /*details=*/"topic1_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kPersonal)); + topics.emplace_back(CreateTopic( + /*url=*/"topic2_url", /*details=*/"topic2_details", /*is_portrait=*/true, + /*related_url=*/"topic2_related_url", + /*related_details=*/"topic2_related_details", + AmbientModeTopicType::kPersonal)); + topics.emplace_back(CreateTopic( + /*url=*/"topic3_url", /*details=*/"topic3_details", /*is_portrait=*/false, + /*related_url=*/"", + /*related_details=*/"", AmbientModeTopicType::kFeatured)); + + AppendTopics(topics); + EXPECT_EQ(fetched_topics().size(), 1u); + EXPECT_EQ(fetched_topics()[0].url, "topic2_url"); + EXPECT_EQ(fetched_topics()[0].details, "topic2_details"); + EXPECT_TRUE(fetched_topics()[0].is_portrait); + EXPECT_EQ(fetched_topics()[0].topic_type, AmbientModeTopicType::kPersonal); + EXPECT_EQ(fetched_topics()[0].related_image_url, "topic2_related_url"); + EXPECT_EQ(fetched_topics()[0].related_details, "topic2_related_details"); +} + } // namespace ash
diff --git a/ash/ambient/proto/BUILD.gn b/ash/ambient/proto/BUILD.gn new file mode 100644 index 0000000..709ad3c --- /dev/null +++ b/ash/ambient/proto/BUILD.gn
@@ -0,0 +1,9 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//third_party/protobuf/proto_library.gni") + +proto_library("proto") { + sources = [ "photo_cache_entry.proto" ] +}
diff --git a/ash/ambient/proto/photo_cache_entry.proto b/ash/ambient/proto/photo_cache_entry.proto new file mode 100644 index 0000000..b0e3d2a --- /dev/null +++ b/ash/ambient/proto/photo_cache_entry.proto
@@ -0,0 +1,28 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package ambient; + +// Contains image and attributes. +message Photo { + // Content of the photo. + optional bytes image = 1; + + // Details of the photo. + optional string details = 2; + + // Whether the uncropped photo is portrait. + optional bool is_portrait = 3 [default = false]; +} + +// Contains two of ambient photos. +message PhotoCacheEntry { + optional Photo primary_photo = 1; + + optional Photo related_photo = 2; +}
diff --git a/ash/ambient/test/ambient_ash_test_base.cc b/ash/ambient/test/ambient_ash_test_base.cc index d7582d8c..8bc9a57 100644 --- a/ash/ambient/test/ambient_ash_test_base.cc +++ b/ash/ambient/test/ambient_ash_test_base.cc
@@ -13,6 +13,7 @@ #include "ash/ambient/ambient_constants.h" #include "ash/ambient/ambient_photo_cache.h" #include "ash/ambient/ambient_photo_controller.h" +#include "ash/ambient/proto/photo_cache_entry.pb.h" #include "ash/ambient/test/ambient_ash_test_helper.h" #include "ash/ambient/ui/ambient_background_image_view.h" #include "ash/ambient/ui/ambient_container_view.h" @@ -53,12 +54,12 @@ ~TestAmbientPhotoCacheImpl() override = default; // AmbientPhotoCache: - void DownloadPhoto(const std::string& url, - base::OnceCallback<void(std::unique_ptr<std::string>)> - callback) override { + void DownloadPhoto( + const std::string& url, + base::OnceCallback<void(std::string&&)> callback) override { // Reply with a unique string each time to avoid check to skip loading // duplicate images. - std::unique_ptr<std::string> data = std::make_unique<std::string>( + std::string data = std::string( download_data_ ? *download_data_ : base::StringPrintf("test_image_%i", download_count_)); download_count_++; @@ -70,7 +71,6 @@ void DownloadPhotoToFile(const std::string& url, int cache_index, - bool is_related, base::OnceCallback<void(bool)> callback) override { if (!download_data_) { base::SequencedTaskRunnerHandle::Get()->PostTask( @@ -78,21 +78,18 @@ return; } - files_.insert(std::pair<int, PhotoCacheEntry>( - cache_index, - PhotoCacheEntry( - is_related ? nullptr - : std::make_unique<std::string>(*download_data_), - /*details=*/nullptr, - is_related ? std::make_unique<std::string>(*download_data_) - : nullptr))); + ::ambient::PhotoCacheEntry cache_entry; + cache_entry.mutable_primary_photo()->set_image(*download_data_); + + files_.insert( + std::pair<int, ::ambient::PhotoCacheEntry>(cache_index, cache_entry)); base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), /*success=*/true)); } void DecodePhoto( - std::unique_ptr<std::string> data, + const std::string& data, base::OnceCallback<void(const gfx::ImageSkia&)> callback) override { gfx::ImageSkia image = decoded_image_ ? *decoded_image_ @@ -106,39 +103,27 @@ FROM_HERE, base::BindOnce(std::move(callback), image)); } - void WriteFiles(int cache_index, - const std::string* const image, - const std::string* const details, - const std::string* const related_image, - base::OnceClosure callback) override { - files_.insert(std::pair<int, PhotoCacheEntry>( - cache_index, - PhotoCacheEntry( - image ? std::make_unique<std::string>(*image) : nullptr, - details ? std::make_unique<std::string>(*details) : nullptr, - related_image ? std::make_unique<std::string>(*related_image) - : nullptr))); + void WritePhotoCache(int cache_index, + const ::ambient::PhotoCacheEntry& cache_entry, + base::OnceClosure callback) override { + files_.insert( + std::pair<int, ::ambient::PhotoCacheEntry>(cache_index, cache_entry)); std::move(callback).Run(); } - void ReadFiles(int cache_index, - base::OnceCallback<void(PhotoCacheEntry)> callback) override { + void ReadPhotoCache(int cache_index, + ::ambient::PhotoCacheEntry* cache_entry, + base::OnceCallback<void()> callback) override { auto it = files_.find(cache_index); if (it == files_.end()) { - std::move(callback).Run(PhotoCacheEntry()); + std::move(callback).Run(); return; } - std::move(callback).Run(PhotoCacheEntry( - it->second.image ? std::make_unique<std::string>(*(it->second.image)) - : nullptr, - it->second.details - ? std::make_unique<std::string>(*(it->second.details)) - : nullptr, - it->second.related_image - ? std::make_unique<std::string>(*(it->second.related_image)) - : nullptr)); + *cache_entry = it->second; + std::move(callback).Run(); } + void Clear() override { download_count_ = 0; download_data_.reset(); @@ -158,7 +143,9 @@ void SetDecodedPhoto(const gfx::ImageSkia& image) { decoded_image_ = image; } - const std::map<int, PhotoCacheEntry>& get_files() { return files_; } + const std::map<int, ::ambient::PhotoCacheEntry>& get_files() { + return files_; + } private: int download_count_ = 0; @@ -171,7 +158,7 @@ // If set, will replay this image. absl::optional<gfx::ImageSkia> decoded_image_; - std::map<int, PhotoCacheEntry> files_; + std::map<int, ::ambient::PhotoCacheEntry> files_; }; AmbientAshTestBase::AmbientAshTestBase() @@ -309,6 +296,10 @@ photo_cache->SetDecodedPhotoSize(width, height); } +void AmbientAshTestBase::SetPhotoOrientation(bool portrait) { + backend_controller()->SetPhotoOrientation(portrait); +} + std::vector<AmbientBackgroundImageView*> AmbientAshTestBase::GetAmbientBackgroundImageViews() { std::vector<AmbientBackgroundImageView*> result; @@ -447,14 +438,15 @@ return token_controller()->GetTimeUntilReleaseForTesting(); } -const std::map<int, PhotoCacheEntry>& AmbientAshTestBase::GetCachedFiles() { +const std::map<int, ::ambient::PhotoCacheEntry>& +AmbientAshTestBase::GetCachedFiles() { auto* photo_cache = static_cast<TestAmbientPhotoCacheImpl*>( photo_controller()->get_photo_cache_for_testing()); return photo_cache->get_files(); } -const std::map<int, PhotoCacheEntry>& +const std::map<int, ::ambient::PhotoCacheEntry>& AmbientAshTestBase::GetBackupCachedFiles() { auto* photo_cache = static_cast<TestAmbientPhotoCacheImpl*>( photo_controller()->get_backup_photo_cache_for_testing());
diff --git a/ash/ambient/test/ambient_ash_test_base.h b/ash/ambient/test/ambient_ash_test_base.h index 6e92cb0..816756c5 100644 --- a/ash/ambient/test/ambient_ash_test_base.h +++ b/ash/ambient/test/ambient_ash_test_base.h
@@ -95,6 +95,8 @@ // Set the size of the next image that will be loaded. void SetDecodedPhotoSize(int width, int height); + void SetPhotoOrientation(bool portrait); + // Advance the task environment timer to expire the lock screen inactivity // timer. void FastForwardToLockScreenTimeout(); @@ -141,8 +143,8 @@ // Returns the media string view for the default display. MediaStringView* GetMediaStringView(); - const std::map<int, PhotoCacheEntry>& GetCachedFiles(); - const std::map<int, PhotoCacheEntry>& GetBackupCachedFiles(); + const std::map<int, ::ambient::PhotoCacheEntry>& GetCachedFiles(); + const std::map<int, ::ambient::PhotoCacheEntry>& GetBackupCachedFiles(); AmbientController* ambient_controller();
diff --git a/ash/ambient/ui/ambient_background_image_view.cc b/ash/ambient/ui/ambient_background_image_view.cc index 43e5b712..6b0e9ac 100644 --- a/ash/ambient/ui/ambient_background_image_view.cc +++ b/ash/ambient/ui/ambient_background_image_view.cc
@@ -87,8 +87,11 @@ if (width() == 0) return; + UpdateLayout(); + // When bounds changes, recalculate the visibility of related image view. UpdateRelatedImageViewVisibility(); + UpdateImageDetails(details_, related_details_); } void AmbientBackgroundImageView::OnViewBoundsChanged( @@ -101,9 +104,11 @@ void AmbientBackgroundImageView::UpdateImage( const gfx::ImageSkia& image, - const gfx::ImageSkia& related_image) { + const gfx::ImageSkia& related_image, + bool is_portrait) { image_unscaled_ = image; related_image_unscaled_ = related_image; + is_portrait_ = is_portrait; UpdateGlanceableInfoPosition(); @@ -119,22 +124,32 @@ } void AmbientBackgroundImageView::UpdateImageDetails( - const std::u16string& details) { - ambient_info_view_->UpdateImageDetails(details); + const std::u16string& details, + const std::u16string& related_details) { + details_ = details; + related_details_ = related_details; + ambient_info_view_->UpdateImageDetails( + details, MustShowPairs() ? related_details : std::u16string()); } gfx::ImageSkia AmbientBackgroundImageView::GetCurrentImage() { return image_view_->GetImage(); } -gfx::Rect AmbientBackgroundImageView::GetImageBoundsForTesting() const { - return image_view_->GetImageBounds(); +gfx::Rect AmbientBackgroundImageView::GetImageBoundsInScreenForTesting() const { + gfx::Rect rect = image_view_->GetImageBounds(); + views::View::ConvertRectToScreen(image_view_, &rect); + return rect; } -gfx::Rect AmbientBackgroundImageView::GetRelatedImageBoundsForTesting() const { - return related_image_view_->GetVisible() - ? related_image_view_->GetImageBounds() - : gfx::Rect(); +gfx::Rect AmbientBackgroundImageView::GetRelatedImageBoundsInScreenForTesting() + const { + if (!related_image_view_->GetVisible()) + return gfx::Rect(); + + gfx::Rect rect = related_image_view_->GetImageBounds(); + views::View::ConvertRectToScreen(related_image_view_, &rect); + return rect; } void AmbientBackgroundImageView::ResetRelatedImageForTesting() { @@ -151,11 +166,9 @@ // Inits container for images. image_container_ = AddChildView(std::make_unique<views::View>()); - views::FlexLayout* image_layout = + image_layout_ = image_container_->SetLayoutManager(std::make_unique<views::FlexLayout>()); - image_layout->SetOrientation(views::LayoutOrientation::kHorizontal); - image_layout->SetMainAxisAlignment(views::LayoutAlignment::kCenter); - image_layout->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); + image_view_ = image_container_->AddChildView(std::make_unique<views::ImageView>()); // Set a place holder size for Flex layout to assign bounds. @@ -171,9 +184,6 @@ kUnboundedScaleToZero); observed_views_.AddObservation(related_image_view_); - // Set spacing between two images. - related_image_view_->SetProperty( - views::kMarginsKey, gfx::Insets(0, kMarginLeftOfRelatedImageDip, 0, 0)); AddChildView(std::make_unique<AmbientShieldView>()); @@ -243,9 +253,28 @@ } } +void AmbientBackgroundImageView::UpdateLayout() { + if (width() > height()) { + image_layout_->SetOrientation(views::LayoutOrientation::kHorizontal); + + // Set spacing between two images. + related_image_view_->SetProperty( + views::kMarginsKey, gfx::Insets(0, kMarginLeftOfRelatedImageDip, 0, 0)); + } else { + image_layout_->SetOrientation(views::LayoutOrientation::kVertical); + + // Set spacing between two images. + related_image_view_->SetProperty( + views::kMarginsKey, gfx::Insets(kMarginLeftOfRelatedImageDip, 0, 0, 0)); + } + + image_layout_->SetMainAxisAlignment(views::LayoutAlignment::kCenter); + image_layout_->SetCrossAxisAlignment(views::LayoutAlignment::kStretch); +} + bool AmbientBackgroundImageView::UpdateRelatedImageViewVisibility() { const bool did_show_pair = related_image_view_->GetVisible(); - const bool show_pair = IsLandscapeOrientation() && HasPairedImages(); + const bool show_pair = MustShowPairs() && HasPairedImages(); related_image_view_->SetVisible(show_pair); return did_show_pair != show_pair; } @@ -268,8 +297,11 @@ image_view->ResetImageSize(); } -bool AmbientBackgroundImageView::IsLandscapeOrientation() const { - return width() > height(); +bool AmbientBackgroundImageView::MustShowPairs() const { + const bool landscape_mode_portrait_image = width() > height() && is_portrait_; + const bool portrait_mode_landscape_image = + width() < height() && !is_portrait_; + return landscape_mode_portrait_image || portrait_mode_landscape_image; } bool AmbientBackgroundImageView::HasPairedImages() const {
diff --git a/ash/ambient/ui/ambient_background_image_view.h b/ash/ambient/ui/ambient_background_image_view.h index 3f16cfe..414ff59 100644 --- a/ash/ambient/ui/ambient_background_image_view.h +++ b/ash/ambient/ui/ambient_background_image_view.h
@@ -12,6 +12,7 @@ #include "base/scoped_multi_source_observation.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/views/controls/image_view.h" +#include "ui/views/layout/flex_layout.h" #include "ui/views/view.h" #include "ui/views/view_observer.h" @@ -43,15 +44,17 @@ // Updates the display images. void UpdateImage(const gfx::ImageSkia& image, - const gfx::ImageSkia& related_image); + const gfx::ImageSkia& related_image, + bool is_portrait); - // Updates the details for the currently displayed image. - void UpdateImageDetails(const std::u16string& details); + // Updates the details for the currently displayed image(s). + void UpdateImageDetails(const std::u16string& details, + const std::u16string& related_details); gfx::ImageSkia GetCurrentImage(); - gfx::Rect GetImageBoundsForTesting() const; - gfx::Rect GetRelatedImageBoundsForTesting() const; + gfx::Rect GetImageBoundsInScreenForTesting() const; + gfx::Rect GetRelatedImageBoundsInScreenForTesting() const; void ResetRelatedImageForTesting(); private: @@ -59,12 +62,15 @@ void UpdateGlanceableInfoPosition(); + void UpdateLayout(); bool UpdateRelatedImageViewVisibility(); void SetResizedImage(views::ImageView* image_view, const gfx::ImageSkia& image_unscaled); - // Whether the device is in landscape orientation. - bool IsLandscapeOrientation() const; + // When show paired images: + // 1. The device is in landscape mode and the images are portrait. + // 2. The device is in portrait mode and the images are landscape. + bool MustShowPairs() const; bool HasPairedImages() const; @@ -73,6 +79,7 @@ // View to display current image(s) on ambient. Owned by the view hierarchy. views::View* image_container_ = nullptr; + views::FlexLayout* image_layout_ = nullptr; views::ImageView* image_view_ = nullptr; views::ImageView* related_image_view_ = nullptr; @@ -80,6 +87,11 @@ gfx::ImageSkia image_unscaled_; gfx::ImageSkia related_image_unscaled_; + std::u16string details_; + std::u16string related_details_; + + bool is_portrait_ = false; + AmbientInfoView* ambient_info_view_ = nullptr; MediaStringView* media_string_view_ = nullptr;
diff --git a/ash/ambient/ui/ambient_info_view.cc b/ash/ambient/ui/ambient_info_view.cc index abdacb9..110674ee 100644 --- a/ash/ambient/ui/ambient_info_view.cc +++ b/ash/ambient/ui/ambient_info_view.cc
@@ -29,6 +29,18 @@ constexpr int kDefaultFontSizeDip = 64; constexpr int kDetailsFontSizeDip = 13; +views::Label* AddLabel(views::View* parent) { + auto* label = parent->AddChildView(std::make_unique<views::Label>()); + label->SetAutoColorReadabilityEnabled(false); + label->SetEnabledColor(ambient::util::GetContentLayerColor( + AshColorProvider::ContentLayerType::kTextColorSecondary)); + label->SetFontList(ambient::util::GetDefaultFontlist().DeriveWithSizeDelta( + kDetailsFontSizeDip - kDefaultFontSizeDip)); + label->SetPaintToLayer(); + label->layer()->SetFillsBoundsOpaquely(false); + + return label; +} } // namespace AmbientInfoView::AmbientInfoView(AmbientViewDelegate* delegate) @@ -44,14 +56,22 @@ views::View::OnThemeChanged(); details_label_->SetShadows( ambient::util::GetTextShadowValues(GetNativeTheme())); + related_details_label_->SetShadows( + ambient::util::GetTextShadowValues(GetNativeTheme())); } -void AmbientInfoView::UpdateImageDetails(const std::u16string& details) { +void AmbientInfoView::UpdateImageDetails( + const std::u16string& details, + const std::u16string& related_details) { details_label_->SetText(details); + related_details_label_->SetText(related_details); + related_details_label_->SetVisible(!related_details.empty() && + details != related_details); } void AmbientInfoView::SetTextTransform(const gfx::Transform& transform) { details_label_->layer()->SetTransform(transform); + related_details_label_->layer()->SetTransform(transform); glanceable_info_view_->layer()->SetTransform(transform); } @@ -78,15 +98,8 @@ AddChildView(std::make_unique<GlanceableInfoView>(delegate_)); glanceable_info_view_->SetPaintToLayer(); - details_label_ = AddChildView(std::make_unique<views::Label>()); - details_label_->SetAutoColorReadabilityEnabled(false); - details_label_->SetEnabledColor(ambient::util::GetContentLayerColor( - AshColorProvider::ContentLayerType::kTextColorSecondary)); - details_label_->SetFontList( - ambient::util::GetDefaultFontlist().DeriveWithSizeDelta( - kDetailsFontSizeDip - kDefaultFontSizeDip)); - details_label_->SetPaintToLayer(); - details_label_->layer()->SetFillsBoundsOpaquely(false); + details_label_ = AddLabel(this); + related_details_label_ = AddLabel(this); } BEGIN_METADATA(AmbientInfoView, views::View)
diff --git a/ash/ambient/ui/ambient_info_view.h b/ash/ambient/ui/ambient_info_view.h index 81f51c22..d29161d 100644 --- a/ash/ambient/ui/ambient_info_view.h +++ b/ash/ambient/ui/ambient_info_view.h
@@ -34,7 +34,8 @@ // views::View void OnThemeChanged() override; - void UpdateImageDetails(const std::u16string& details); + void UpdateImageDetails(const std::u16string& details, + const std::u16string& related_details); void SetTextTransform(const gfx::Transform& transform); @@ -46,6 +47,7 @@ GlanceableInfoView* glanceable_info_view_ = nullptr; views::Label* details_label_ = nullptr; + views::Label* related_details_label_ = nullptr; }; } // namespace ash
diff --git a/ash/ambient/ui/photo_view.cc b/ash/ambient/ui/photo_view.cc index 77a500d..1dd85649 100644 --- a/ash/ambient/ui/photo_view.cc +++ b/ash/ambient/ui/photo_view.cc
@@ -93,9 +93,11 @@ return; image_views_.at(image_index_) - ->UpdateImage(next_image.photo, next_image.related_photo); + ->UpdateImage(next_image.photo, next_image.related_photo, + next_image.is_portrait); image_views_.at(image_index_) - ->UpdateImageDetails(base::UTF8ToUTF16(next_image.details)); + ->UpdateImageDetails(base::UTF8ToUTF16(next_image.details), + base::UTF8ToUTF16(next_image.related_details)); image_index_ = 1 - image_index_; }
diff --git a/ash/ambient/ui/photo_view_unittest.cc b/ash/ambient/ui/photo_view_unittest.cc index 93de9e8..d68b1d2 100644 --- a/ash/ambient/ui/photo_view_unittest.cc +++ b/ash/ambient/ui/photo_view_unittest.cc
@@ -20,6 +20,7 @@ // screen is portrait. The top and bottom of the image will be cut off, as // the height of the image is taller than the height of the screen. TEST_F(AmbientPhotoViewTest, ShouldResizePortraitImageForPortraitScreen) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); UpdateDisplay("600x800"); @@ -32,18 +33,17 @@ // Image should be full width. Image height should extend above and below the // visible part of the screen. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-200, /*width=*/600, /*height=*/1200)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), gfx::Rect()); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); } -// Test that image is scaled to fill screen width when the image is landscape -// and the screen is portrait. There will be black bars to the top and bottom of -// the image, as the height of the image is less than the height of the screen. +// Test that two landscape images are scaled and filed to fill screen when the +// screen is portrait. TEST_F(AmbientPhotoViewTest, ShouldResizeLandscapeImageForPortraitScreen) { SetDecodedPhotoSize(/*width=*/30, /*height=*/20); - UpdateDisplay("600x800"); + UpdateDisplay("600x808"); ShowAmbientScreen(); @@ -51,16 +51,16 @@ auto* image_view = GetAmbientBackgroundImageView(); - // Image should be full width. Image should have equal empty space top and - // bottom. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/200, /*width=*/600, /*height=*/400)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), gfx::Rect()); + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/0, /*y=*/0, /*width=*/600, /*height=*/400)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/0, /*y=*/408, /*width=*/600, /*height=*/400)); } // Test that two portrait images are scaled and tiled to fill screen when the // screen is landscape. TEST_F(AmbientPhotoViewTest, ShouldTileTwoPortraitImagesForLandscapeScreen) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); UpdateDisplay("808x600"); @@ -75,10 +75,10 @@ // spaing in between. // Image should be full width. Image height should extend above and below the // visible part of the view. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/408, /*y=*/-100, /*width=*/400, /*height=*/800)); } // Test that two portrait images are scaled and tiled to fill screen when the @@ -86,6 +86,7 @@ // pixel. TEST_F(AmbientPhotoViewTest, ShouldTileTwoPortraitImagesForLandscapeScreenWithOddWidth) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); constexpr int kScreenWidth = 809; @@ -107,20 +108,19 @@ const int image_width = (kScreenWidth - kMarginLeftOfRelatedImageDip + 1) / 2; const int image_height = 20 * image_width / 10; const int y = (kScreenHeight - image_height) / 2; - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/y, /*width=*/image_width, /*height=*/image_height)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/409, /*y=*/-100, /*width=*/400, /*height=*/800)); } -// Test that landscape images can be tiled when screen is landscape as long as -// they are related. +// Test that only show one landscape image when screen is landscape. TEST_F(AmbientPhotoViewTest, ShouldNotTileTwoLandscapeImagesForLandscapeScreen) { SetDecodedPhotoSize(/*width=*/20, /*height=*/10); - UpdateDisplay("808x600"); + UpdateDisplay("800x600"); ShowAmbientScreen(); @@ -128,19 +128,19 @@ auto* image_view = GetAmbientBackgroundImageView(); - // Show two landscape image. + // Show one landscape image. // Image should be full height. Image width should extend equally to the left // and right of the visible part of the screen. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/200, /*width=*/400, /*height=*/200)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/200, /*width=*/400, /*height=*/200)); + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/-200, /*y=*/0, /*width=*/1200, /*height=*/600)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); } // Test that only have one available image will not be tiled when screen is // landscape. TEST_F(AmbientPhotoViewTest, ShouldNotTileIfRelatedImageIsNullForLandscapeScreen) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); UpdateDisplay("800x600"); @@ -160,9 +160,9 @@ // Only show one portrait image. // Image should be full height. Image should have equal empty space left and // right. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/254, /*y=*/0, /*width=*/300, /*height=*/600)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), gfx::Rect()); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); } // Test that image is scaled to fill screen height when the image is landscape @@ -188,14 +188,16 @@ // Image should be full height. Image width should extend equally to the left // and right of the visible part of the screen. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/-46, /*y=*/0, /*width=*/900, /*height=*/600)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), gfx::Rect()); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); } // Test that when rotates to portrait screen, will dynamically only show one // portrait image. -TEST_F(AmbientPhotoViewTest, ShouldNotTileWhenRotateToPortraitScreen) { +TEST_F(AmbientPhotoViewTest, + ShouldNotTilePortraitImagesWhenRotateToPortraitScreen) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); UpdateDisplay("808x600"); @@ -210,24 +212,57 @@ // spaing in between. // Image should be full width. Image height should extend above and below the // visible part of the view. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/408, /*y=*/-100, /*width=*/400, /*height=*/800)); // Rotate screen. UpdateDisplay("600x808"); // Only one image will show. // Image should be full width. Image height should extend above and below the // visible part of the screen. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-196, /*width=*/600, /*height=*/1200)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), gfx::Rect()); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); +} + +// Test that when rotates to portrait screen, will dynamically show two paired +// landscape images. +TEST_F(AmbientPhotoViewTest, + ShouldTileLandscapeImagesWhenRotateToPortraitScreen) { + SetDecodedPhotoSize(/*width=*/20, /*height=*/10); + + UpdateDisplay("808x600"); + + ShowAmbientScreen(); + + FastForwardToNextImage(); + + auto* image_view = GetAmbientBackgroundImageView(); + + // Will show one landscape image. + // Image should be full height. Image height should extend left and right the + // visible part of the view. + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/-196, /*y=*/0, /*width=*/1200, /*height=*/600)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); + + // Rotate screen. + UpdateDisplay("600x808"); + // Will show paired landscape images. + // Image should be full height. Image height should extend left and right the + // visible part of the screen. + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/-100, /*y=*/0, /*width=*/800, /*height=*/400)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/-100, /*y=*/408, /*width=*/800, /*height=*/400)); } // Test that when rotates to landscape screen, will dynamically tile two // portrait images. TEST_F(AmbientPhotoViewTest, ShouldTileWhenRotateToLandscapeScreen) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); UpdateDisplay("600x808"); @@ -241,9 +276,9 @@ // Only one image will show. // Image should be full width. Image height should extend above and below the // visible part of the screen. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-196, /*width=*/600, /*height=*/1200)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), gfx::Rect()); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), gfx::Rect()); // Rotate screen. UpdateDisplay("808x600"); @@ -252,14 +287,15 @@ // spaing in between. // Image should be full width. Image height should extend above and below the // visible part of the view. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/408, /*y=*/-100, /*width=*/400, /*height=*/800)); } // Test that two protrat images will resize when bounds changes in landscape. TEST_F(AmbientPhotoViewTest, ShouldResizeTiledPortraitImagesWhenBoundsChanged) { + SetPhotoOrientation(/*portrait=*/true); SetDecodedPhotoSize(/*width=*/10, /*height=*/20); UpdateDisplay("808x600"); @@ -274,10 +310,10 @@ // spaing in between. // Image should be full width. Image height should extend above and below the // visible part of the view. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/-100, /*width=*/400, /*height=*/800)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/408, /*y=*/-100, /*width=*/400, /*height=*/800)); // Bounds changes so that image will be shown in portrait view. UpdateDisplay("508x200"); @@ -286,10 +322,11 @@ // spaing in between. // Image should be full height. Image should have equal empty space left and // right. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/75, /*y=*/0, /*width=*/100, /*height=*/200)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/75, /*y=*/0, /*width=*/100, /*height=*/200)); + ASSERT_EQ( + image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/(258 + 75), /*y=*/0, /*width=*/100, /*height=*/200)); // Bounds changes so that image will be shown in portrait view. UpdateDisplay("308x200"); @@ -298,10 +335,10 @@ // spaing in between. // Image should be full width. Image height should extend above and below the // visible part of the view. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/-50, /*width=*/150, /*height=*/300)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/-50, /*width=*/150, /*height=*/300)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/158, /*y=*/-50, /*width=*/150, /*height=*/300)); // Bounds changes to exact aspect ratio of the image. UpdateDisplay("208x200"); @@ -309,10 +346,10 @@ // Will tile two portrait images. Each image will fill 100x200 area with 8px // spaing in between. // Image should be full width and height. - ASSERT_EQ(image_view->GetImageBoundsForTesting(), + ASSERT_EQ(image_view->GetImageBoundsInScreenForTesting(), gfx::Rect(/*x=*/0, /*y=*/0, /*width=*/100, /*height=*/200)); - ASSERT_EQ(image_view->GetRelatedImageBoundsForTesting(), - gfx::Rect(/*x=*/0, /*y=*/0, /*width=*/100, /*height=*/200)); + ASSERT_EQ(image_view->GetRelatedImageBoundsInScreenForTesting(), + gfx::Rect(/*x=*/108, /*y=*/0, /*width=*/100, /*height=*/200)); } } // namespace ash
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index d84dde5..7b26934 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -206,7 +206,7 @@ deps = [ ":app_list", "//base", - "//ui/base:base", + "//ui/base", "//ui/events", "//ui/gfx", "//ui/gfx/geometry", @@ -227,6 +227,7 @@ "bubble/app_list_bubble_event_filter_unittest.cc", "bubble/app_list_bubble_view_unittest.cc", "bubble/recent_apps_view_unittest.cc", + "bubble/scrollable_apps_grid_view_unittest.cc", "folder_image_unittest.cc", "model/app_list_item_list_unittest.cc", "model/app_list_model_unittest.cc",
diff --git a/ash/app_list/app_list_presenter_unittest.cc b/ash/app_list/app_list_presenter_unittest.cc index 5be6ef5..d546d79 100644 --- a/ash/app_list/app_list_presenter_unittest.cc +++ b/ash/app_list/app_list_presenter_unittest.cc
@@ -154,8 +154,9 @@ // This suite used to be called AppListPresenterDelegateTest. It's not called // AppListPresenterImplTest because that name was already taken. The two test // suite were not merged in order to maintain git blame history for this file. -class AppListPresenterTest : public AshTestBase, - public testing::WithParamInterface<bool> { +class AppListPresenterTest + : public AshTestBase, + public testing::WithParamInterface<std::tuple<bool, bool>> { public: AppListPresenterTest() = default; AppListPresenterTest(const AppListPresenterTest&) = delete; @@ -164,6 +165,8 @@ // testing::Test: void SetUp() override { + feature_list_.InitWithFeatureState( + app_list_features::kNewDragSpecInLauncher, std::get<1>(GetParam())); AppListView::SetShortAnimationForTesting(true); AshTestBase::SetUp(); @@ -184,7 +187,10 @@ } // Whether to run the test with mouse or gesture events. - bool TestMouseEventParam() { return GetParam(); } + bool TestMouseEventParam() const { return std::get<0>(GetParam()); } + + // Whether to run the test with mouse or gesture events. + bool GetTestFullscreen() const { return std::get<0>(GetParam()); } gfx::Point GetPointOutsideSearchbox() { // Ensures that the point satisfies the following conditions: @@ -293,6 +299,9 @@ ->GetWindowBoundsInScreen(); return dialog_bounds.y() - search_box_bounds.y(); } + + private: + base::test::ScopedFeatureList feature_list_; }; // Used to test app_list behavior with a populated apps_grid @@ -303,6 +312,8 @@ ~PopulatedAppListTest() override = default; void SetUp() override { + feature_list_.InitWithFeatureState( + app_list_features::kNewDragSpecInLauncher, GetParam()); AppListConfigProvider::Get().ResetForTesting(); AshTestBase::SetUp(); @@ -379,6 +390,8 @@ std::unique_ptr<test::AppListTestViewDelegate> app_list_test_delegate_; AppListView* app_list_view_ = nullptr; // Owned by native widget. AppsGridView* apps_grid_view_ = nullptr; // Owned by |app_list_view_|. + + base::test::ScopedFeatureList feature_list_; }; // Subclass of PopuplatedAppListTest which enables the animation and the virtual @@ -396,13 +409,26 @@ } }; -// Instantiate the Boolean which is used to toggle mouse and touch events in -// the parameterized tests. -INSTANTIATE_TEST_SUITE_P(All, AppListPresenterTest, testing::Bool()); +// Instantiate the values in the parameterized tests. First boolean is used to +// toggle mouse and touch events and in some tests to toggle fullscreen mode +// tests. The second one toggles cardfied state feature enabled or disabled. +INSTANTIATE_TEST_SUITE_P(All, + AppListPresenterTest, + testing::Combine(testing::Bool(), testing::Bool())); + +// Instantiate the Boolean which is used to toggle cardified state in the +// parameterized tests. +INSTANTIATE_TEST_SUITE_P(All, PopulatedAppListTest, testing::Bool()); + +// Instantiate the Boolean which is used to toggle cardified state in the +// parameterized tests. +INSTANTIATE_TEST_SUITE_P(All, + PopulatedAppListWithVKEnabledTest, + testing::Bool()); // Verifies that context menu click should not activate the search box // (see https://crbug.com/941428). -TEST_F(AppListPresenterTest, RightClickSearchBoxInPeeking) { +TEST_P(AppListPresenterTest, RightClickSearchBoxInPeeking) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* app_list_view = GetAppListView(); gfx::Rect app_list_bounds = app_list_view->GetBoundsInScreen(); @@ -418,7 +444,7 @@ EXPECT_EQ(AppListViewState::kPeeking, app_list_view->app_list_state()); } -TEST_F(AppListPresenterTest, ReshownAppListResetsSearchBoxActivation) { +TEST_P(AppListPresenterTest, ReshownAppListResetsSearchBoxActivation) { // Activate the search box. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetEventGenerator()->GestureTapAt(GetPointInsideSearchbox()); @@ -436,7 +462,7 @@ // Tests that the SearchBox activation is reset after the AppList is hidden with // no animation from FULLSCREEN_SEARCH. -TEST_F(AppListPresenterTest, SideShelfAppListResetsSearchBoxActivationOnClose) { +TEST_P(AppListPresenterTest, SideShelfAppListResetsSearchBoxActivationOnClose) { // Set the shelf to one side, then show the AppList and activate the // searchbox. SetShelfAlignment(ShelfAlignment::kRight); @@ -461,7 +487,7 @@ // Verifies that tapping on the search box in tablet mode with animation and // zero state enabled should not bring Chrome crash (https://crbug.com/958267). -TEST_F(AppListPresenterTest, ClickSearchBoxInTabletMode) { +TEST_P(AppListPresenterTest, ClickSearchBoxInTabletMode) { EnableTabletMode(true); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); @@ -489,7 +515,7 @@ GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); } -TEST_F(AppListPresenterTest, RemoveSuggestionShowsConfirmDialog) { +TEST_P(AppListPresenterTest, RemoveSuggestionShowsConfirmDialog) { ShowZeroStateSearchInHalfState(); // Mark the suggested content info as dismissed so that it does not interfere @@ -577,7 +603,7 @@ EXPECT_EQ(expected_actions, invoked_actions); } -TEST_F(AppListPresenterTest, RemoveSuggestionUsingLongTap) { +TEST_P(AppListPresenterTest, RemoveSuggestionUsingLongTap) { ShowZeroStateSearchInHalfState(); // Add a zero state suggestion results - the result that will be tested is in @@ -645,7 +671,7 @@ EXPECT_EQ(expected_actions, invoked_actions); } -TEST_F(AppListPresenterTest, RemoveSuggestionDialogAnimatesWithAppListView) { +TEST_P(AppListPresenterTest, RemoveSuggestionDialogAnimatesWithAppListView) { ShowZeroStateSearchInHalfState(); // Add a zero state suggestion result. @@ -690,7 +716,7 @@ EXPECT_EQ(gfx::RectF(initial_dialog_bounds), current_bounds); } -TEST_F(AppListPresenterTest, +TEST_P(AppListPresenterTest, RemoveSuggestionDialogBoundsUpdateWithAppListState) { ShowZeroStateSearchInHalfState(); @@ -729,7 +755,7 @@ GetSearchResultsAnchoredDialogTopOffset(confirmation_dialog)); } -TEST_F(AppListPresenterTest, +TEST_P(AppListPresenterTest, TransitionToAppsContainerClosesRemoveSuggestionDialog) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListView()->SetState(AppListViewState::kFullscreenAllApps); @@ -768,7 +794,7 @@ widget_close_waiter.Wait(); } -TEST_F(AppListPresenterTest, RemoveSuggestionDialogBoundsUpdateWhenVKHidden) { +TEST_P(AppListPresenterTest, RemoveSuggestionDialogBoundsUpdateWhenVKHidden) { // Enable virtual keyboard for this test. KeyboardController* const keyboard_controller = Shell::Get()->keyboard_controller(); @@ -823,7 +849,7 @@ // Verifies that the downward mouse drag on AppsGridView's first page should // be handled by AppList. -TEST_F(PopulatedAppListTest, MouseDragAppsGridViewHandledByAppList) { +TEST_P(PopulatedAppListTest, MouseDragAppsGridViewHandledByAppList) { InitializeAppsGrid(); app_list_test_model_->PopulateApps(2); @@ -847,7 +873,7 @@ // Verifies that the upward mouse drag on AppsGridView's first page should // be handled by PaginationController. -TEST_F(PopulatedAppListTest, +TEST_P(PopulatedAppListTest, MouseDragAppsGridViewHandledByPaginationController) { InitializeAppsGrid(); app_list_test_model_->PopulateApps(apps_grid_test_api_->TilesPerPage() + 1); @@ -880,7 +906,7 @@ // Tests that mouse app list item drag is cancelled when mouse capture is lost // (e.g. on screen rotation). -TEST_F(PopulatedAppListTest, CancelItemDragOnMouseCaptureLoss) { +TEST_P(PopulatedAppListTest, CancelItemDragOnMouseCaptureLoss) { InitializeAppsGrid(); app_list_test_model_->PopulateApps(apps_grid_test_api_->TilesPerPage() + 1); @@ -914,7 +940,7 @@ // Tests that apps grid item layers are not destroyed immediately after item // drag ends. -TEST_F(PopulatedAppListTest, +TEST_P(PopulatedAppListTest, ItemLayersNotDestroyedDuringBoundsAnimationAfterDrag) { InitializeAppsGrid(); const int kItemCount = 5; @@ -945,14 +971,14 @@ // After the drag is released, the item bounds should animate to their final // bounds. - EXPECT_TRUE(apps_grid_view_->bounds_animator_for_testing()->IsAnimating()); + EXPECT_TRUE(apps_grid_view_->IsAnimationRunningForTest()); for (int i = 0; i < kItemCount; ++i) { views::View* item_view = apps_grid_view_->view_model()->view_at(i); EXPECT_TRUE(item_view->layer()) << "at " << i; } // Layers should be destroyed once the bounds animation completes. - apps_grid_view_->bounds_animator_for_testing()->Cancel(); + apps_grid_view_->CancelAnimationsForTest(); for (int i = 0; i < kItemCount; ++i) { views::View* item_view = apps_grid_view_->view_model()->view_at(i); EXPECT_FALSE(item_view->layer()) << "at " << i; @@ -961,7 +987,7 @@ // Tests that apps grid item drag operation can continue normally after display // rotation (and app list config change). -TEST_F(PopulatedAppListTest, ScreenRotationDuringAppsGridItemDrag) { +TEST_P(PopulatedAppListTest, ScreenRotationDuringAppsGridItemDrag) { // Set the display dimensions so rotation also changes the app list config. UpdateDisplay("1200x600"); @@ -1003,7 +1029,7 @@ // Tests screen rotation during apps grid item drag where the drag item ends up // in page-scroll area. Tests that the apps grid page scrolls without a crash, // and that releasing drag does not change the item position in the model. -TEST_F(PopulatedAppListTest, +TEST_P(PopulatedAppListTest, ScreenRotationDuringAppsGridItemDragWithPageScroll) { // Set the display dimensions so rotation also changes the app list config. UpdateDisplay("1200x600"); @@ -1046,7 +1072,7 @@ // Tests screen rotation while app list folder item is in progress, and the item // remains in the folder bounds during the drag. -TEST_F(PopulatedAppListTest, ScreenRotationDuringFolderItemDrag) { +TEST_P(PopulatedAppListTest, ScreenRotationDuringFolderItemDrag) { // Set the display dimensions so rotation also changes the app list config. UpdateDisplay("1200x600"); @@ -1099,7 +1125,10 @@ // Tests that app list folder item reparenting drag (where a folder item is // dragged outside the folder bounds, and dropped within the apps grid) can // continue normally after screen rotation. -TEST_F(PopulatedAppListTest, ScreenRotationDuringAppsGridItemReparentDrag) { +TEST_P(PopulatedAppListTest, ScreenRotationDuringAppsGridItemReparentDrag) { + // TODO(anasalazar): Fix for cardified state. + if (GetParam()) + return; UpdateDisplay("1200x600"); InitializeAppsGrid(); @@ -1130,7 +1159,6 @@ EXPECT_TRUE( folder_view()->items_grid_view()->FireFolderItemReparentTimerForTest()); EXPECT_FALSE(AppListIsInFolderView()); - display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); display_manager()->SetDisplayRotation( display.id(), display::Display::ROTATE_270, @@ -1155,7 +1183,7 @@ } // Tests that app list folder item reparenting drag to another folder. -TEST_F(PopulatedAppListTest, AppsGridItemReparentToFolderDrag) { +TEST_P(PopulatedAppListTest, AppsGridItemReparentToFolderDrag) { UpdateDisplay("1200x600"); InitializeAppsGrid(); @@ -1205,7 +1233,7 @@ // Tests that an item can be removed just after creating a folder that contains // that item. See https://crbug.com/1083942 -TEST_F(PopulatedAppListTest, RemoveFolderItemAfterFolderCreation) { +TEST_P(PopulatedAppListTest, RemoveFolderItemAfterFolderCreation) { InitializeAppsGrid(); const int kItemCount = 5; app_list_test_model_->PopulateApps(kItemCount); @@ -1219,6 +1247,8 @@ event_generator->MoveMouseTo(dragged_view->GetBoundsInScreen().CenterPoint()); event_generator->PressLeftButton(); dragged_view->FireMouseDragTimerForTest(); + // Move mouse to switch to cardified state. + event_generator->MoveMouseBy(1, 1); event_generator->MoveMouseTo( apps_grid_view_->GetItemViewAt(3)->GetBoundsInScreen().CenterPoint()); EXPECT_TRUE(apps_grid_view_->FireFolderDroppingTimerForTest()); @@ -1246,7 +1276,6 @@ // Verify that item views have no layers after the folder has been opened. apps_grid_test_api_->WaitForItemMoveAnimationDone(); EXPECT_TRUE(AppListIsInFolderView()); - for (int i = 0; i < apps_grid_view_->view_model()->view_size(); ++i) { views::View* item_view = apps_grid_view_->view_model()->view_at(i); EXPECT_FALSE(item_view->layer()) << "at " << i; @@ -1268,7 +1297,7 @@ apps_grid_view_->GetWidget()->LayoutRootViewIfNecessary(); } -TEST_F(PopulatedAppListWithVKEnabledTest, +TEST_P(PopulatedAppListWithVKEnabledTest, TappingAppsGridClosesVirtualKeyboard) { InitializeAppsGrid(); app_list_test_model_->PopulateApps(2); @@ -1311,7 +1340,7 @@ // Tests that a folder item that is dragged to the page flip area and released // will discard empty pages in the apps grid. If an empty page is not discarded, // the apps grid crashes (See http://crbug.com/1100011). -TEST_F(PopulatedAppListTest, FolderItemDroppedRemovesBlankPage) { +TEST_P(PopulatedAppListTest, FolderItemDroppedRemovesBlankPage) { InitializeAppsGrid(); app_list_test_model_->CreateAndPopulateFolderWithApps(3); app_list_test_model_->PopulateApps(2); @@ -1356,7 +1385,7 @@ } // Tests that app list hides when focus moves to a normal window. -TEST_F(AppListPresenterTest, HideOnFocusOut) { +TEST_P(AppListPresenterTest, HideOnFocusOut) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -1368,7 +1397,7 @@ // Tests that app list remains visible when focus is moved to a different // window in kShellWindowId_AppListContainer. -TEST_F(AppListPresenterTest, RemainVisibleWhenFocusingToApplistContainer) { +TEST_P(AppListPresenterTest, RemainVisibleWhenFocusingToApplistContainer) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -1383,7 +1412,7 @@ } // Tests opening the app list on a secondary display, then deleting the display. -TEST_F(AppListPresenterTest, NonPrimaryDisplay) { +TEST_P(AppListPresenterTest, NonPrimaryDisplay) { // Set up a screen with two displays (horizontally adjacent). UpdateDisplay("1024x768,1024x768"); @@ -1403,7 +1432,7 @@ } // Tests updating display should not close the app list. -TEST_F(AppListPresenterTest, UpdateDisplayNotCloseAppList) { +TEST_P(AppListPresenterTest, UpdateDisplayNotCloseAppList) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -1416,7 +1445,7 @@ } // Tests the app list window's bounds under multi-displays environment. -TEST_F(AppListPresenterTest, AppListWindowBounds) { +TEST_P(AppListPresenterTest, AppListWindowBounds) { // Set up a screen with two displays (horizontally adjacent). UpdateDisplay("1024x768,1024x768"); const gfx::Size display_size(1024, 768); @@ -1457,7 +1486,7 @@ // Tests that the app list window's bounds and the search box bounds are updated // when the display bounds change. -TEST_F(AppListPresenterTest, AppListBoundsChangeForDisplayChange) { +TEST_P(AppListPresenterTest, AppListBoundsChangeForDisplayChange) { UpdateDisplay("1024x768"); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -1486,7 +1515,7 @@ // Tests that the app list window's bounds and the search box bounds in the half // state are updated when the display bounds change. -TEST_F(AppListPresenterTest, AppListBoundsChangeForDisplayChangeSearch) { +TEST_P(AppListPresenterTest, AppListBoundsChangeForDisplayChangeSearch) { UpdateDisplay("1024x768"); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -1516,7 +1545,7 @@ // Tests that the app list window's bounds and the search box bounds in the // fullscreen state are updated when the display bounds change. -TEST_F(AppListPresenterTest, AppListBoundsChangeForDisplayChangeFullscreen) { +TEST_P(AppListPresenterTest, AppListBoundsChangeForDisplayChangeFullscreen) { UpdateDisplay("1024x768"); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -1546,7 +1575,7 @@ // Tests that the app list window's bounds and the search box bounds in the // fullscreen search state are updated when the display bounds change. -TEST_F(AppListPresenterTest, +TEST_P(AppListPresenterTest, AppListBoundsChangeForDisplayChangeFullscreenSearch) { UpdateDisplay("1024x768"); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -1577,7 +1606,7 @@ } // Tests that the app list is not draggable in side shelf alignment. -TEST_F(AppListPresenterTest, SideShelfAlignmentDragDisabled) { +TEST_P(AppListPresenterTest, SideShelfAlignmentDragDisabled) { SetShelfAlignment(ShelfAlignment::kRight); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); const AppListView* app_list = GetAppListView(); @@ -1603,7 +1632,7 @@ // Tests that the app list initializes in fullscreen with side shelf alignment // and that the state transitions via text input act properly. -TEST_F(AppListPresenterTest, SideShelfAlignmentTextStateTransitions) { +TEST_P(AppListPresenterTest, SideShelfAlignmentTextStateTransitions) { SetShelfAlignment(ShelfAlignment::kLeft); // Open the app list with side shelf alignment, then check that it is in @@ -1629,7 +1658,7 @@ // Tests that the app list initializes in peeking with bottom shelf alignment // and that the state transitions via text input act properly. -TEST_F(AppListPresenterTest, BottomShelfAlignmentTextStateTransitions) { +TEST_P(AppListPresenterTest, BottomShelfAlignmentTextStateTransitions) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* app_list = GetAppListView(); EXPECT_FALSE(app_list->is_fullscreen()); @@ -1653,7 +1682,7 @@ // Tests that the app list initializes in fullscreen with tablet mode active // and that the state transitions via text input act properly. -TEST_F(AppListPresenterTest, TabletModeTextStateTransitions) { +TEST_P(AppListPresenterTest, TabletModeTextStateTransitions) { EnableTabletMode(true); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); @@ -1673,7 +1702,7 @@ } // Tests that the app list closes when tablet mode deactivates. -TEST_F(AppListPresenterTest, AppListClosesWhenLeavingTabletMode) { +TEST_P(AppListPresenterTest, AppListClosesWhenLeavingTabletMode) { EnableTabletMode(true); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); @@ -1700,7 +1729,7 @@ // Tests that the app list state responds correctly to tablet mode being // enabled while the app list is being shown with half launcher. -TEST_F(AppListPresenterTest, HalfToFullscreenWhenTabletModeIsActive) { +TEST_P(AppListPresenterTest, HalfToFullscreenWhenTabletModeIsActive) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -1718,7 +1747,7 @@ } // Tests that the app list view handles drag properly in laptop mode. -TEST_F(AppListPresenterTest, AppListViewDragHandler) { +TEST_P(AppListPresenterTest, AppListViewDragHandler) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -1785,7 +1814,7 @@ // Tests that the bottom shelf background is hidden when the app list is shown // in laptop mode. -TEST_F(AppListPresenterTest, ShelfBackgroundIsHiddenWhenAppListIsShown) { +TEST_P(AppListPresenterTest, ShelfBackgroundIsHiddenWhenAppListIsShown) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); ShelfLayoutManager* shelf_layout_manager = Shelf::ForWindow(Shell::GetRootWindowForDisplayId(GetPrimaryDisplayId())) @@ -1796,7 +1825,7 @@ // Tests the shelf background type is as expected when a window is created after // going to tablet mode. -TEST_F(AppListPresenterTest, ShelfBackgroundWithHomeLauncher) { +TEST_P(AppListPresenterTest, ShelfBackgroundWithHomeLauncher) { // Enter tablet mode to display the home launcher. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); EnableTabletMode(true); @@ -1816,7 +1845,7 @@ // Tests that app list understands shelf rounded corners state while animating // out and in, and that it keeps getting notified of shelf state changes if // close animation is interrupted by another show request. -TEST_F(AppListPresenterTest, AppListShownWhileClosing) { +TEST_P(AppListPresenterTest, AppListShownWhileClosing) { auto window = CreateTestWindow(); window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); @@ -1865,7 +1894,7 @@ // Tests how shelf state is updated as app list state changes with a maximized // window open. It verifies that the app list knows that the maximized shelf had // no rounded corners. -TEST_F(AppListPresenterTest, AppListWithMaximizedShelf) { +TEST_P(AppListPresenterTest, AppListWithMaximizedShelf) { auto window = CreateTestWindow(); window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); @@ -1914,7 +1943,7 @@ // Verifies the shelf background state changes when a window is maximized while // app list is shown. Verifies that AppList::shelf_has_rounded_corners() is // updated. -TEST_F(AppListPresenterTest, WindowMaximizedWithAppListShown) { +TEST_P(AppListPresenterTest, WindowMaximizedWithAppListShown) { auto window = CreateTestWindow(); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -1942,7 +1971,7 @@ // Tests that the bottom shelf is auto hidden when a window is fullscreened in // tablet mode (home launcher is shown behind). -TEST_F(AppListPresenterTest, ShelfAutoHiddenWhenFullscreen) { +TEST_P(AppListPresenterTest, ShelfAutoHiddenWhenFullscreen) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); EnableTabletMode(true); Shelf* shelf = @@ -2018,7 +2047,7 @@ // Tests that a keypress activates the searchbox and that clearing the // searchbox, the searchbox remains active. -TEST_F(AppListPresenterTest, KeyPressEnablesSearchBox) { +TEST_P(AppListPresenterTest, KeyPressEnablesSearchBox) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); ui::test::EventGenerator* generator = GetEventGenerator(); SearchBoxView* search_box_view = GetAppListView()->search_box_view(); @@ -2175,7 +2204,7 @@ // Tests that the shelf background displays/hides with bottom shelf // alignment. -TEST_F(AppListPresenterTest, ShelfBackgroundRespondsToAppListBeingShown) { +TEST_P(AppListPresenterTest, ShelfBackgroundRespondsToAppListBeingShown) { GetPrimaryShelf()->SetAlignment(ShelfAlignment::kBottom); // Show the app list, the shelf background should be transparent. @@ -2223,7 +2252,7 @@ } // Tests that the search box is set active with a whitespace query. -TEST_F(AppListPresenterTest, WhitespaceQuery) { +TEST_P(AppListPresenterTest, WhitespaceQuery) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); ui::test::EventGenerator* generator = GetEventGenerator(); @@ -2297,7 +2326,7 @@ // Tests that a drag to the bezel from Fullscreen/Peeking will close the app // list. TEST_P(AppListPresenterTest, DragToBezelClosesAppListFromFullscreenAndPeeking) { - const bool test_fullscreen = GetParam(); + const bool test_fullscreen = GetTestFullscreen(); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -2330,7 +2359,7 @@ DragToBezelClosesAppListFromFullscreenAndPeekingOnExternal) { UpdateDisplay("800x600,1000x768"); - const bool test_fullscreen = GetParam(); + const bool test_fullscreen = GetTestFullscreen(); GetAppListTestHelper()->ShowAndRunLoop(GetSecondaryDisplay().id()); AppListView* view = GetAppListView(); { @@ -2365,7 +2394,7 @@ } // Regression test for crash due to use-after-free. https://crbug.com/1163332 -TEST_F(AppListPresenterTest, ShouldNotCrashOnItemClickAfterMonitorDisconnect) { +TEST_P(AppListPresenterTest, ShouldNotCrashOnItemClickAfterMonitorDisconnect) { // Set up two displays. UpdateDisplay("1024x768,1200x900"); AppListModel* model = Shell::Get()->app_list_controller()->GetModel(); @@ -2402,7 +2431,7 @@ // Tests that the app list window's bounds height (from the shelf) in kPeeking // state is the same whether the app list is shown on the primary display // or the secondary display fir different display placements. -TEST_F(AppListPresenterTest, AppListPeekingStateHeightOnMultiDisplay) { +TEST_P(AppListPresenterTest, AppListPeekingStateHeightOnMultiDisplay) { UpdateDisplay("800x1000, 800x600"); const std::vector<display::DisplayPlacement::Position> placements = { @@ -2464,7 +2493,7 @@ // Tests that the app list window's bounds height (from the shelf) in kHalf // state is the same whether the app list is shown on the primary display // or the secondary display fir different display placements. -TEST_F(AppListPresenterTest, AppListHalfStateHeightOnMultiDisplay) { +TEST_P(AppListPresenterTest, AppListHalfStateHeightOnMultiDisplay) { UpdateDisplay("800x1000, 800x600"); const std::vector<display::DisplayPlacement::Position> placements = { @@ -2525,7 +2554,7 @@ // Tests that a fling from Fullscreen/Peeking closes the app list. TEST_P(AppListPresenterTest, FlingDownClosesAppListFromFullscreenAndPeeking) { - const bool test_fullscreen = GetParam(); + const bool test_fullscreen = GetTestFullscreen(); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -2546,7 +2575,7 @@ // Tests that drag using a mouse does not always close the app list if the app // list was previously closed using a fling gesture. TEST_P(AppListPresenterTest, MouseDragAfterDownwardFliing) { - const bool test_fullscreen = GetParam(); + const bool test_fullscreen = GetTestFullscreen(); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); @@ -2588,7 +2617,7 @@ : AppListViewState::kPeeking); } -TEST_F(AppListPresenterTest, +TEST_P(AppListPresenterTest, MouseWheelFromAppListPresenterImplTransitionsAppListState) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -2600,7 +2629,7 @@ } TEST_P(AppListPresenterTest, LongUpwardDragInFullscreenShouldNotClose) { - const bool test_fullscreen_search = GetParam(); + const bool test_fullscreen_search = GetTestFullscreen(); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); FlingUpOrDown(GetEventGenerator(), view, true); @@ -2710,7 +2739,7 @@ } // Tests that a drag can not make the app list smaller than the shelf height. -TEST_F(AppListPresenterTest, LauncherCannotGetSmallerThanShelf) { +TEST_P(AppListPresenterTest, LauncherCannotGetSmallerThanShelf) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); @@ -2729,7 +2758,7 @@ } // Tests that the AppListView is on screen on a small display. -TEST_F(AppListPresenterTest, SearchBoxShownOnSmallDisplay) { +TEST_P(AppListPresenterTest, SearchBoxShownOnSmallDisplay) { // Update the display to a small scale factor. UpdateDisplay("600x400"); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -2754,7 +2783,7 @@ } // Tests that the AppListView is on screen on a small work area. -TEST_F(AppListPresenterTest, SearchBoxShownOnSmallWorkArea) { +TEST_P(AppListPresenterTest, SearchBoxShownOnSmallWorkArea) { // Update the work area to a small size. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); ASSERT_TRUE(display_manager()->UpdateWorkAreaOfDisplay( @@ -2784,14 +2813,14 @@ // Tests that no crash occurs after an attempt to show app list in an invalid // display. -TEST_F(AppListPresenterTest, ShowInInvalidDisplay) { +TEST_P(AppListPresenterTest, ShowInInvalidDisplay) { GetAppListTestHelper()->ShowAndRunLoop(display::kInvalidDisplayId); GetAppListTestHelper()->CheckState(AppListViewState::kClosed); } // Tests that tap the auto-hide shelf with app list opened should dismiss the // app list but keep shelf visible. -TEST_F(AppListPresenterTest, TapAutoHideShelfWithAppListOpened) { +TEST_P(AppListPresenterTest, TapAutoHideShelfWithAppListOpened) { Shelf* shelf = GetPrimaryShelf(); shelf->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways); @@ -2856,7 +2885,7 @@ EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, shelf->GetAutoHideState()); } -TEST_F(AppListPresenterTest, ClickingShelfArrowDoesNotHideAppList) { +TEST_P(AppListPresenterTest, ClickingShelfArrowDoesNotHideAppList) { // Add enough shelf items for the shelf to enter overflow. Shelf* const shelf = GetPrimaryShelf(); ScrollableShelfView* const scrollable_shelf_view = @@ -2911,7 +2940,7 @@ // Verifies that in clamshell mode, AppList has the expected state based on the // drag distance after dragging from Peeking state. -TEST_F(AppListPresenterTest, DragAppListViewFromPeeking) { +TEST_P(AppListPresenterTest, DragAppListViewFromPeeking) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -2953,7 +2982,7 @@ // Tests that the app list background corner radius remains constant during app // list drag if the shelf is not in maximized state. -TEST_F(AppListPresenterTest, BackgroundCornerRadiusDuringDrag) { +TEST_P(AppListPresenterTest, BackgroundCornerRadiusDuringDrag) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -3027,7 +3056,7 @@ // Tests how app list background rounded corners are changed during a drag while // the shelf is in a maximized state (i.e. while a maximized window is shown). -TEST_F(AppListPresenterTest, +TEST_P(AppListPresenterTest, BackgroundCornerRadiusDuringDragWithMaximizedShelf) { auto window = CreateTestWindow(); window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); @@ -3114,7 +3143,7 @@ // Tests that the touch selection menu created when tapping an open folder's // folder name view be interacted with. -TEST_F(PopulatedAppListTest, TouchSelectionMenu) { +TEST_P(PopulatedAppListTest, TouchSelectionMenu) { InitializeAppsGrid(); AppListFolderItem* folder_item = @@ -3171,13 +3200,12 @@ // list drag. class AppListPresenterLayoutTest : public AppListPresenterTest { public: - AppListPresenterLayoutTest() { - scoped_feature_list_.InitAndEnableFeature(features::kEnableBackgroundBlur); - } + AppListPresenterLayoutTest() = default; ~AppListPresenterLayoutTest() override = default; void SetUp() override { AppListPresenterTest::SetUp(); + scoped_feature_list_.InitAndEnableFeature(features::kEnableBackgroundBlur); UpdateDisplay("1080x900"); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -3230,9 +3258,16 @@ base::test::ScopedFeatureList scoped_feature_list_; }; +// Instantiate the values in the parameterized tests. First boolean is used to +// toggle mouse and touch events and in some tests to toggle fullscreen mode +// tests. The second one toggles cardfied state feature enabled or disabled. +INSTANTIATE_TEST_SUITE_P(All, + AppListPresenterLayoutTest, + testing::Combine(testing::Bool(), testing::Bool())); + // Tests that the app list contents top margin is gradually updated during drag // between peeking and fullscreen view state while showing apps page. -TEST_F(AppListPresenterLayoutTest, AppsPagePositionDuringDrag) { +TEST_P(AppListPresenterLayoutTest, AppsPagePositionDuringDrag) { const AppListConfig& config = GetAppListView()->GetAppListConfig(); const int shelf_height = ShelfConfig::Get()->shelf_size(); const int fullscreen_y = 0; @@ -3334,7 +3369,7 @@ // Tests that the app list contents top margin is gradually updated during drag // between half and fullscreen state while showing search results. -TEST_F(AppListPresenterLayoutTest, SearchResultsPagePositionDuringDrag) { +TEST_P(AppListPresenterLayoutTest, SearchResultsPagePositionDuringDrag) { GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); // Enter text in the search box to transition to half app list. @@ -3448,7 +3483,7 @@ } // Tests changing the active app list page while drag is in progress. -TEST_F(AppListPresenterLayoutTest, SwitchPageDuringDrag) { +TEST_P(AppListPresenterLayoutTest, SwitchPageDuringDrag) { GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); const gfx::Point peeking_top = GetAppListView()->GetBoundsInScreen().top_center(); @@ -3553,7 +3588,7 @@ } // Tests changing the active app list page in fullscreen state. -TEST_F(AppListPresenterLayoutTest, SwitchPageInFullscreen) { +TEST_P(AppListPresenterLayoutTest, SwitchPageInFullscreen) { GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); FlingUpOrDown(GetEventGenerator(), GetAppListView(), true); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); @@ -3619,11 +3654,21 @@ } // Test a variety of behaviors for home launcher (app list in tablet mode). -class AppListPresenterHomeLauncherTest : public AshTestBase { +class AppListPresenterHomeLauncherTest + : public AshTestBase, + public testing::WithParamInterface<bool> { public: AppListPresenterHomeLauncherTest() { - scoped_feature_list_.InitWithFeatures({features::kEnableBackgroundBlur}, - {}); + if (GetParam()) { + scoped_feature_list_.InitWithFeatures( + {features::kEnableBackgroundBlur, + app_list_features::kNewDragSpecInLauncher}, + {}); + } else { + scoped_feature_list_.InitWithFeatures( + {features::kEnableBackgroundBlur}, + {app_list_features::kNewDragSpecInLauncher}); + } } AppListPresenterHomeLauncherTest(const AppListPresenterHomeLauncherTest&) = delete; @@ -3710,8 +3755,14 @@ std::unique_ptr<WallpaperControllerTestApi> wallpaper_test_api_; }; +// Instantiate the Boolean which is used to toggle cardified state in the +// parameterized tests. +INSTANTIATE_TEST_SUITE_P(All, + AppListPresenterHomeLauncherTest, + testing::Bool()); + // Verifies that mouse dragging AppListView is enabled. -TEST_F(AppListPresenterHomeLauncherTest, MouseDragAppList) { +TEST_P(AppListPresenterHomeLauncherTest, MouseDragAppList) { std::unique_ptr<AppListItem> item(new AppListItem("fake id")); Shell::Get()->app_list_controller()->GetModel()->AddItem(std::move(item)); @@ -3741,7 +3792,7 @@ // Verifies that mouse dragging AppListView creates layers, causes to change the // opacity, and destroys the layers when done. -TEST_F(AppListPresenterHomeLauncherTest, MouseDragAppListItemOpacity) { +TEST_P(AppListPresenterHomeLauncherTest, MouseDragAppListItemOpacity) { const int items_in_page = SharedAppListConfig::instance().GetMaxNumOfItemsPerPage(); for (int i = 0; i < items_in_page; ++i) { @@ -3803,7 +3854,7 @@ // Tests that ending of the mouse dragging of app-list destroys the layers for // the items which are in the second page. See https://crbug.com/990529. -TEST_F(AppListPresenterHomeLauncherTest, LayerOnSecondPage) { +TEST_P(AppListPresenterHomeLauncherTest, LayerOnSecondPage) { const int items_in_page = SharedAppListConfig::instance().GetMaxNumOfItemsPerPage(); AppListModel* model = Shell::Get()->app_list_controller()->GetModel(); @@ -3879,7 +3930,7 @@ // Tests that the app list is shown automatically when the tablet mode is on. // The app list is dismissed when the tablet mode is off. -TEST_F(AppListPresenterHomeLauncherTest, ShowAppListForTabletMode) { +TEST_P(AppListPresenterHomeLauncherTest, ShowAppListForTabletMode) { GetAppListTestHelper()->CheckVisibility(false); // Turns on tablet mode. @@ -3893,7 +3944,7 @@ // Tests that the app list window's parent is changed after entering tablet // mode. -TEST_F(AppListPresenterHomeLauncherTest, ParentWindowContainer) { +TEST_P(AppListPresenterHomeLauncherTest, ParentWindowContainer) { // Show app list in non-tablet mode. The window container should be // kShellWindowId_AppListContainer. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -3910,7 +3961,7 @@ } // Tests that the background opacity change for app list. -TEST_F(AppListPresenterHomeLauncherTest, BackgroundOpacity) { +TEST_P(AppListPresenterHomeLauncherTest, BackgroundOpacity) { // Show app list in non-tablet mode. The background shield opacity should be // 70%. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -3945,7 +3996,7 @@ // Tests that the background blur which is present in clamshell mode does not // show in tablet mode. -TEST_F(AppListPresenterHomeLauncherTest, BackgroundBlur) { +TEST_P(AppListPresenterHomeLauncherTest, BackgroundBlur) { // Show app list in non-tablet mode. The background blur should be enabled. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); EXPECT_GT(GetAppListView() @@ -3963,7 +4014,7 @@ } // Tests that tapping or clicking on background cannot dismiss the app list. -TEST_F(AppListPresenterHomeLauncherTest, TapOrClickToDismiss) { +TEST_P(AppListPresenterHomeLauncherTest, TapOrClickToDismiss) { // Show app list in non-tablet mode. Click outside search box. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -3994,7 +4045,7 @@ GetAppListTestHelper()->CheckVisibility(true); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, EscapeKeyInNonTabletModeClosesLauncher) { ShowAppList(); EXPECT_TRUE(IsAppListVisible()); @@ -4003,7 +4054,7 @@ EXPECT_FALSE(IsAppListVisible()); } -TEST_F(AppListPresenterHomeLauncherTest, BackKeyInNonTabletModeClosesLauncher) { +TEST_P(AppListPresenterHomeLauncherTest, BackKeyInNonTabletModeClosesLauncher) { ShowAppList(); EXPECT_TRUE(IsAppListVisible()); @@ -4011,7 +4062,7 @@ EXPECT_FALSE(IsAppListVisible()); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, SearchKeyInNonTabletModeClosesLauncher) { ShowAppList(); EXPECT_TRUE(IsAppListVisible()); @@ -4020,7 +4071,7 @@ EXPECT_FALSE(IsAppListVisible()); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, EscapeKeyInTabletModeDoesNotCloseLauncher) { EnableTabletMode(true); EXPECT_TRUE(IsAppListVisible()); @@ -4029,7 +4080,7 @@ EXPECT_TRUE(IsAppListVisible()); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, BackKeyInTabletModeDoesNotCloseLauncher) { EnableTabletMode(true); EXPECT_TRUE(IsAppListVisible()); @@ -4038,7 +4089,7 @@ EXPECT_TRUE(IsAppListVisible()); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, SearchKeyInTabletModeDoesNotCloseLauncher) { EnableTabletMode(true); EXPECT_TRUE(IsAppListVisible()); @@ -4048,7 +4099,7 @@ } // Tests that moving focus outside app list window can dismiss it. -TEST_F(AppListPresenterHomeLauncherTest, FocusOutToDismiss) { +TEST_P(AppListPresenterHomeLauncherTest, FocusOutToDismiss) { // Show app list in non-tablet mode. Move focus to another window. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -4077,7 +4128,7 @@ } // Tests that the gesture-scroll cannot dismiss the app list. -TEST_F(AppListPresenterHomeLauncherTest, GestureScrollToDismiss) { +TEST_P(AppListPresenterHomeLauncherTest, GestureScrollToDismiss) { // Show app list in non-tablet mode. Fling down. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -4093,7 +4144,7 @@ GetAppListTestHelper()->CheckVisibility(true); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, MouseScrollUpFromPeekingShowsFullscreenLauncher) { // Show app list in non-tablet mode. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -4112,7 +4163,7 @@ EXPECT_TRUE(app_list->IsVisible(absl::nullopt)); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, MouseScrollDownFromPeekingClosesLauncher) { // Show app list in non-tablet mode. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); @@ -4131,7 +4182,7 @@ } // Tests that mouse-scroll up at fullscreen will dismiss app list. -TEST_F(AppListPresenterHomeLauncherTest, MouseScrollToDismissFromFullscreen) { +TEST_P(AppListPresenterHomeLauncherTest, MouseScrollToDismissFromFullscreen) { // Show app list in non-tablet mode. Mouse-scroll down. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); @@ -4154,7 +4205,7 @@ // Test that the AppListView opacity is reset after it is hidden during the // overview mode animation. -TEST_F(AppListPresenterHomeLauncherTest, LauncherShowsAfterOverviewMode) { +TEST_P(AppListPresenterHomeLauncherTest, LauncherShowsAfterOverviewMode) { // Show the AppList in clamshell mode. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckVisibility(true); @@ -4179,7 +4230,7 @@ // Tests that tapping home button while home screen is visible and showing // search results moves the home screen to apps container page. -TEST_F(AppListPresenterHomeLauncherTest, HomeButtonDismissesSearchResults) { +TEST_P(AppListPresenterHomeLauncherTest, HomeButtonDismissesSearchResults) { // Show app list in tablet mode. EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4205,7 +4256,7 @@ } // Tests the app list opacity in overview mode. -TEST_F(AppListPresenterHomeLauncherTest, OpacityInOverviewMode) { +TEST_P(AppListPresenterHomeLauncherTest, OpacityInOverviewMode) { // Show app list in tablet mode. EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4223,13 +4274,13 @@ EXPECT_EQ(1.0f, layer->opacity()); } -TEST_F(AppListPresenterHomeLauncherTest, AppListHiddenDuringWallpaperPreview) { +TEST_P(AppListPresenterHomeLauncherTest, AppListHiddenDuringWallpaperPreview) { EnableTabletMode(true); wallpaper_test_api_->StartWallpaperPreview(); GetAppListTestHelper()->CheckVisibility(false); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, AppListShownAfterWallpaperPreviewConfirmed) { EnableTabletMode(true); wallpaper_test_api_->StartWallpaperPreview(); @@ -4237,7 +4288,7 @@ GetAppListTestHelper()->CheckVisibility(true); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, AppListShownAfterWallpaperPreviewCanceled) { EnableTabletMode(true); wallpaper_test_api_->StartWallpaperPreview(); @@ -4245,7 +4296,7 @@ GetAppListTestHelper()->CheckVisibility(true); } -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, AppListShownAfterWallpaperPreviewAndExitOverviewMode) { EnableTabletMode(true); wallpaper_test_api_->StartWallpaperPreview(); @@ -4259,7 +4310,7 @@ } // Tests that going home will minimize all windows. -TEST_F(AppListPresenterHomeLauncherTest, GoingHomeMinimizesAllWindows) { +TEST_P(AppListPresenterHomeLauncherTest, GoingHomeMinimizesAllWindows) { // Show app list in tablet mode. Maximize all windows. EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4296,7 +4347,7 @@ } // Tests that going home will end split view mode. -TEST_F(AppListPresenterHomeLauncherTest, GoingHomeEndsSplitViewMode) { +TEST_P(AppListPresenterHomeLauncherTest, GoingHomeEndsSplitViewMode) { // Show app list in tablet mode. Enter split view mode. EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4310,7 +4361,7 @@ } // Tests that going home will end overview mode. -TEST_F(AppListPresenterHomeLauncherTest, GoingHomeEndOverviewMode) { +TEST_P(AppListPresenterHomeLauncherTest, GoingHomeEndOverviewMode) { // Show app list in tablet mode. Enter overview mode. EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4326,7 +4377,7 @@ // Tests that going home will end overview and split view mode if both are // active (e.g. one side of the split view contains overview). -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, GoingHomeEndsSplitViewModeWithOverview) { // Show app list in tablet mode. Enter split view mode. EnableTabletMode(true); @@ -4352,7 +4403,7 @@ // Tests that the context menu is triggered in the same way as if we are on // the wallpaper. -TEST_F(AppListPresenterHomeLauncherTest, WallpaperContextMenu) { +TEST_P(AppListPresenterHomeLauncherTest, WallpaperContextMenu) { // Show app list in tablet mode. EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4395,7 +4446,7 @@ // Tests app list visibility when switching to tablet mode during dragging from // shelf. -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, SwitchToTabletModeDuringDraggingFromShelf) { UpdateDisplay("1080x900"); GetAppListTestHelper()->CheckVisibility(false); @@ -4438,7 +4489,7 @@ // Tests app list visibility when switching to tablet mode during dragging to // close app list. -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, SwitchToTabletModeDuringDraggingToClose) { UpdateDisplay("1080x900"); @@ -4475,7 +4526,7 @@ } // Test backdrop exists for active non-fullscreen window in tablet mode. -TEST_F(AppListPresenterHomeLauncherTest, BackdropTest) { +TEST_P(AppListPresenterHomeLauncherTest, BackdropTest) { WorkspaceControllerTestApi test_helper(ShellTestApi().workspace_controller()); EnableTabletMode(true); GetAppListTestHelper()->CheckVisibility(true); @@ -4490,7 +4541,7 @@ // Tests that app list is not active when switching to tablet mode if an active // window exists. -TEST_F(AppListPresenterHomeLauncherTest, +TEST_P(AppListPresenterHomeLauncherTest, NotActivateAppListWindowWhenActiveWindowExists) { // No window is active. EXPECT_EQ(nullptr, window_util::GetActiveWindow()); @@ -4533,18 +4584,19 @@ // Performs mouse click or tap gesture on the provided point, depending on // whether the test is parameterized to use mouse clicks or tap gestures. void ClickOrTap(const gfx::Point& point) { - if (GetParam()) + if (TestMouseEventParam()) ClickMouseAt(point); else GetEventGenerator()->GestureTapAt(point); } }; -// Instantiate the Boolean which is used to toggle mouse and touch events in -// the parameterized tests. +// Instantiate the values in the parameterized tests. First boolean is used to +// toggle mouse and touch events and in some tests to toggle fullscreen mode +// tests. The second one toggles cardfied state feature enabled or disabled. INSTANTIATE_TEST_SUITE_P(All, AppListPresenterVirtualKeyboardTest, - testing::Bool()); + testing::Combine(testing::Bool(), testing::Bool())); // Tests that tapping or clicking the body of the applist with an active virtual // keyboard when there exists text in the searchbox results in the virtual @@ -4612,7 +4664,7 @@ EXPECT_FALSE(GetAppListView()->search_box_view()->is_search_box_active()); } -TEST_F(AppListPresenterHomeLauncherTest, TapHomeButtonOnExternalDisplay) { +TEST_P(AppListPresenterHomeLauncherTest, TapHomeButtonOnExternalDisplay) { UpdateDisplay("800x600,1000x768"); TapHomeButton(GetSecondaryDisplay().id()); @@ -4632,7 +4684,7 @@ // Test that gesture tapping the app list search box correctly handles the event // by moving the textfield's cursor to the tapped position within the text. -TEST_F(AppListPresenterTest, SearchBoxTextfieldGestureTap) { +TEST_P(AppListPresenterTest, SearchBoxTextfieldGestureTap) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListView()->SetState(AppListViewState::kFullscreenAllApps);
diff --git a/ash/app_list/app_list_util.cc b/ash/app_list/app_list_util.cc index a889505..854ae32 100644 --- a/ash/app_list/app_list_util.cc +++ b/ash/app_list/app_list_util.cc
@@ -4,6 +4,8 @@ #include "ash/app_list/app_list_util.h" +#include "ash/app_list/model/app_list_folder_item.h" +#include "ash/app_list/model/app_list_item.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/views/controls/textfield/textfield.h" #include "ui/views/focus/focus_manager.h" @@ -51,6 +53,10 @@ key_code == ui::VKEY_LEFT || key_code == ui::VKEY_UP; } +bool IsFolderItem(AppListItem* item) { + return item->GetItemType() == AppListFolderItem::kItemType; +} + bool LeftRightKeyEventShouldExitText(views::Textfield* textfield, const ui::KeyEvent& key_event) { DCHECK(IsUnhandledLeftRightKeyEvent(key_event));
diff --git a/ash/app_list/app_list_util.h b/ash/app_list/app_list_util.h index a4943c9..7f28b62 100644 --- a/ash/app_list/app_list_util.h +++ b/ash/app_list/app_list_util.h
@@ -14,6 +14,7 @@ } namespace ash { +class AppListItem; // Returns true if the key event is an unhandled left or right arrow (unmodified // by ctrl, shift, or alt) @@ -34,6 +35,9 @@ // |VKEY_RIGHT|, |VKEY_DOWN| ASH_EXPORT bool IsArrowKey(const ui::KeyboardCode& key_code); +// Returns true if the |item| is a folder item. +ASH_EXPORT bool IsFolderItem(AppListItem* item); + // Returns true if the arrow key event should move focus away from the // |textfield|. This is usually when the insertion point would move away from // text.
diff --git a/ash/app_list/bubble/app_list_bubble_apps_page.cc b/ash/app_list/bubble/app_list_bubble_apps_page.cc index 103500ed..d5eaefc 100644 --- a/ash/app_list/bubble/app_list_bubble_apps_page.cc +++ b/ash/app_list/bubble/app_list_bubble_apps_page.cc
@@ -87,14 +87,14 @@ ColorProvider::ContentLayerType::kSeparatorColor)); // All apps section. - auto* apps_grid = + scrollable_apps_grid_view_ = scroll_contents->AddChildView(std::make_unique<ScrollableAppsGridView>( view_delegate, /*folder_delegate=*/nullptr)); - apps_grid->Init(); + scrollable_apps_grid_view_->Init(); AppListModel* model = view_delegate->GetModel(); - apps_grid->SetModel(model); - apps_grid->SetItemList(model->top_level_item_list()); - apps_grid->ResetForShowApps(); + scrollable_apps_grid_view_->SetModel(model); + scrollable_apps_grid_view_->SetItemList(model->top_level_item_list()); + scrollable_apps_grid_view_->ResetForShowApps(); scroll->SetContents(std::move(scroll_contents)); }
diff --git a/ash/app_list/bubble/app_list_bubble_apps_page.h b/ash/app_list/bubble/app_list_bubble_apps_page.h index 3b6b674..a966d151 100644 --- a/ash/app_list/bubble/app_list_bubble_apps_page.h +++ b/ash/app_list/bubble/app_list_bubble_apps_page.h
@@ -5,6 +5,7 @@ #ifndef ASH_APP_LIST_BUBBLE_APP_LIST_BUBBLE_APPS_PAGE_H_ #define ASH_APP_LIST_BUBBLE_APP_LIST_BUBBLE_APPS_PAGE_H_ +#include "ash/app_list/bubble/scrollable_apps_grid_view.h" #include "ash/ash_export.h" #include "ui/views/view.h" @@ -12,6 +13,7 @@ class AppListViewDelegate; class RecentAppsView; +class ScrollableAppsGridView; // The default page for the app list bubble / clamshell launcher. Contains a // scroll view with: @@ -26,9 +28,13 @@ ~AppListBubbleAppsPage() override; RecentAppsView* recent_apps_for_test() { return recent_apps_; } + ScrollableAppsGridView* scrollable_apps_grid_view_for_test() { + return scrollable_apps_grid_view_; + } private: RecentAppsView* recent_apps_ = nullptr; + ScrollableAppsGridView* scrollable_apps_grid_view_ = nullptr; }; } // namespace ash
diff --git a/ash/app_list/bubble/recent_apps_view.cc b/ash/app_list/bubble/recent_apps_view.cc index 9e0139d9..1115978 100644 --- a/ash/app_list/bubble/recent_apps_view.cc +++ b/ash/app_list/bubble/recent_apps_view.cc
@@ -90,7 +90,8 @@ // dragged, so this implementation is mostly a stub. class RecentAppsView::GridDelegateImpl : public AppListItemView::GridDelegate { public: - GridDelegateImpl() = default; + explicit GridDelegateImpl(AppListViewDelegate* view_delegate) + : view_delegate_(view_delegate) {} GridDelegateImpl(const GridDelegateImpl&) = delete; GridDelegateImpl& operator=(const GridDelegateImpl&) = delete; ~GridDelegateImpl() override = default; @@ -128,6 +129,18 @@ bool IsDragViewMoved(const AppListItemView& view) const override { return false; } + void OnAppListItemViewActivated(AppListItemView* pressed_item_view, + const ui::Event& event) override { + // TODO(crbug.com/1216594): Add a new launch type for "recent apps". + // NOTE: Avoid using |item->id()| as the parameter. In some rare situations, + // activating the item may destruct it. Using the reference to an object + // which may be destroyed during the procedure as the function parameter + // may bring the crash like https://crbug.com/990282. + const std::string id = pressed_item_view->item()->id(); + view_delegate_->ActivateItem( + id, event.flags(), AppListLaunchedFrom::kLaunchedFromSuggestionChip); + // `this` may be deleted. + } const AppListConfig& GetAppListConfig() const override { // TODO(crbug.com/1211592): Eliminate this method and use the real config. return *AppListConfigProvider::Get().GetConfigForType( @@ -135,12 +148,13 @@ } private: + AppListViewDelegate* const view_delegate_; AppListItemView* selected_view_ = nullptr; }; RecentAppsView::RecentAppsView(AppListViewDelegate* view_delegate) : view_delegate_(view_delegate), - grid_delegate_(std::make_unique<GridDelegateImpl>()) { + grid_delegate_(std::make_unique<GridDelegateImpl>(view_delegate_)) { DCHECK(view_delegate_); auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal, gfx::Insets(), @@ -155,7 +169,10 @@ std::string item_id = ItemIdFromAppId(app_id); AppListItem* item = model->FindItem(item_id); if (item) { - AddAppIcon(item); + // NOTE: If you change the view structure, update GetItemForTest() as + // well. + AddChildView(std::make_unique<AppListItemView>(grid_delegate_.get(), item, + view_delegate_)); } } } @@ -166,21 +183,4 @@ return static_cast<AppListItemView*>(children()[index]); } -void RecentAppsView::AddAppIcon(AppListItem* item) { - // NOTE: If you change the view structure, update GetItemForTest() as well. - AppListItemView* item_view = AddChildView(std::make_unique<AppListItemView>( - grid_delegate_.get(), item, view_delegate_)); - item_view->SetCallback( - base::BindRepeating(&RecentAppsView::OnAppListItemViewPressed, - base::Unretained(this), item->id())); -} - -void RecentAppsView::OnAppListItemViewPressed(const std::string& item_id, - const ui::Event& event) { - // TODO(crbug.com/1216594): Add a new launch type for "recent apps". - view_delegate_->ActivateItem( - item_id, event.flags(), AppListLaunchedFrom::kLaunchedFromSuggestionChip); - // `this` may be deleted. -} - } // namespace ash
diff --git a/ash/app_list/bubble/recent_apps_view.h b/ash/app_list/bubble/recent_apps_view.h index a8655b58..762e605c 100644 --- a/ash/app_list/bubble/recent_apps_view.h +++ b/ash/app_list/bubble/recent_apps_view.h
@@ -12,13 +12,8 @@ #include "ash/ash_export.h" #include "ui/views/view.h" -namespace ui { -class Event; -} // namespace ui - namespace ash { -class AppListItem; class AppListItemView; class AppListViewDelegate; @@ -34,13 +29,6 @@ AppListItemView* GetItemViewForTest(int index); private: - // Adds an app icon as a child view. - void AddAppIcon(AppListItem* item); - - // Callback for clicking on an app. - void OnAppListItemViewPressed(const std::string& item_id, - const ui::Event& event); - AppListViewDelegate* const view_delegate_; // The grid delegate for each AppListItemView.
diff --git a/ash/app_list/bubble/recent_apps_view_unittest.cc b/ash/app_list/bubble/recent_apps_view_unittest.cc index 16776e0f..f8a00a0 100644 --- a/ash/app_list/bubble/recent_apps_view_unittest.cc +++ b/ash/app_list/bubble/recent_apps_view_unittest.cc
@@ -12,6 +12,7 @@ #include "ash/app_list/bubble/app_list_bubble_apps_page.h" #include "ash/app_list/bubble/app_list_bubble_view.h" #include "ash/app_list/model/app_list_item.h" +#include "ash/app_list/model/app_list_model.h" #include "ash/app_list/model/search/search_model.h" #include "ash/app_list/model/search/test_search_result.h" #include "ash/app_list/test_app_list_client.h" @@ -68,20 +69,6 @@ ->recent_apps_for_test(); } -// An AppListClient that records some method calls. -class RecordingAppListClient : public TestAppListClient { - public: - void ActivateItem(int profile_id, - const std::string& id, - int event_flags) override { - activate_item_count_++; - activate_item_last_id_ = id; - } - - int activate_item_count_ = 0; - std::string activate_item_last_id_; -}; - class RecentAppsViewTest : public AshTestBase { public: RecentAppsViewTest() { @@ -101,7 +88,7 @@ } base::test::ScopedFeatureList scoped_feature_list_; - RecordingAppListClient app_list_client_; + TestAppListClient app_list_client_; }; TEST_F(RecentAppsViewTest, CreatesIconsForApps) { @@ -155,8 +142,8 @@ GetEventGenerator()->ClickLeftButton(); // The item was activated. - EXPECT_EQ(app_list_client_.activate_item_count_, 1); - EXPECT_EQ(app_list_client_.activate_item_last_id_, "id"); + EXPECT_EQ(1, app_list_client_.activate_item_count()); + EXPECT_EQ("id", app_list_client_.activate_item_last_id()); } TEST_F(RecentAppsViewTest, RightClickOpensContextMenu) {
diff --git a/ash/app_list/bubble/scrollable_apps_grid_view.cc b/ash/app_list/bubble/scrollable_apps_grid_view.cc index d43e2e8d..5b574019 100644 --- a/ash/app_list/bubble/scrollable_apps_grid_view.cc +++ b/ash/app_list/bubble/scrollable_apps_grid_view.cc
@@ -6,7 +6,11 @@ #include <limits> #include <memory> +#include <string> +#include "ash/app_list/app_list_util.h" +#include "ash/app_list/app_list_view_delegate.h" +#include "ash/app_list/model/app_list_item.h" #include "ash/app_list/model/app_list_model.h" #include "ash/app_list/views/app_list_item_view.h" #include "ash/public/cpp/app_list/app_list_config.h" @@ -117,4 +121,22 @@ } } +void ScrollableAppsGridView::OnAppListItemViewActivated( + AppListItemView* pressed_item_view, + const ui::Event& event) { + if (IsFolderItem(pressed_item_view->item())) { + // TODO(https://crbug.com/1214064): Implement showing folder contents. + return; + } + // TODO(https://crbug.com/1218435): Implement metrics for app launch. + + // Avoid using |item->id()| as the parameter. In some rare situations, + // activating the item may destruct it. Using the reference to an object + // which may be destroyed during the procedure as the function parameter + // may bring the crash like https://crbug.com/990282. + const std::string id = pressed_item_view->item()->id(); + app_list_view_delegate()->ActivateItem( + id, event.flags(), AppListLaunchedFrom::kLaunchedFromGrid); +} + } // namespace ash
diff --git a/ash/app_list/bubble/scrollable_apps_grid_view.h b/ash/app_list/bubble/scrollable_apps_grid_view.h index 052f7a8..1948424 100644 --- a/ash/app_list/bubble/scrollable_apps_grid_view.h +++ b/ash/app_list/bubble/scrollable_apps_grid_view.h
@@ -32,6 +32,10 @@ int GetPaddingBetweenPages() const override; bool IsScrollAxisVertical() const override; void CalculateIdealBounds() override; + + // AppListItemView::GridDelegate: + void OnAppListItemViewActivated(AppListItemView* pressed_item_view, + const ui::Event& event) override; }; } // namespace ash
diff --git a/ash/app_list/bubble/scrollable_apps_grid_view_unittest.cc b/ash/app_list/bubble/scrollable_apps_grid_view_unittest.cc new file mode 100644 index 0000000..395ac83 --- /dev/null +++ b/ash/app_list/bubble/scrollable_apps_grid_view_unittest.cc
@@ -0,0 +1,77 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/app_list/bubble/scrollable_apps_grid_view.h" + +#include <memory> +#include <string> + +#include "ash/app_list/app_list_bubble_presenter.h" +#include "ash/app_list/app_list_controller_impl.h" +#include "ash/app_list/bubble/app_list_bubble_apps_page.h" +#include "ash/app_list/bubble/app_list_bubble_view.h" +#include "ash/app_list/model/app_list_item.h" +#include "ash/app_list/model/app_list_model.h" +#include "ash/app_list/test_app_list_client.h" +#include "ash/constants/ash_features.h" +#include "ash/shell.h" +#include "ash/test/ash_test_base.h" +#include "base/test/scoped_feature_list.h" + +namespace ash { +namespace { + +ScrollableAppsGridView* GetScrollableAppsGridView() { + return Shell::Get() + ->app_list_controller() + ->bubble_presenter_for_test() + ->bubble_view_for_test() + ->apps_page_for_test() + ->scrollable_apps_grid_view_for_test(); +} + +void ShowAppList() { + Shell::Get()->app_list_controller()->ShowAppList(); +} + +void AddAppListItem(const std::string& id) { + Shell::Get()->app_list_controller()->GetModel()->AddItem( + std::make_unique<AppListItem>(id)); +} + +} // namespace + +class ScrollableAppsGridViewTest : public AshTestBase { + public: + ScrollableAppsGridViewTest() { + scoped_feature_list_.InitAndEnableFeature(features::kAppListBubble); + } + ~ScrollableAppsGridViewTest() override = default; + + void SetUp() override { + AshTestBase::SetUp(); + Shell::Get()->app_list_controller()->SetClient(&app_list_client_); + } + + base::test::ScopedFeatureList scoped_feature_list_; + TestAppListClient app_list_client_; +}; + +TEST_F(ScrollableAppsGridViewTest, ClickOnApp) { + AddAppListItem("id"); + + ShowAppList(); + + // Click on the first icon. + ScrollableAppsGridView* view = GetScrollableAppsGridView(); + views::View* icon = view->GetItemViewAt(0); + GetEventGenerator()->MoveMouseTo(icon->GetBoundsInScreen().CenterPoint()); + GetEventGenerator()->ClickLeftButton(); + + // The item was activated. + EXPECT_EQ(1, app_list_client_.activate_item_count()); + EXPECT_EQ("id", app_list_client_.activate_item_last_id()); +} + +} // namespace ash
diff --git a/ash/app_list/test_app_list_client.cc b/ash/app_list/test_app_list_client.cc index 57ba7e2..a8306e6 100644 --- a/ash/app_list/test_app_list_client.cc +++ b/ash/app_list/test_app_list_client.cc
@@ -24,6 +24,13 @@ std::move(callback).Run(nullptr); } +void TestAppListClient::ActivateItem(int profile_id, + const std::string& id, + int event_flags) { + activate_item_count_++; + activate_item_last_id_ = id; +} + void TestAppListClient::GetContextMenuModel( int profile_id, const std::string& id,
diff --git a/ash/app_list/test_app_list_client.h b/ash/app_list/test_app_list_client.h index 3daf0665..a7854c8 100644 --- a/ash/app_list/test_app_list_client.h +++ b/ash/app_list/test_app_list_client.h
@@ -43,7 +43,7 @@ void ViewShown(int64_t display_id) override {} void ActivateItem(int profile_id, const std::string& id, - int event_flags) override {} + int event_flags) override; void GetContextMenuModel(int profile_id, const std::string& id, GetContextMenuModelCallback callback) override; @@ -67,11 +67,20 @@ int position_index) override {} AppListNotifier* GetNotifier() override; + // Returns the number of AppItems that have been activated. These items could + // live in search, RecentAppsView, or ScrollableAppsGridView. + int activate_item_count() const { return activate_item_count_; } + + // Returns the ID of the last activated AppItem. + std::string activate_item_last_id() const { return activate_item_last_id_; } + using SearchResultActionId = std::pair<std::string, int>; std::vector<SearchResultActionId> GetAndClearInvokedResultActions(); private: std::vector<SearchResultActionId> invoked_result_actions_; + int activate_item_count_ = 0; + std::string activate_item_last_id_; DISALLOW_COPY_AND_ASSIGN(TestAppListClient); };
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index dede0f39..4fa5ac0 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -258,7 +258,11 @@ AppListItemView::AppListItemView(GridDelegate* grid_delegate, AppListItem* item, AppListViewDelegate* view_delegate) - : is_folder_(item->GetItemType() == AppListFolderItem::kItemType), + : views::Button( + base::BindRepeating(&GridDelegate::OnAppListItemViewActivated, + base::Unretained(grid_delegate), + base::Unretained(this))), + is_folder_(item->GetItemType() == AppListFolderItem::kItemType), item_weak_(item), grid_delegate_(grid_delegate), view_delegate_(view_delegate),
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h index 10d3f3051..d7074b60 100644 --- a/ash/app_list/views/app_list_item_view.h +++ b/ash/app_list/views/app_list_item_view.h
@@ -66,7 +66,6 @@ const gfx::Point& location, const gfx::Point& root_location) = 0; virtual void StartDragAndDropHostDragAfterLongPress() = 0; - // Called from AppListItemView when it receives a drag event. Returns true // if the drag is still happening. virtual bool UpdateDragFromItem(bool is_touch, @@ -78,6 +77,11 @@ // Whether |view| is being dragged and is not in its drag start position. virtual bool IsDragViewMoved(const AppListItemView& view) const = 0; + // Provided as a callback for AppListItemView to notify of activation via + // press/click/return key. + virtual void OnAppListItemViewActivated(AppListItemView* pressed_item_view, + const ui::Event& event) = 0; + // TODO(crbug.com/1211592): Eliminate this method. virtual const AppListConfig& GetAppListConfig() const = 0; };
diff --git a/ash/app_list/views/app_list_main_view.cc b/ash/app_list/views/app_list_main_view.cc index ba293ed..adc7111 100644 --- a/ash/app_list/views/app_list_main_view.cc +++ b/ash/app_list/views/app_list_main_view.cc
@@ -10,6 +10,7 @@ #include <utility> #include "ash/app_list/app_list_metrics.h" +#include "ash/app_list/app_list_util.h" #include "ash/app_list/app_list_view_delegate.h" #include "ash/app_list/model/app_list_folder_item.h" #include "ash/app_list/model/app_list_item.h" @@ -145,7 +146,7 @@ void AppListMainView::ActivateApp(AppListItem* item, int event_flags) { // TODO(jennyz): Activate the folder via AppListModel notification. - if (item->GetItemType() == AppListFolderItem::kItemType) { + if (IsFolderItem(item)) { contents_view_->ShowFolderContent(static_cast<AppListFolderItem*>(item)); UMA_HISTOGRAM_ENUMERATION("Apps.AppListFolderOpened", kFullscreenAppListFolders, kMaxFolderOpened);
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index 06cbce3d..eacee1e 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -227,11 +227,6 @@ DISALLOW_COPY_AND_ASSIGN(FolderDroppingAnimationObserver); }; -// Returns true if the |item| is a folder item. -bool IsFolderItem(AppListItem* item) { - return (item->GetItemType() == AppListFolderItem::kItemType); -} - bool IsOEMFolderItem(AppListItem* item) { return IsFolderItem(item) && (static_cast<AppListFolderItem*>(item))->folder_type() == @@ -1024,9 +1019,6 @@ AppListItem* item) { std::unique_ptr<AppListItemView> view = std::make_unique<AppListItemView>(this, item, app_list_view_delegate_); - view->SetCallback(base::BindRepeating(&AppsGridView::OnAppListItemViewPressed, - base::Unretained(this), - base::Unretained(view.get()))); return view; } @@ -1820,6 +1812,21 @@ return contents_view_->app_list_view()->GetAppListConfig(); } +bool AppsGridView::IsAnimationRunningForTest() { + return bounds_animator_->IsAnimating() || + bounds_animation_for_cardified_state_in_progress_ > 0; +} + +void AppsGridView::CancelAnimationsForTest() { + bounds_animator_->Cancel(); + + const int total_views = view_model_.view_size(); + for (int i = 0; i < total_views; ++i) { + if (view_model_.view_at(i)->layer()) + view_model_.view_at(i)->layer()->CompleteAllAnimations(); + } +} + bool AppsGridView::FirePageFlipTimerForTest() { if (!page_flip_timer_.IsRunning()) return false; @@ -2298,40 +2305,6 @@ point_in_parent.y() < kBottomDragBufferMax; } -void AppsGridView::OnAppListItemViewPressed(AppListItemView* pressed_item_view, - const ui::Event& event) { - // TODO(crbug.com/1211608): Refactor to support ScrollableAppsGridView. For - // now, just don't crash. - if (!contents_view_) { - NOTIMPLEMENTED(); - return; - } - - if (IsDragging()) - return; - - if (contents_view_->apps_container_view() - ->app_list_folder_view() - ->IsAnimationRunning()) { - return; - } - - // Always set the previous activated_folder_item_view_ to be visible. This - // prevents a case where the item would remain hidden due the - // |activated_folder_item_view_| changing during the animation. We only - // need to track |activated_folder_item_view_| in the root level grid view. - if (!folder_delegate_) { - if (activated_folder_item_view_) - activated_folder_item_view_->SetVisible(true); - if (IsFolderItem(pressed_item_view->item())) - activated_folder_item_view_ = pressed_item_view; - else - activated_folder_item_view_ = nullptr; - } - contents_view_->GetAppListMainView()->ActivateApp(pressed_item_view->item(), - event.flags()); -} - void AppsGridView::OnListItemAdded(size_t index, AppListItem* item) { EndDrag(true);
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h index a16f632..89c536ad 100644 --- a/ash/app_list/views/apps_grid_view.h +++ b/ash/app_list/views/apps_grid_view.h
@@ -270,6 +270,29 @@ // Return the view model. views::ViewModelT<AppListItemView>* view_model() { return &view_model_; } + // Returns true if any animation is running within the view. + bool IsAnimationRunningForTest(); + // Cancel any animations currently running within the view. + void CancelAnimationsForTest(); + + AppsGridViewFolderDelegate* folder_delegate() const { + return folder_delegate_; + } + + void set_folder_delegate(AppsGridViewFolderDelegate* folder_delegate) { + folder_delegate_ = folder_delegate; + } + + AppListItemView* activated_folder_item_view() const { + return activated_folder_item_view_; + } + + void set_activated_folder_item_view(AppListItemView* item_view) { + activated_folder_item_view_ = item_view; + } + + const AppListModel* model() const { return model_; } + bool FirePageFlipTimerForTest(); bool FireFolderItemReparentTimerForTest(); bool FireFolderDroppingTimerForTest(); @@ -285,16 +308,6 @@ return forward_events_to_drag_and_drop_host_; } - void set_folder_delegate(AppsGridViewFolderDelegate* folder_delegate) { - folder_delegate_ = folder_delegate; - } - - AppListItemView* activated_folder_item_view() const { - return activated_folder_item_view_; - } - - const AppListModel* model() const { return model_; } - void set_page_flip_delay_for_testing(base::TimeDelta page_flip_delay) { page_flip_delay_ = page_flip_delay; } @@ -382,6 +395,10 @@ const gfx::Point& last_drag_point() const { return last_drag_point_; } bool handling_keyboard_move() const { return handling_keyboard_move_; } + AppListViewDelegate* app_list_view_delegate() const { + return app_list_view_delegate_; + } + // TODO(crbug.com/1211608): Move these member variables to PagedAppsGridView. PaginationModel pagination_model_{this}; @@ -557,10 +574,6 @@ // shelf. bool IsPointWithinBottomDragBuffer(const gfx::Point& point) const; - // AppListItemView pressed callback binds here: - void OnAppListItemViewPressed(AppListItemView* pressed_item_view, - const ui::Event& event); - // Overridden from AppListItemListObserver: void OnListItemAdded(size_t index, AppListItem* item) override; void OnListItemRemoved(size_t index, AppListItem* item) override;
diff --git a/ash/app_list/views/paged_apps_grid_view.cc b/ash/app_list/views/paged_apps_grid_view.cc index 368ed72..d8853a3c 100644 --- a/ash/app_list/views/paged_apps_grid_view.cc +++ b/ash/app_list/views/paged_apps_grid_view.cc
@@ -8,10 +8,13 @@ #include <utility> #include "ash/app_list/app_list_metrics.h" +#include "ash/app_list/app_list_util.h" #include "ash/app_list/model/app_list_item.h" +#include "ash/app_list/views/app_list_folder_view.h" #include "ash/app_list/views/app_list_item_view.h" #include "ash/app_list/views/app_list_main_view.h" #include "ash/app_list/views/app_list_view.h" +#include "ash/app_list/views/apps_container_view.h" #include "ash/app_list/views/contents_view.h" #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/app_list/app_list_features.h" @@ -516,6 +519,32 @@ EndAppsGridCardifiedView(); } +void PagedAppsGridView::OnAppListItemViewActivated( + AppListItemView* pressed_item_view, + const ui::Event& event) { + if (IsDragging()) + return; + + if (contents_view_->apps_container_view() + ->app_list_folder_view() + ->IsAnimationRunning()) { + return; + } + + // Always set the previous `activated_folder_item_view_` to be visible. This + // prevents a case where the item would remain hidden due the + // `activated_folder_item_view_` changing during the animation. We only + // need to track `activated_folder_item_view_` in the root level grid view. + if (!folder_delegate()) { + if (activated_folder_item_view()) + activated_folder_item_view()->SetVisible(true); + set_activated_folder_item_view( + IsFolderItem(pressed_item_view->item()) ? pressed_item_view : nullptr); + } + contents_view_->GetAppListMainView()->ActivateApp(pressed_item_view->item(), + event.flags()); +} + //////////////////////////////////////////////////////////////////////////////// // PaginationModelObserver: @@ -786,9 +815,11 @@ drag_view_start_ += translate_offset; drag_view_->SetPosition(drag_view_start_); } - // Drag view can be nullptr by EndDrag. + // Drag view can be nullptr or moved from the model by EndDrag. + const bool model_contains_drag_view = + drag_view_ && (view_model()->GetIndexOfView(drag_view_) != -1); const int number_of_views_to_animate = - view_model()->view_size() - (drag_view_ ? 1 : 0); + view_model()->view_size() - (model_contains_drag_view ? 1 : 0); base::RepeatingClosure on_bounds_animator_callback; if (number_of_views_to_animate > 0) {
diff --git a/ash/app_list/views/paged_apps_grid_view.h b/ash/app_list/views/paged_apps_grid_view.h index 019712b..f4d402f 100644 --- a/ash/app_list/views/paged_apps_grid_view.h +++ b/ash/app_list/views/paged_apps_grid_view.h
@@ -75,6 +75,10 @@ void MaybeStartCardifiedView() override; void MaybeEndCardifiedView() override; + // AppListItemView::GridDelegate: + void OnAppListItemViewActivated(AppListItemView* pressed_item_view, + const ui::Event& event) override; + // PaginationModelObserver: void TotalPagesChanged(int previous_page_count, int new_page_count) override; void SelectedPageChanged(int old_selected, int new_selected) override;
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 9246f38..3f7703e 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -2646,6 +2646,9 @@ <message name="IDS_ASH_LOGIN_SIGN_IN_REQUIRED_MESSAGE" desc="Message shown in the login screen when online sign-in is required."> Sign in required </message> + <message name="IDS_ASH_LOGIN_SIGN_IN_REQUIRED_SECONDARY_LOGIN_MESSAGE" desc="Message shown in the secondary login screen when online sign-in is required."> + To use <ph name="USER_EMAIL_ADDRESS">$1<ex>john.doe@example.com</ex></ph> you need to sign out of all accounts first. To sign out, select Cancel to go back. Then select the time to open the status area and select Sign out. Then sign in to <ph name="USER_EMAIL_ADDRESS_2">$2<ex>john.doe@example.com</ex></ph> again. + </message> <message name="IDS_ASH_LOCK_SCREEN_VERIFY_ACCOUNT_MESSAGE" desc="Message shown in the lock screen when online sign-in is required."> Verify account </message> @@ -3165,6 +3168,18 @@ <message name="IDS_ASH_QUICK_ANSWERS_USER_NOTICE_VIEW_A11Y_INFO_DESC_TEMPLATE" desc="A11y description template for the Quick Answers user notice view."> <ph name="DESC_TEXT">$1<ex>With a right-click or a long press, Assistant shows info such as the definition, translation or unit conversion for your selection.</ex></ph> Use Left or Right arrow keys to manage this feature. </message> + <message name="IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_TITLE_TEXT_WITH_INTENT" desc="Title text of the dialog that opens up to seek user-consent for the Quick Answers feature when supported intent is generated."> + Get the <ph name="intent">$1<ex>definition</ex></ph> for "<ph name="query">$2<ex>unfathomable</ex></ph>" and more + </message> + <message name="IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_DESC_TEXT" desc="Description in the dialog that opens up to seek user-consent for the Quick Answers feature."> + Get definitions, translations, or unit conversions when you right-click or touch & hold text. + </message> + <message name="IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_NO_THANKS_BUTTON" desc="Display text on the no thanks button in the dialog that opens up to seek user-consent for the Quick Answers feature."> + No Thanks + </message> + <message name="IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_ALLOW_BUTTON" desc="Display text on the allow button in the dialog that opens up to seek user-consent for the Quick Answers feature."> + Allow + </message> <message name="IDS_ASH_QUICK_ANSWERS_VIEW_LOADING" desc="Display text when the Quick Answers view is loading."> Loading... </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_LOGIN_SIGN_IN_REQUIRED_SECONDARY_LOGIN_MESSAGE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_LOGIN_SIGN_IN_REQUIRED_SECONDARY_LOGIN_MESSAGE.png.sha1 new file mode 100644 index 0000000..e97b9ab --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_LOGIN_SIGN_IN_REQUIRED_SECONDARY_LOGIN_MESSAGE.png.sha1
@@ -0,0 +1 @@ +0fd15db21887a62fb7f6a7617de25dbfd898ea6e \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_ALLOW_BUTTON.png.sha1 b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_ALLOW_BUTTON.png.sha1 new file mode 100644 index 0000000..1ecbb73 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_ALLOW_BUTTON.png.sha1
@@ -0,0 +1 @@ +8116b3b936a2606ee8f33de770cca0e48a4688e9 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_DESC_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_DESC_TEXT.png.sha1 new file mode 100644 index 0000000..1ecbb73 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_DESC_TEXT.png.sha1
@@ -0,0 +1 @@ +8116b3b936a2606ee8f33de770cca0e48a4688e9 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_NO_THANKS_BUTTON.png.sha1 b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_NO_THANKS_BUTTON.png.sha1 new file mode 100644 index 0000000..1ecbb73 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_NO_THANKS_BUTTON.png.sha1
@@ -0,0 +1 @@ +8116b3b936a2606ee8f33de770cca0e48a4688e9 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_TITLE_TEXT_WITH_INTENT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_TITLE_TEXT_WITH_INTENT.png.sha1 new file mode 100644 index 0000000..1ecbb73 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_TITLE_TEXT_WITH_INTENT.png.sha1
@@ -0,0 +1 @@ +8116b3b936a2606ee8f33de770cca0e48a4688e9 \ No newline at end of file
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc index a333102..dadef15f2 100644 --- a/ash/capture_mode/capture_mode_unittests.cc +++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -46,6 +46,7 @@ #include "base/callback_helpers.h" #include "base/run_loop.h" #include "base/scoped_observation.h" +#include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" @@ -2096,9 +2097,8 @@ // Tests that the video frames delivered to the service for recorded windows are // valid (i.e. they have the correct size, and suffer from no letterboxing, even // when the window gets resized). -// TODO(https://crbug.com/1214023): This test is currently broken due to a -// recent change in the Viz capturer. Re-enable the test once fixed. -TEST_F(CaptureModeTest, DISABLED_VerifyWindowRecordingVideoFrames) { +// This is a regression test for https://crbug.com/1214023. +TEST_F(CaptureModeTest, VerifyWindowRecordingVideoFrames) { auto window = CreateTestWindow(gfx::Rect(100, 50, 200, 200)); StartCaptureSession(CaptureModeSource::kWindow, CaptureModeType::kVideo); @@ -2110,17 +2110,64 @@ CaptureModeTestApi test_api; test_api.FlushRecordingServiceForTesting(); - auto verify_video_frame = [](const media::VideoFrame& frame, - const gfx::Rect& content_rect) { - // TODO(afakhry): Add more checks here. - EXPECT_EQ(gfx::Point(), content_rect.origin()); + bool is_video_frame_valid = false; + std::string failures; + auto verify_video_frame = [&](const media::VideoFrame& frame, + const gfx::Rect& content_rect) { + is_video_frame_valid = true; + failures.clear(); + + // Having the content positioned at (0,0) with a size that matches the + // current window's size means that there is no letterboxing. + if (gfx::Point() != content_rect.origin()) { + is_video_frame_valid = false; + failures = + base::StringPrintf("content_rect is not at (0,0), instead at: %s\n", + content_rect.origin().ToString().c_str()); + } + + const gfx::Size window_size = window->bounds().size(); + if (window_size != content_rect.size()) { + is_video_frame_valid = false; + failures += base::StringPrintf( + "content_rect doesn't match the window size:\n" + " content_rect.size(): %s\n" + " window_size: %s\n", + content_rect.size().ToString().c_str(), + window_size.ToString().c_str()); + } + + // The video frame contents should match the bounds of the video frame. + if (frame.visible_rect() != content_rect) { + is_video_frame_valid = false; + failures += base::StringPrintf( + "content_rect doesn't match the frame's visible_rect:\n" + " content_rect: %s\n" + " visible_rect: %s\n", + content_rect.ToString().c_str(), + frame.visible_rect().ToString().c_str()); + } + + if (frame.coded_size() != window_size) { + is_video_frame_valid = false; + failures += base::StringPrintf( + "the frame's coded size doesn't match the window size:\n" + " frame.coded_size(): %s\n" + " window_size: %s\n", + frame.coded_size().ToString().c_str(), + window_size.ToString().c_str()); + } }; auto* test_delegate = static_cast<TestCaptureModeDelegate*>(controller->delegate_for_testing()); ASSERT_TRUE(test_delegate->recording_service()); - test_delegate->recording_service()->RequestAndWaitForVideoFrame( - base::BindOnce(verify_video_frame)); + { + SCOPED_TRACE("Initial window size"); + test_delegate->recording_service()->RequestAndWaitForVideoFrame( + base::BindLambdaForTesting(verify_video_frame)); + EXPECT_TRUE(is_video_frame_valid) << failures; + } // Even when the window is resized and the throttled size reaches the service, // new video frames should still be valid. @@ -2128,8 +2175,20 @@ auto* recording_watcher = controller->video_recording_watcher_for_testing(); recording_watcher->SendThrottledWindowSizeChangedNowForTesting(); test_api.FlushRecordingServiceForTesting(); - test_delegate->recording_service()->RequestAndWaitForVideoFrame( - base::BindOnce(verify_video_frame)); + { + SCOPED_TRACE("After window resizing"); + // A video frame is produced on the Viz side when a CopyOutputRequest is + // fulfilled. Those CopyOutputRequests could have been placed before the + // window's layer resize results in a new resized render pass in Viz. But + // eventually this must happen, and a valid frame must be delivered. + int remaining_attempts = 2; + do { + --remaining_attempts; + test_delegate->recording_service()->RequestAndWaitForVideoFrame( + base::BindLambdaForTesting(verify_video_frame)); + } while (!is_video_frame_valid && remaining_attempts); + EXPECT_TRUE(is_video_frame_valid) << failures; + } controller->EndVideoRecording(EndRecordingReason::kStopRecordingButton); EXPECT_FALSE(controller->is_recording_in_progress());
diff --git a/ash/capture_mode/video_recording_watcher.cc b/ash/capture_mode/video_recording_watcher.cc index a4b2d99..b25322b 100644 --- a/ash/capture_mode/video_recording_watcher.cc +++ b/ash/capture_mode/video_recording_watcher.cc
@@ -91,10 +91,10 @@ const SkBitmap& cursor_bitmap) { DCHECK(recorded_window); - // Even when recording a non-root window, we use the bounds of the root - // window, since it corresponds to the bounds of the source frame sink we are - // recording. - const auto window_size = recorded_window->GetRootWindow()->bounds().size(); + // The video size, and the resolution constraints will be matching the size of + // the recorded window (whether a root or a non-root window). Hence, the + // bounds of the cursor overlay should be relative to that size. + const auto window_size = recorded_window->bounds().size(); if (window_size.IsEmpty()) return gfx::RectF();
diff --git a/ash/content/BUILD.gn b/ash/content/BUILD.gn index d3ce0b58..cbe6997 100644 --- a/ash/content/BUILD.gn +++ b/ash/content/BUILD.gn
@@ -18,6 +18,7 @@ deps = [ "//ash/content/scanning:unit_tests", + "//ash/content/shortcut_customization_ui/backend:unit_tests", "//base", "//base/test:test_support", "//build:chromeos_buildflags",
diff --git a/ash/content/file_manager/resources/crt0.js b/ash/content/file_manager/resources/crt0.js index cdb0e3a9..a8ef3810 100644 --- a/ash/content/file_manager/resources/crt0.js +++ b/ash/content/file_manager/resources/crt0.js
@@ -49,15 +49,6 @@ } }; -// Provides dummy implementation of chrome.notification, not available in SWA. -window.chrome.notifications = { - onClicked: new clientListener.Event(), - - onButtonClicked: new clientListener.Event(), - - onClosed: new clientListener.Event(), -}; - // Provides dummy implementation of chrome.contextMenus, not available in SWA. window.chrome.contextMenus = { create() {},
diff --git a/ash/content/shortcut_customization_ui/BUILD.gn b/ash/content/shortcut_customization_ui/BUILD.gn index 8dee6d0..33e65821 100644 --- a/ash/content/shortcut_customization_ui/BUILD.gn +++ b/ash/content/shortcut_customization_ui/BUILD.gn
@@ -14,6 +14,7 @@ deps = [ "//ash/components/resources:shortcut_customization_app_resources", + "//ash/content/shortcut_customization_ui/backend", "//content/public/browser", "//ui/resources:webui_generated_resources_grd_grit", "//ui/resources:webui_resources_grd_grit",
diff --git a/ash/content/shortcut_customization_ui/backend/BUILD.gn b/ash/content/shortcut_customization_ui/backend/BUILD.gn new file mode 100644 index 0000000..f7ea24d --- /dev/null +++ b/ash/content/shortcut_customization_ui/backend/BUILD.gn
@@ -0,0 +1,26 @@ +# Copyright 2021 The Chromium Authors.All rights reserved. +# Use of this source code is governed by a BSD - style license that can be +# found in the LICENSE file. + +assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") + +static_library("backend") { + sources = [ + "accelerator_configuration_provider.cc", + "accelerator_configuration_provider.h", + ] + + deps = [] +} + +source_set("unit_tests") { + testonly = true + + sources = [ "accelerator_configuration_provider_unittest.cc" ] + + deps = [ + ":backend", + "//base/test:test_support", + "//testing/gtest", + ] +}
diff --git a/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.cc b/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.cc new file mode 100644 index 0000000..f71c28e --- /dev/null +++ b/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
@@ -0,0 +1,14 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.h" + +namespace ash { +namespace shortcut_ui { + +AcceleratorConfigurationProvider::AcceleratorConfigurationProvider() = default; +AcceleratorConfigurationProvider::~AcceleratorConfigurationProvider() = default; + +} // namespace shortcut_ui +} // namespace ash
diff --git a/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.h b/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.h new file mode 100644 index 0000000..2aad568 --- /dev/null +++ b/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.h
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_CONTENT_SHORTCUT_CUSTOMIZATION_UI_BACKEND_ACCELERATOR_CONFIGURATION_PROVIDER_H_ +#define ASH_CONTENT_SHORTCUT_CUSTOMIZATION_UI_BACKEND_ACCELERATOR_CONFIGURATION_PROVIDER_H_ + +namespace ash { +namespace shortcut_ui { + +class AcceleratorConfigurationProvider { + public: + AcceleratorConfigurationProvider(); + AcceleratorConfigurationProvider(const AcceleratorConfigurationProvider&) = + delete; + AcceleratorConfigurationProvider& operator=( + const AcceleratorConfigurationProvider&) = delete; + ~AcceleratorConfigurationProvider(); +}; + +} // namespace shortcut_ui +} // namespace ash + +#endif // ASH_CONTENT_SHORTCUT_CUSTOMIZATION_UI_BACKEND_ACCELERATOR_CONFIGURATION_PROVIDER_H_
diff --git a/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc new file mode 100644 index 0000000..d8b85d6 --- /dev/null +++ b/ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/content/shortcut_customization_ui/backend/accelerator_configuration_provider.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { +namespace shortcut_ui { + +class AcceleratorConfigurationProviderTest : public testing::Test { + public: + AcceleratorConfigurationProviderTest() = default; + ~AcceleratorConfigurationProviderTest() override = default; +}; + +TEST_F(AcceleratorConfigurationProviderTest, DummyTest) { + AcceleratorConfigurationProvider provider; + EXPECT_TRUE(true); +} + +} // namespace shortcut_ui +} // namespace ash
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc index b71f6e1..e547a71 100644 --- a/ash/login/ui/lock_contents_view.cc +++ b/ash/login/ui/lock_contents_view.cc
@@ -1482,6 +1482,62 @@ } } +void LockContentsView::SetMultiprofilePolicyForUserForDebug( + const AccountId& user, + const MultiProfileUserBehavior& multiprofile_policy) { + auto replace = [multiprofile_policy](const LoginUserInfo& user_info) { + auto changed = user_info; + changed.multiprofile_policy = multiprofile_policy; + changed.is_multiprofile_allowed = + multiprofile_policy == MultiProfileUserBehavior::UNRESTRICTED; + return changed; + }; + + LoginBigUserView* big = TryToFindBigUser(user, false /*require_auth_active*/); + if (big) { + big->UpdateForUser(replace(big->GetCurrentUser())); + } + + LoginUserView* user_view = + users_list_ ? users_list_->GetUserView(user) : nullptr; + if (user_view) { + user_view->UpdateForUser(replace(user_view->current_user()), + false /*animate*/); + } + + LayoutAuth(CurrentBigUserView(), nullptr /*opt_to_hide*/, true /*animate*/); +} + +void LockContentsView::ToggleForceOnlineSignInForUserForDebug( + const AccountId& user) { + LockContentsView::UserState* state = FindStateForUser(user); + if (!state) { + LOG(ERROR) << "Unable to find user forcing online sign in"; + return; + } + state->force_online_sign_in = !state->force_online_sign_in; + + LoginBigUserView* big_user = + TryToFindBigUser(user, true /*require_auth_active*/); + if (big_user && big_user->auth_user()) + LayoutAuth(big_user, nullptr /*opt_to_hide*/, true /*animate*/); +} + +void LockContentsView::UndoForceOnlineSignInForUserForDebug( + const AccountId& user) { + LockContentsView::UserState* state = FindStateForUser(user); + if (!state) { + LOG(ERROR) << "Unable to find user forcing online sign in"; + return; + } + state->force_online_sign_in = false; + + LoginBigUserView* big_user = + TryToFindBigUser(user, true /*require_auth_active*/); + if (big_user && big_user->auth_user()) + LayoutAuth(big_user, nullptr /*opt_to_hide*/, true /*animate*/); +} + void LockContentsView::FocusNextWidget(bool reverse) { Shelf* shelf = Shelf::ForWindow(GetWidget()->GetNativeWindow()); // Tell the focus direction to the status area or the shelf so they can focus
diff --git a/ash/login/ui/lock_contents_view.h b/ash/login/ui/lock_contents_view.h index 7e1b88e5..4e46760 100644 --- a/ash/login/ui/lock_contents_view.h +++ b/ash/login/ui/lock_contents_view.h
@@ -229,6 +229,17 @@ // a note in the menu user view. void ToggleManagementForUserForDebug(const AccountId& user); + // Called for debugging to make |user| having a multiprofile policy. + void SetMultiprofilePolicyForUserForDebug( + const AccountId& user, + const MultiProfileUserBehavior& multiprofile_policy); + + // Called for debugging to toggle forced online sign-in form |user|. + void ToggleForceOnlineSignInForUserForDebug(const AccountId& user); + + // Called for debugging to remove forced online sign-in form |user|. + void UndoForceOnlineSignInForUserForDebug(const AccountId& user); + // Called by LockScreenMediaControlsView. void CreateMediaControlsLayout(); void HideMediaControlsLayout();
diff --git a/ash/login/ui/lock_debug_view.cc b/ash/login/ui/lock_debug_view.cc index 0b71f89..317a062 100644 --- a/ash/login/ui/lock_debug_view.cc +++ b/ash/login/ui/lock_debug_view.cc
@@ -68,6 +68,29 @@ constexpr const char kDebugDefaultLocaleTitle[] = "English"; constexpr const char kDebugEnterpriseDomain[] = "library.com"; +enum class DebugAuthEnabledState { + kAuthEnabled, + + // The auth disabled message is displayed because of unicorn account + // restrictions. + kTimeLimitOverride, + kTimeUsageLimit, + kTimeWindowLimit, + + // The auth disabled message is displayed because of multiprofile policy. + // Note that this would only be displayed on the secondary login screen. + kMultiProfilePrimaryOnly, + kMultiProfileNotAllowed, + kMultiProfileOwnerPrimaryOnly, + + // The auth disabled message is displayed because the force online + // sign in is unavailable on the secondary login screen. + // Note that this would only be displayed on the secondary login screen. + kForceOnlineSignIn, + + kMaxValue = kForceOnlineSignIn, +}; + // Additional state for a user that the debug UI needs to reference. struct UserMetadata { explicit UserMetadata(const UserInfo& user_info) @@ -84,6 +107,7 @@ user_manager::UserType type = user_manager::USER_TYPE_REGULAR; EasyUnlockIconState easy_unlock_icon_state = EasyUnlockIconState::NONE; FingerprintState fingerprint_state = FingerprintState::UNAVAILABLE; + DebugAuthEnabledState auth_enable_state = DebugAuthEnabledState::kAuthEnabled; }; std::string DetachableBasePairingStatusToString( @@ -314,7 +338,7 @@ debug_user->account_id, debug_user->enable_tap_to_unlock); } - // Enables fingerprint auth for the user at |user_index|. + // Cycles fingerprint state for the user at |user_index|. void CycleFingerprintStateForUserIndex(size_t user_index) { DCHECK(user_index >= 0 && user_index < debug_users_.size()); UserMetadata* debug_user = &debug_users_[user_index]; @@ -325,6 +349,7 @@ debug_dispatcher_.SetFingerprintState(debug_user->account_id, debug_user->fingerprint_state); } + void AuthenticateFingerprintForUserIndex(size_t user_index, bool success) { DCHECK(user_index >= 0 && user_index < debug_users_.size()); UserMetadata* debug_user = &debug_users_[user_index]; @@ -332,10 +357,10 @@ success); } - // Force online sign-in for the user at |user_index|. - void ForceOnlineSignInForUserIndex(size_t user_index) { + // Toggles force online sign-in for the user at |user_index|. + void ToggleForceOnlineSignInForUserIndex(size_t user_index) { DCHECK(user_index >= 0 && user_index < debug_users_.size()); - debug_dispatcher_.ForceOnlineSignInForUser( + lock_debug_view_->lock()->ToggleForceOnlineSignInForUserForDebug( debug_users_[user_index].account_id); } @@ -346,39 +371,76 @@ debug_users_[user_index].account_id); } - // Updates |auth_disabled_reason_| with the next enum value in a cyclic - // manner. - void UpdateAuthDisabledReason() { - switch (auth_disabled_reason_) { - case AuthDisabledReason::kTimeLimitOverride: - auth_disabled_reason_ = AuthDisabledReason::kTimeUsageLimit; + // Cycles disabled auth message for the user at |user_index|. + void CycleDisabledAuthMessageForUserIndex(size_t user_index) { + DCHECK(user_index >= 0 && user_index < debug_users_.size()); + UserMetadata* debug_user = &debug_users_[user_index]; + + debug_user->auth_enable_state = static_cast<DebugAuthEnabledState>( + (static_cast<int>(debug_user->auth_enable_state) + 1) % + (static_cast<int>(DebugAuthEnabledState::kMaxValue) + 1)); + + debug_user->enable_auth = true; + AuthDisabledReason reason; + MultiProfileUserBehavior behavior = MultiProfileUserBehavior::UNRESTRICTED; + + switch (debug_user->auth_enable_state) { + case DebugAuthEnabledState::kAuthEnabled: + debug_user->enable_auth = true; break; - case AuthDisabledReason::kTimeUsageLimit: - auth_disabled_reason_ = AuthDisabledReason::kTimeWindowLimit; + case DebugAuthEnabledState::kTimeLimitOverride: + reason = AuthDisabledReason::kTimeLimitOverride; break; - case AuthDisabledReason::kTimeWindowLimit: - auth_disabled_reason_ = AuthDisabledReason::kTimeLimitOverride; + case DebugAuthEnabledState::kTimeUsageLimit: + reason = AuthDisabledReason::kTimeUsageLimit; + break; + case DebugAuthEnabledState::kTimeWindowLimit: + reason = AuthDisabledReason::kTimeWindowLimit; + break; + case DebugAuthEnabledState::kMultiProfilePrimaryOnly: + behavior = MultiProfileUserBehavior::PRIMARY_ONLY; + break; + case DebugAuthEnabledState::kMultiProfileNotAllowed: + behavior = MultiProfileUserBehavior::NOT_ALLOWED; + break; + case DebugAuthEnabledState::kMultiProfileOwnerPrimaryOnly: + behavior = MultiProfileUserBehavior::OWNER_PRIMARY_ONLY; + break; + case DebugAuthEnabledState::kForceOnlineSignIn: break; } - } - // Toggle the unlock allowed state for the user at |user_index|. - void ToggleAuthEnabledForUserIndex(size_t user_index) { - DCHECK(user_index >= 0 && user_index < debug_users_.size()); - UserMetadata& user = debug_users_[user_index]; - user.enable_auth = !user.enable_auth; - if (user.enable_auth) { - debug_dispatcher_.EnableAuthForUser(user.account_id); - } else { - debug_dispatcher_.DisableAuthForUser( - user.account_id, - AuthDisabledData(auth_disabled_reason_, - base::Time::Now() + - base::TimeDelta::FromHours(user_index) + - base::TimeDelta::FromHours(8), - base::TimeDelta::FromMinutes(15), - true /*bool disable_lock_screen_media*/)); - UpdateAuthDisabledReason(); + debug_dispatcher_.EnableAuthForUser(debug_user->account_id); + lock_debug_view_->lock()->SetMultiprofilePolicyForUserForDebug( + debug_users_[user_index].account_id, behavior); + lock_debug_view_->lock()->UndoForceOnlineSignInForUserForDebug( + debug_users_[user_index].account_id); + + switch (debug_user->auth_enable_state) { + case DebugAuthEnabledState::kAuthEnabled: + break; + case DebugAuthEnabledState::kTimeLimitOverride: + case DebugAuthEnabledState::kTimeUsageLimit: + case DebugAuthEnabledState::kTimeWindowLimit: + debug_dispatcher_.DisableAuthForUser( + debug_user->account_id, + AuthDisabledData(reason, + base::Time::Now() + + base::TimeDelta::FromHours(user_index) + + base::TimeDelta::FromHours(8), + base::TimeDelta::FromMinutes(15), + true /*bool disable_lock_screen_media*/)); + break; + case DebugAuthEnabledState::kMultiProfilePrimaryOnly: + case DebugAuthEnabledState::kMultiProfileNotAllowed: + case DebugAuthEnabledState::kMultiProfileOwnerPrimaryOnly: + lock_debug_view_->lock()->SetMultiprofilePolicyForUserForDebug( + debug_users_[user_index].account_id, behavior); + break; + case DebugAuthEnabledState::kForceOnlineSignIn: + debug_dispatcher_.ForceOnlineSignInForUser( + debug_users_[user_index].account_id); + break; } } @@ -525,11 +587,6 @@ // LockDebugView or LockContentsView in order to do so. LockDebugView* const lock_debug_view_; - // When auth is disabled, this property is used to define the reason, which - // customizes the UI accordingly. - AuthDisabledReason auth_disabled_reason_ = - AuthDisabledReason::kTimeLimitOverride; - DISALLOW_COPY_AND_ASSIGN(DebugDataDispatcherTransformer); }; @@ -1055,10 +1112,10 @@ base::Unretained(debug_data_dispatcher_.get()), i, false), row); AddButton( - "Force online sign-in", - base::BindRepeating( - &DebugDataDispatcherTransformer::ForceOnlineSignInForUserIndex, - base::Unretained(debug_data_dispatcher_.get()), i), + "Toggle force online sign-in", + base::BindRepeating(&DebugDataDispatcherTransformer:: + ToggleForceOnlineSignInForUserIndex, + base::Unretained(debug_data_dispatcher_.get()), i), row); AddButton("Toggle user is managed", base::BindRepeating( @@ -1066,10 +1123,10 @@ base::Unretained(debug_data_dispatcher_.get()), i), row); AddButton( - "Toggle auth enabled", - base::BindRepeating( - &DebugDataDispatcherTransformer::ToggleAuthEnabledForUserIndex, - base::Unretained(debug_data_dispatcher_.get()), i), + "Cycle disabled auth", + base::BindRepeating(&DebugDataDispatcherTransformer:: + CycleDisabledAuthMessageForUserIndex, + base::Unretained(debug_data_dispatcher_.get()), i), row); if (debug_detachable_base_model_->debugging_pairing_state() &&
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc index fa9fc8c..93e7899a 100644 --- a/ash/login/ui/login_auth_user_view.cc +++ b/ash/login/ui/login_auth_user_view.cc
@@ -683,7 +683,12 @@ DISALLOW_COPY_AND_ASSIGN(ChallengeResponseView); }; -// The message shown to user when the auth method is |AUTH_DISABLED|. +// The message shown to the user when auth is disabled. This could happen when: +// -auth method is |AUTH_DISABLED| +// -auth method is |AUTH_ONLINE_SIGN_IN| and the user is on the secondary login +// screen +// -the selected account has a restricted multiprofile policy set and the user +// is on the secondary login screen class LoginAuthUserView::DisabledAuthMessageView : public views::View { public: class ASH_EXPORT TestApi { @@ -699,14 +704,7 @@ DisabledAuthMessageView* const view_; }; - // If the reason of disabled auth is multiprofile policy, then we can already - // set the text and message. Otherwise, in case of disabled auth because of - // time limit exceeded on child account, we wait for SetAuthDisabledMessage to - // be called. - DisabledAuthMessageView(bool shown_because_of_multiprofile_policy, - MultiProfileUserBehavior multiprofile_policy) - : shown_because_of_multiprofile_policy_( - shown_because_of_multiprofile_policy) { + DisabledAuthMessageView() { SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical, gfx::Insets(kDisabledAuthMessageVerticalBorderDp, @@ -714,16 +712,12 @@ kDisabledAuthMessageChildrenSpacingDp)); SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); - SetPreferredSize(gfx::Size(shown_because_of_multiprofile_policy - ? kDisabledAuthMessageMultiprofileWidthDp - : kDisabledAuthMessageTimeWidthDp, - kDisabledAuthMessageHeightDp)); SetFocusBehavior(FocusBehavior::ALWAYS); - if (!shown_because_of_multiprofile_policy) { - message_icon_ = AddChildView(std::make_unique<views::ImageView>()); - message_icon_->SetImageSize(gfx::Size(kDisabledAuthMessageIconSizeDp, - kDisabledAuthMessageIconSizeDp)); - } + + // The icon size has to be defined later if the image will be visible. + message_icon_ = AddChildView(std::make_unique<views::ImageView>()); + message_icon_->SetImageSize(gfx::Size(kDisabledAuthMessageIconSizeDp, + kDisabledAuthMessageIconSizeDp)); auto decorate_label = [](views::Label* label) { label->SetSubpixelRenderingEnabled(false); @@ -746,27 +740,6 @@ gfx::Font::NORMAL, gfx::Font::Weight::NORMAL)); decorate_label(message_contents_); message_contents_->SetMultiLine(true); - - if (shown_because_of_multiprofile_policy) { - message_title_->SetText(l10n_util::GetStringUTF16( - IDS_ASH_LOGIN_MULTI_PROFILES_RESTRICTED_POLICY_TITLE)); - switch (multiprofile_policy) { - case MultiProfileUserBehavior::PRIMARY_ONLY: - message_contents_->SetText(l10n_util::GetStringUTF16( - IDS_ASH_LOGIN_MULTI_PROFILES_PRIMARY_ONLY_POLICY_MSG)); - break; - case MultiProfileUserBehavior::NOT_ALLOWED: - message_contents_->SetText(l10n_util::GetStringUTF16( - IDS_ASH_LOGIN_MULTI_PROFILES_NOT_ALLOWED_POLICY_MSG)); - break; - case MultiProfileUserBehavior::OWNER_PRIMARY_ONLY: - message_contents_->SetText(l10n_util::GetStringUTF16( - IDS_ASH_LOGIN_MULTI_PROFILES_OWNER_PRIMARY_ONLY_MSG)); - break; - default: - NOTREACHED(); - } - } } ~DisabledAuthMessageView() override = default; @@ -774,17 +747,26 @@ // Set the parameters needed to render the message. void SetAuthDisabledMessage(const AuthDisabledData& auth_disabled_data, bool use_24hour_clock) { - // Do not do anything if message is already shown. - if (shown_because_of_multiprofile_policy_) - return; LockScreenMessage message = GetLockScreenMessage( auth_disabled_data.reason, auth_disabled_data.auth_reenabled_time, auth_disabled_data.device_used_time, use_24hour_clock); + SetPreferredSize(gfx::Size(kDisabledAuthMessageTimeWidthDp, + kDisabledAuthMessageHeightDp)); + message_icon_->SetVisible(true); message_vector_icon_ = message.icon; message_title_->SetText(message.title); message_contents_->SetText(message.content); UpdateColors(); - Layout(); + } + + void SetAuthDisabledMessage(const std::u16string& title, + const std::u16string& content) { + SetPreferredSize(gfx::Size(kDisabledAuthMessageMultiprofileWidthDp, + kDisabledAuthMessageHeightDp)); + message_icon_->SetVisible(false); + message_title_->SetText(title); + message_contents_->SetText(content); + UpdateColors(); } // views::View: @@ -828,10 +810,6 @@ views::Label* message_contents_; views::ImageView* message_icon_; const gfx::VectorIcon* message_vector_icon_ = nullptr; - // Used in case a child account has triggered the disabled auth message - // because of time limit exceeded while it also has disabled auth by - // multiprofile policy. - bool shown_because_of_multiprofile_policy_ = false; DISALLOW_COPY_AND_ASSIGN(DisabledAuthMessageView); }; @@ -1000,7 +978,7 @@ } views::Button* LoginAuthUserView::TestApi::online_sign_in_message() const { - return view_->online_sign_in_message_; + return view_->online_sign_in_button_; } views::View* LoginAuthUserView::TestApi::disabled_auth_message() const { @@ -1113,22 +1091,15 @@ button_message = l10n_util::GetStringUTF16(IDS_ASH_LOCK_SCREEN_VERIFY_ACCOUNT_MESSAGE); } - bool is_login_secondary = - Shell::Get()->session_controller()->GetSessionState() == - session_manager::SessionState::LOGIN_SECONDARY; + auto online_sign_in_button = std::make_unique<SystemLabelButton>( base::BindRepeating(&LoginAuthUserView::OnOnlineSignInMessageTap, base::Unretained(this)), button_message, SystemLabelButton::DisplayType::ALERT_WITH_ICON, /*multiline*/ false); - // Disable online sign-in on secondary login screen as there is no OOBE there. - online_sign_in_button->SetEnabled(!is_login_secondary); - online_sign_in_message_ = online_sign_in_button.get(); + online_sign_in_button_ = online_sign_in_button.get(); - bool shown_because_of_multiprofile_policy = - !user.is_multiprofile_allowed && is_login_secondary; - auto disabled_auth_message = std::make_unique<DisabledAuthMessageView>( - shown_because_of_multiprofile_policy, user.multiprofile_policy); + auto disabled_auth_message = std::make_unique<DisabledAuthMessageView>(); disabled_auth_message_ = disabled_auth_message.get(); auto locked_tpm_message_view = std::make_unique<LockedTpmMessageView>(); @@ -1235,11 +1206,13 @@ add_view(wrapped_challenge_response_view_ptr); add_padding(kDistanceFromPinKeyboardToBigUserViewBottomDp); + // The user needs to be set before SetAuthMethods is called. + user_view_->UpdateForUser(user, /*animate*/ false); + // Update authentication UI. CaptureStateForAnimationPreLayout(); SetAuthMethods(auth_methods_); ApplyAnimationPostLayout(/*animate*/ false); - user_view_->UpdateForUser(user, /*animate*/ false); } LoginAuthUserView::~LoginAuthUserView() = default; @@ -1256,8 +1229,37 @@ UpdateInputFieldMode(); const UiState current_state{this}; - online_sign_in_message_->SetVisible(current_state.force_online_sign_in); - disabled_auth_message_->SetVisible(current_state.auth_disabled); + auto user = current_user(); + const std::u16string user_display_email = + base::UTF8ToUTF16(user.basic_user_info.display_email); + bool is_secondary_login = + Shell::Get()->session_controller()->GetSessionState() == + session_manager::SessionState::LOGIN_SECONDARY; + + if (is_secondary_login && !user.is_multiprofile_allowed) { + online_sign_in_button_->SetVisible(false); + disabled_auth_message_->SetVisible(true); + disabled_auth_message_->SetAuthDisabledMessage( + l10n_util::GetStringUTF16( + IDS_ASH_LOGIN_MULTI_PROFILES_RESTRICTED_POLICY_TITLE), + GetMultiprofileDisableAuthMessage()); + } + // We do not want the online sign in button to be visible on the secondary + // login screen since we can not call OOBE there. In such a case, we indicate + // the user to return on the login screen to go through online sign in. + else if (is_secondary_login && current_state.force_online_sign_in) { + online_sign_in_button_->SetVisible(false); + disabled_auth_message_->SetVisible(true); + disabled_auth_message_->SetAuthDisabledMessage( + l10n_util::GetStringUTF16(IDS_ASH_LOGIN_SIGN_IN_REQUIRED_MESSAGE), + l10n_util::GetStringFUTF16( + IDS_ASH_LOGIN_SIGN_IN_REQUIRED_SECONDARY_LOGIN_MESSAGE, + user_display_email, user_display_email)); + } else { + online_sign_in_button_->SetVisible(current_state.force_online_sign_in); + disabled_auth_message_->SetVisible(current_state.auth_disabled); + } + locked_tpm_message_view_->SetVisible(current_state.tpm_is_locked); if (current_state.tpm_is_locked && auth_metadata.time_until_tpm_unlock.has_value()) @@ -1291,11 +1293,8 @@ padding_below_password_view_->SetPreferredSize(GetPaddingBelowPasswordView()); password_view_->SetPlaceholderText(GetPasswordViewPlaceholder()); - const std::string& user_display_email = - current_user().basic_user_info.display_email; password_view_->SetAccessibleName(l10n_util::GetStringFUTF16( - IDS_ASH_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME, - base::UTF8ToUTF16(user_display_email))); + IDS_ASH_LOGIN_POD_PASSWORD_FIELD_ACCESSIBLE_NAME, user_display_email)); // Only the active auth user view has authentication methods. If that is the // case, then render the user view as if it was always focused, since clicking @@ -1514,7 +1513,7 @@ password_view_->SetDisplayPasswordButtonVisible( user.show_display_password_button); } - online_sign_in_message_->SetText( + online_sign_in_button_->SetText( l10n_util::GetStringUTF16(IDS_ASH_LOGIN_SIGN_IN_REQUIRED_MESSAGE)); } @@ -1530,7 +1529,6 @@ const AuthDisabledData& auth_disabled_data) { disabled_auth_message_->SetAuthDisabledMessage( auth_disabled_data, current_user().use_24hour_clock); - Layout(); } const LoginUserInfo& LoginAuthUserView::current_user() const { @@ -1832,7 +1830,7 @@ return SizeFromHeight(0); } -std::u16string LoginAuthUserView::GetPinPasswordToggleText() { +std::u16string LoginAuthUserView::GetPinPasswordToggleText() const { if (input_field_mode_ == InputFieldMode::PWD_WITH_TOGGLE) return l10n_util::GetStringUTF16(IDS_ASH_LOGIN_SWITCH_TO_PIN); else @@ -1852,4 +1850,24 @@ return l10n_util::GetStringUTF16(IDS_ASH_LOGIN_POD_PASSWORD_PLACEHOLDER); } +std::u16string LoginAuthUserView::GetMultiprofileDisableAuthMessage() const { + int message_id; + switch (current_user().multiprofile_policy) { + case MultiProfileUserBehavior::PRIMARY_ONLY: + message_id = IDS_ASH_LOGIN_MULTI_PROFILES_PRIMARY_ONLY_POLICY_MSG; + break; + case MultiProfileUserBehavior::NOT_ALLOWED: + message_id = IDS_ASH_LOGIN_MULTI_PROFILES_NOT_ALLOWED_POLICY_MSG; + break; + case MultiProfileUserBehavior::OWNER_PRIMARY_ONLY: + message_id = IDS_ASH_LOGIN_MULTI_PROFILES_OWNER_PRIMARY_ONLY_MSG; + break; + case MultiProfileUserBehavior::UNRESTRICTED: + NOTREACHED(); + message_id = 0; + break; + } + return l10n_util::GetStringUTF16(message_id); +} + } // namespace ash
diff --git a/ash/login/ui/login_auth_user_view.h b/ash/login/ui/login_auth_user_view.h index 19ea809..c44b9e21 100644 --- a/ash/login/ui/login_auth_user_view.h +++ b/ash/login/ui/login_auth_user_view.h
@@ -252,8 +252,9 @@ gfx::Size GetPaddingBelowPasswordView() const; // Convenience methods to determine UI text based on the InputFieldMode. - std::u16string GetPinPasswordToggleText(); + std::u16string GetPinPasswordToggleText() const; std::u16string GetPasswordViewPlaceholder() const; + std::u16string GetMultiprofileDisableAuthMessage() const; // Authentication methods available and extra parameters that control the UI. AuthMethods auth_methods_ = AUTH_NONE; @@ -268,7 +269,7 @@ LoginPinInputView* pin_input_view_ = nullptr; views::LabelButton* pin_password_toggle_ = nullptr; LoginPinView* pin_view_ = nullptr; - views::LabelButton* online_sign_in_message_ = nullptr; + views::LabelButton* online_sign_in_button_ = nullptr; DisabledAuthMessageView* disabled_auth_message_ = nullptr; FingerprintView* fingerprint_view_ = nullptr; ChallengeResponseView* challenge_response_view_ = nullptr;
diff --git a/ash/public/cpp/ambient/ambient_backend_controller.h b/ash/public/cpp/ambient/ambient_backend_controller.h index 791a427..6d608f7 100644 --- a/ash/public/cpp/ambient/ambient_backend_controller.h +++ b/ash/public/cpp/ambient/ambient_backend_controller.h
@@ -17,7 +17,7 @@ namespace ash { enum class AmbientModeTopicType { - kCurated, + kCurated = 0, kPersonal, kFeatured, kGeo, @@ -42,10 +42,16 @@ // Image url. std::string url; - // Only support portrait image tiling in landscape orientation. - absl::optional<std::string> related_image_url; + std::string related_image_url; + + std::string related_details; AmbientModeTopicType topic_type = AmbientModeTopicType::kOther; + + // Whether the original image is portrait or not. Cannot use aspect ratio of + // the fetched image to determine it because the fetched image could be + // cropped. + bool is_portrait = false; }; // WeatherInfo contains the weather information we need for rendering a
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc index 8ef99173..7350efdc 100644 --- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc +++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc
@@ -90,6 +90,7 @@ ash::AmbientModeTopic topic; topic.url = kFakeUrl; topic.details = kFakeDetails; + topic.is_portrait = is_portrait_; topic.related_image_url = kFakeUrl; topic.topic_type = AmbientModeTopicType::kCulturalInstitute; @@ -199,4 +200,8 @@ weather_info_ = std::move(info); } +void FakeAmbientBackendControllerImpl::SetPhotoOrientation(bool portrait) { + is_portrait_ = portrait; +} + } // namespace ash
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h index 511d6b9..14ca7c6 100644 --- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h +++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h
@@ -66,12 +66,16 @@ // `FetchWeather`. void SetWeatherInfo(absl::optional<WeatherInfo> info); + void SetPhotoOrientation(bool portrait); + private: OnSettingsAndAlbumsFetchedCallback pending_fetch_settings_albums_callback_; UpdateSettingsCallback pending_update_callback_; absl::optional<WeatherInfo> weather_info_; + + bool is_portrait_ = false; }; } // namespace ash
diff --git a/ash/public/cpp/holding_space/holding_space_item.cc b/ash/public/cpp/holding_space/holding_space_item.cc index 19862a25..7ee0701 100644 --- a/ash/public/cpp/holding_space/holding_space_item.cc +++ b/ash/public/cpp/holding_space/holding_space_item.cc
@@ -228,6 +228,16 @@ return true; } +bool HoldingSpaceItem::SetCurrentSizeInBytes( + const absl::optional<int64_t>& current_size_in_bytes) { + if (current_size_in_bytes_ == current_size_in_bytes) + return false; + + DCHECK(!current_size_in_bytes || current_size_in_bytes >= 0); + current_size_in_bytes_ = current_size_in_bytes; + return true; +} + HoldingSpaceItem::HoldingSpaceItem(Type type, const std::string& id, const base::FilePath& file_path,
diff --git a/ash/public/cpp/holding_space/holding_space_item.h b/ash/public/cpp/holding_space/holding_space_item.h index a67bc63..62e3ebf 100644 --- a/ash/public/cpp/holding_space/holding_space_item.h +++ b/ash/public/cpp/holding_space/holding_space_item.h
@@ -134,6 +134,11 @@ // NOTE: Only in-progress items can be paused. bool SetPaused(bool paused); + // Sets the current size (in bytes) of the file backing this item. + // NOTE: If present, the `current_size_in_bytes` must be >= `0`. + bool SetCurrentSizeInBytes( + const absl::optional<int64_t>& current_size_in_bytes); + const std::string& id() const { return id_; } Type type() const { return type_; } @@ -148,6 +153,10 @@ const absl::optional<float>& progress() const { return progress_; } + const absl::optional<int64_t>& current_size_in_bytes() const { + return current_size_in_bytes_; + } + HoldingSpaceImage& image_for_testing() { return *image_; } private: @@ -186,6 +195,12 @@ // NOTE: Only in-progress items can be paused. bool paused_ = false; + // The current size (in bytes) of the file backing this item. + // NOTE: If present, the `current_size_in_bytes` is >= `0`. + // NOTE: This is currently set only in response to updates of in-progress + // downloads and only used when `progress_` != `1.f`. + absl::optional<int64_t> current_size_in_bytes_; + // Mutable to allow const access from `AddDeletionCallback()`. mutable base::RepeatingClosureList deletion_callback_list_; };
diff --git a/ash/public/cpp/holding_space/holding_space_item_unittest.cc b/ash/public/cpp/holding_space/holding_space_item_unittest.cc index 6e48a2fe..fcec49f 100644 --- a/ash/public/cpp/holding_space/holding_space_item_unittest.cc +++ b/ash/public/cpp/holding_space/holding_space_item_unittest.cc
@@ -153,6 +153,31 @@ EXPECT_EQ(holding_space_item->progress(), 1.f); } +// Tests setting the current size (in bytes) for each holding space item type. +TEST_P(HoldingSpaceItemTest, CurrentSizeInBytes) { + // Create a `holding_space_item`. + auto holding_space_item = HoldingSpaceItem::CreateFileBackedItem( + /*type=*/GetParam(), base::FilePath("file_path"), + GURL("filesystem::file_system_url"), + /*image_resolver=*/base::BindOnce(&CreateFakeHoldingSpaceImage)); + + // Initially the current size should be absent. + EXPECT_FALSE(holding_space_item->current_size_in_bytes()); + EXPECT_FALSE(holding_space_item->current_size_in_bytes()); + + // It should be possible to update current size to a new value. + EXPECT_TRUE(holding_space_item->SetCurrentSizeInBytes(100)); + EXPECT_EQ(holding_space_item->current_size_in_bytes(), 100); + + // It should no-op to try to update current size to its existing value. + EXPECT_FALSE(holding_space_item->SetCurrentSizeInBytes(100)); + EXPECT_EQ(holding_space_item->current_size_in_bytes(), 100); + + // It should be possible to unset current size. + EXPECT_TRUE(holding_space_item->SetCurrentSizeInBytes(absl::nullopt)); + EXPECT_FALSE(holding_space_item->current_size_in_bytes()); +} + INSTANTIATE_TEST_SUITE_P(All, HoldingSpaceItemTest, testing::ValuesIn(GetHoldingSpaceItemTypes()));
diff --git a/ash/public/cpp/holding_space/holding_space_model.cc b/ash/public/cpp/holding_space/holding_space_model.cc index 53b06dc..9fe48aaf 100644 --- a/ash/public/cpp/holding_space/holding_space_model.cc +++ b/ash/public/cpp/holding_space/holding_space_model.cc
@@ -33,6 +33,10 @@ if (progress_) did_update |= item_->SetProgress(progress_.value()); + // Update current size. + if (current_size_in_bytes_) + did_update |= item_->SetCurrentSizeInBytes(current_size_in_bytes_.value()); + // Notify observers if and only if an update occurred. if (did_update) { for (auto& observer : model_->observers_) @@ -62,6 +66,14 @@ return *this; } +HoldingSpaceModel::ScopedItemUpdate& +HoldingSpaceModel::ScopedItemUpdate::SetCurrentSizeInBytes( + const absl::optional<int64_t>& current_size_in_bytes) { + DCHECK(!current_size_in_bytes || current_size_in_bytes >= 0); + current_size_in_bytes_ = current_size_in_bytes; + return *this; +} + HoldingSpaceModel::ScopedItemUpdate::ScopedItemUpdate(HoldingSpaceModel* model, HoldingSpaceItem* item) : model_(model), item_(item) {
diff --git a/ash/public/cpp/holding_space/holding_space_model.h b/ash/public/cpp/holding_space/holding_space_model.h index 814feea..9333af07 100644 --- a/ash/public/cpp/holding_space/holding_space_model.h +++ b/ash/public/cpp/holding_space/holding_space_model.h
@@ -59,6 +59,12 @@ // NOTE: Once set to `1.f`, holding space item progress becomes read-only. ScopedItemUpdate& SetProgress(const absl::optional<float>& progress); + // Sets the current size (in bytes) of the file backing the item and returns + // a reference to `this`. + // NOTE: If present, the `current_size_in_bytes` must be >= `0`. + ScopedItemUpdate& SetCurrentSizeInBytes( + const absl::optional<int64_t>& current_size_in_bytes); + private: friend class HoldingSpaceModel; ScopedItemUpdate(HoldingSpaceModel* model, HoldingSpaceItem* item); @@ -70,6 +76,7 @@ absl::optional<GURL> file_system_url_; absl::optional<bool> paused_; absl::optional<absl::optional<float>> progress_; + absl::optional<absl::optional<int64_t>> current_size_in_bytes_; }; HoldingSpaceModel();
diff --git a/ash/public/cpp/holding_space/holding_space_model_unittest.cc b/ash/public/cpp/holding_space/holding_space_model_unittest.cc index 600eaef..472c45d 100644 --- a/ash/public/cpp/holding_space/holding_space_model_unittest.cc +++ b/ash/public/cpp/holding_space/holding_space_model_unittest.cc
@@ -150,12 +150,19 @@ EXPECT_EQ(observation.TakeUpdatedItemCount(), 1); EXPECT_EQ(item_ptr->progress(), 0.5f); + // Update current size + model().UpdateItem(item_ptr->id())->SetCurrentSizeInBytes(100); + EXPECT_EQ(observation.TakeLastUpdatedItem(), item_ptr); + EXPECT_EQ(observation.TakeUpdatedItemCount(), 1); + EXPECT_EQ(item_ptr->current_size_in_bytes(), 100); + // Update all attributes. updated_file_path = base::FilePath("again_updated_file_path"); updated_file_system_url = GURL("filesystem::again_updated_file_system_url"); model() .UpdateItem(item_ptr->id()) ->SetBackingFile(updated_file_path, updated_file_system_url) + .SetCurrentSizeInBytes(200) .SetPaused(false) .SetProgress(0.75f); EXPECT_EQ(observation.TakeLastUpdatedItem(), item_ptr); @@ -164,6 +171,7 @@ EXPECT_EQ(item_ptr->file_system_url(), updated_file_system_url); EXPECT_FALSE(item_ptr->IsPaused()); EXPECT_EQ(item_ptr->progress(), 0.75f); + EXPECT_EQ(item_ptr->current_size_in_bytes(), 200); } // Verifies that updating items will no-op appropriately. @@ -194,6 +202,7 @@ model() .UpdateItem(item_ptr->id()) ->SetBackingFile(item_ptr->file_path(), item_ptr->file_system_url()) + .SetCurrentSizeInBytes(absl::nullopt) .SetPaused(item_ptr->IsPaused()) .SetProgress(item_ptr->progress()); EXPECT_EQ(observation.TakeUpdatedItemCount(), 0);
diff --git a/ash/public/cpp/holding_space/holding_space_test_api.h b/ash/public/cpp/holding_space/holding_space_test_api.h index 2bd64a21..7ad60ec 100644 --- a/ash/public/cpp/holding_space/holding_space_test_api.h +++ b/ash/public/cpp/holding_space/holding_space_test_api.h
@@ -14,6 +14,10 @@ class Window; } // namespace aura +namespace base { +class FilePath; +} // namespace base + namespace views { class View; } // namespace views @@ -47,7 +51,11 @@ // otherwise. bool IsShowingInShelf(); - // Returns the `item_id` associated with the given `item_view`. + // Returns the item file path associated with the given `item_view`. + const base::FilePath& GetHoldingSpaceItemFilePath( + const views::View* item_view) const; + + // Returns the item ID associated with the given `item_view`. const std::string& GetHoldingSpaceItemId(const views::View* item_view) const; // Returns the holding space item view within `item_views` associated with the
diff --git a/ash/public/cpp/quick_answers/quick_answers_state.cc b/ash/public/cpp/quick_answers/quick_answers_state.cc index 923f71e..a59d2e0 100644 --- a/ash/public/cpp/quick_answers/quick_answers_state.cc +++ b/ash/public/cpp/quick_answers/quick_answers_state.cc
@@ -76,8 +76,13 @@ chromeos::quick_answers::prefs::kQuickAnswersEnabled, base::BindRepeating(&QuickAnswersState::UpdateSettingsEnabled, base::Unretained(this))); + pref_change_registrar_->Add( + chromeos::quick_answers::prefs::kQuickAnswersConsented, + base::BindRepeating(&QuickAnswersState::UpdateUserConsented, + base::Unretained(this))); UpdateSettingsEnabled(); + UpdateUserConsented(); prefs_initialized_ = true; } @@ -108,7 +113,7 @@ void QuickAnswersState::UpdateSettingsEnabled() { auto settings_enabled = pref_change_registrar_->prefs()->GetBoolean( chromeos::quick_answers::prefs::kQuickAnswersEnabled); - if (prefs_initialized_ && settings_enabled_ == settings_enabled) { + if (settings_enabled_ == settings_enabled) { return; } settings_enabled_ = settings_enabled; @@ -118,6 +123,15 @@ UpdateEligibility(); } +void QuickAnswersState::UpdateUserConsented() { + auto user_consented = pref_change_registrar_->prefs()->GetBoolean( + chromeos::quick_answers::prefs::kQuickAnswersConsented); + if (user_consented_ == user_consented) { + return; + } + user_consented_ = user_consented; +} + void QuickAnswersState::UpdateEligibility() { if (chromeos::features::IsQuickAnswersStandaloneSettingsEnabled()) { if (!pref_change_registrar_)
diff --git a/ash/public/cpp/quick_answers/quick_answers_state.h b/ash/public/cpp/quick_answers/quick_answers_state.h index 78a9761..e6a6e309 100644 --- a/ash/public/cpp/quick_answers/quick_answers_state.h +++ b/ash/public/cpp/quick_answers/quick_answers_state.h
@@ -53,6 +53,7 @@ void OnLocaleChanged(const std::string& locale) override; bool settings_enabled() const { return settings_enabled_; } + bool user_consented() const { return user_consented_; } bool is_eligible() const { return is_eligible_; } void set_eligibility_for_testing(bool is_eligible) { @@ -64,6 +65,7 @@ // Called when the related preferences are obtained from the pref service. void UpdateSettingsEnabled(); + void UpdateUserConsented(); // Called when the feature eligibility might change. void UpdateEligibility(); @@ -71,6 +73,9 @@ // Whether the Quick Answers is enabled in system settings. bool settings_enabled_ = false; + // Whether the Quick Answers feature has been consented by user. + bool user_consented_ = false; + // Whether the Quick Answers feature is eligible. The value is derived from a // number of other states. bool is_eligible_ = false;
diff --git a/ash/public/cpp/rounded_image_view.cc b/ash/public/cpp/rounded_image_view.cc index b1d7ebc7d..11d8a3d 100644 --- a/ash/public/cpp/rounded_image_view.cc +++ b/ash/public/cpp/rounded_image_view.cc
@@ -12,6 +12,9 @@ namespace ash { +RoundedImageView::RoundedImageView() + : RoundedImageView(/*corner_radius=*/0, Alignment::kLeading) {} + RoundedImageView::RoundedImageView(int corner_radius, Alignment alignment) : alignment_(alignment) { for (int i = 0; i < 4; ++i) @@ -54,6 +57,10 @@ corner_radius_[3] = bottom_left; } +void RoundedImageView::SetCornerRadius(int corner_radius) { + SetCornerRadii(corner_radius, corner_radius, corner_radius, corner_radius); +} + gfx::Size RoundedImageView::CalculatePreferredSize() const { return gfx::Size(GetImageSize().width() + GetInsets().width(), GetImageSize().height() + GetInsets().height());
diff --git a/ash/public/cpp/rounded_image_view.h b/ash/public/cpp/rounded_image_view.h index 0811b64..2651793 100644 --- a/ash/public/cpp/rounded_image_view.h +++ b/ash/public/cpp/rounded_image_view.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image_skia.h" +#include "ui/views/metadata/view_factory.h" #include "ui/views/view.h" namespace ash { @@ -25,8 +26,7 @@ kCenter }; - // Constructs a new rounded image view with rounded corners of radius - // |corner_radius|. + RoundedImageView(); RoundedImageView(int corner_radius, Alignment alignment); ~RoundedImageView() override; @@ -43,6 +43,9 @@ int bottom_right, int bottom_left); + // Sets all radii of the corners collectively. + void SetCornerRadius(int corner_radius); + // views::View: gfx::Size CalculatePreferredSize() const override; void OnPaint(gfx::Canvas* canvas) override; @@ -63,6 +66,12 @@ DISALLOW_COPY_AND_ASSIGN(RoundedImageView); }; +BEGIN_VIEW_BUILDER(ASH_PUBLIC_EXPORT, RoundedImageView, views::View) +VIEW_BUILDER_PROPERTY(int, CornerRadius) +END_VIEW_BUILDER + } // namespace ash +DEFINE_VIEW_BUILDER(ASH_PUBLIC_EXPORT, ash::RoundedImageView) + #endif // ASH_PUBLIC_CPP_ROUNDED_IMAGE_VIEW_H_
diff --git a/ash/public/cpp/shell_window_ids.h b/ash/public/cpp/shell_window_ids.h index 430c190..5b2d238 100644 --- a/ash/public/cpp/shell_window_ids.h +++ b/ash/public/cpp/shell_window_ids.h
@@ -32,9 +32,7 @@ // A higher-level container that holds all of the containers stacked below // kShellWindowId_LockScreenContainer. Only used by PowerButtonController for - // animating lower-level containers and AccessibilityController for hiding - // non-lock screen windows from Accessibility when the user session is - // blocked. + // animating lower-level containers. kShellWindowId_NonLockScreenContainersContainer, // A higher-level container that holds containers that hold lock-screen
diff --git a/ash/quick_answers/quick_answers_controller_impl.cc b/ash/quick_answers/quick_answers_controller_impl.cc index 7be2568c..dda3108 100644 --- a/ash/quick_answers/quick_answers_controller_impl.cc +++ b/ash/quick_answers/quick_answers_controller_impl.cc
@@ -11,7 +11,9 @@ #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" +#include "chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h" #include "chromeos/components/quick_answers/quick_answers_notice.h" +#include "components/prefs/pref_service.h" #include "ui/base/l10n/l10n_util.h" #include "url/gurl.h" @@ -101,7 +103,13 @@ void QuickAnswersControllerImpl::HandleQuickAnswerRequest( const chromeos::quick_answers::QuickAnswersRequest& request) { - if (ShouldShowUserNotice()) { + if (chromeos::features::IsQuickAnswersStandaloneSettingsEnabled() && + !QuickAnswersState::Get()->user_consented()) { + ShowUserConsent( + IntentTypeToString(request.preprocessed_output.intent_info.intent_type), + base::UTF8ToUTF16(request.preprocessed_output.intent_info.intent_text)); + } else if (!chromeos::features::IsQuickAnswersStandaloneSettingsEnabled() && + ShouldShowUserNotice()) { ShowUserNotice( IntentTypeToString(request.preprocessed_output.intent_info.intent_type), base::UTF8ToUTF16(request.preprocessed_output.intent_info.intent_text)); @@ -120,6 +128,7 @@ void QuickAnswersControllerImpl::DismissQuickAnswers(bool is_active) { visibility_ = QuickAnswersVisibility::kClosed; MaybeDismissQuickAnswersNotice(); + quick_answers_ui_controller_->CloseUserConsentView(); bool closed = quick_answers_ui_controller_->CloseQuickAnswersView(); // |quick_answer_| could be null before we receive the result from the server. // Do not send the signal since the quick answer is dismissed before ready. @@ -241,6 +250,22 @@ GURL(kAssistantRelatedInfoUrl), /*from_user_interaction=*/true); } +void QuickAnswersControllerImpl::OnUserConsentResult(bool consented) { + quick_answers_ui_controller_->CloseUserConsentView(); + + auto* prefs = Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + prefs->SetBoolean(chromeos::quick_answers::prefs::kQuickAnswersConsented, + consented); + prefs->SetBoolean(chromeos::quick_answers::prefs::kQuickAnswersEnabled, + consented); + + if (consented) { + // Display Quick-Answer for the cached query when user consent has + // been granted. + MaybeShowQuickAnswers(anchor_bounds_, title_, context_); + } +} + void QuickAnswersControllerImpl::OpenQuickAnswersDogfoodLink() { NewWindowDelegate::GetInstance()->NewTabWithUrl( GURL(kDogfoodUrl), /*from_user_interaction=*/true); @@ -272,6 +297,16 @@ } } +void QuickAnswersControllerImpl::ShowUserConsent( + const std::u16string& intent_type, + const std::u16string& intent_text) { + // Show notice informing user about the feature if required. + if (!quick_answers_ui_controller_->is_showing_user_consent_view()) { + quick_answers_ui_controller_->CreateUserConsentView( + anchor_bounds_, intent_type, intent_text); + } +} + QuickAnswersRequest QuickAnswersControllerImpl::BuildRequest() { QuickAnswersRequest request; request.selected_text = title_;
diff --git a/ash/quick_answers/quick_answers_controller_impl.h b/ash/quick_answers/quick_answers_controller_impl.h index 3e910e8..2edbae8 100644 --- a/ash/quick_answers/quick_answers_controller_impl.h +++ b/ash/quick_answers/quick_answers_controller_impl.h
@@ -81,6 +81,9 @@ // notice screen for the Quick Answers feature. void OnNoticeSettingsRequestedByUser(); + // Handle user consent result. + void OnUserConsentResult(bool consented); + // Open Quick-Answers dogfood URL. void OpenQuickAnswersDogfoodLink(); @@ -111,6 +114,11 @@ void ShowUserNotice(const std::u16string& intent_type, const std::u16string& intent_text); + // Show the user consent view. Does nothing if the view is already + // visible. + void ShowUserConsent(const std::u16string& intent_type, + const std::u16string& intent_text); + chromeos::quick_answers::QuickAnswersRequest BuildRequest(); // Bounds of the anchor view.
diff --git a/ash/quick_answers/quick_answers_ui_controller.cc b/ash/quick_answers/quick_answers_ui_controller.cc index 795b1a6a..8369780 100644 --- a/ash/quick_answers/quick_answers_ui_controller.cc +++ b/ash/quick_answers/quick_answers_ui_controller.cc
@@ -9,6 +9,7 @@ #include "ash/public/cpp/new_window_delegate.h" #include "ash/quick_answers/quick_answers_controller_impl.h" #include "ash/quick_answers/ui/quick_answers_view.h" +#include "ash/quick_answers/ui/user_consent_view.h" #include "ash/quick_answers/ui/user_notice_view.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" @@ -38,6 +39,7 @@ QuickAnswersUiController::~QuickAnswersUiController() { quick_answers_view_ = nullptr; user_notice_view_ = nullptr; + user_consent_view_ = nullptr; } void QuickAnswersUiController::CreateQuickAnswersView( @@ -53,6 +55,7 @@ } DCHECK(!user_notice_view_); + DCHECK(!user_consent_view_); SetActiveQuery(query); quick_answers_view_ = new QuickAnswersView(bounds, title, this); quick_answers_view_->GetWidget()->ShowInactive(); @@ -125,6 +128,7 @@ const std::u16string& intent_text) { DCHECK(!quick_answers_view_); DCHECK(!user_notice_view_); + DCHECK(!user_consent_view_); user_notice_view_ = new quick_answers::UserNoticeView( anchor_bounds, intent_type, intent_text, this); user_notice_view_->GetWidget()->ShowInactive(); @@ -137,6 +141,25 @@ } } +void QuickAnswersUiController::CreateUserConsentView( + const gfx::Rect& anchor_bounds, + const std::u16string& intent_type, + const std::u16string& intent_text) { + DCHECK(!quick_answers_view_); + DCHECK(!user_notice_view_); + DCHECK(!user_consent_view_); + user_consent_view_ = new quick_answers::UserConsentView( + anchor_bounds, intent_type, intent_text, this); + user_consent_view_->GetWidget()->ShowInactive(); +} + +void QuickAnswersUiController::CloseUserConsentView() { + if (user_consent_view_) { + user_consent_view_->GetWidget()->Close(); + user_consent_view_ = nullptr; + } +} + void QuickAnswersUiController::OnAcceptButtonPressed() { DCHECK(user_notice_view_); controller_->OnUserNoticeAccepted(); @@ -165,4 +188,12 @@ controller_->OpenQuickAnswersSettings(); } +void QuickAnswersUiController::OnUserConsentResult(bool consented) { + DCHECK(user_consent_view_); + controller_->OnUserConsentResult(consented); + + if (consented && quick_answers_view_) + quick_answers_view_->RequestFocus(); +} + } // namespace ash
diff --git a/ash/quick_answers/quick_answers_ui_controller.h b/ash/quick_answers/quick_answers_ui_controller.h index d9ab529..8eaaf60f 100644 --- a/ash/quick_answers/quick_answers_ui_controller.h +++ b/ash/quick_answers/quick_answers_ui_controller.h
@@ -22,6 +22,7 @@ namespace quick_answers { class UserNoticeView; +class UserConsentView; } // namespace quick_answers // A controller to show/hide and handle interactions for quick @@ -72,12 +73,27 @@ // Invoked when user clicks the settings button on the notice view. void OnManageSettingsButtonPressed(); + // Creates a view for asking the user for consent about the Quick Answers + // feature vertically aligned to the anchor. + void CreateUserConsentView(const gfx::Rect& anchor_bounds, + const std::u16string& intent_type, + const std::u16string& intent_text); + + // Closes the user consent view. + void CloseUserConsentView(); + // Used by the controller to check if the user notice view is currently // showing instead of QuickAnswers. bool is_showing_user_notice_view() const { return user_notice_view_ != nullptr; } + // Used by the controller to check if the user consent view is currently + // showing instead of QuickAnswers. + bool is_showing_user_consent_view() const { + return user_notice_view_ != nullptr; + } + // Used by the controller to check if the QuickAnswers view is currently // showing. bool is_showing_quick_answers_view() const { @@ -91,6 +107,9 @@ // views. void OnSettingsButtonPressed(); + // Handle consent result from user consent view. + void OnUserConsentResult(bool consented); + const QuickAnswersView* quick_answers_view_for_testing() const { return quick_answers_view_; } @@ -104,6 +123,7 @@ // Owned by view hierarchy. QuickAnswersView* quick_answers_view_ = nullptr; quick_answers::UserNoticeView* user_notice_view_ = nullptr; + quick_answers::UserConsentView* user_consent_view_ = nullptr; std::string query_; };
diff --git a/ash/quick_answers/ui/quick_answers_pre_target_handler.cc b/ash/quick_answers/ui/quick_answers_pre_target_handler.cc index b26e5a5..aeec76971 100644 --- a/ash/quick_answers/ui/quick_answers_pre_target_handler.cc +++ b/ash/quick_answers/ui/quick_answers_pre_target_handler.cc
@@ -5,6 +5,7 @@ #include "ash/quick_answers/ui/quick_answers_pre_target_handler.h" #include "ash/quick_answers/ui/quick_answers_view.h" +#include "ash/quick_answers/ui/user_consent_view.h" #include "ash/quick_answers/ui/user_notice_view.h" #include "base/containers/adapters.h" #include "ui/aura/env.h" @@ -24,6 +25,12 @@ } QuickAnswersPreTargetHandler::QuickAnswersPreTargetHandler( + quick_answers::UserConsentView* view) + : view_(view) { + Init(); +} + +QuickAnswersPreTargetHandler::QuickAnswersPreTargetHandler( quick_answers::UserNoticeView* view) : view_(view) { Init();
diff --git a/ash/quick_answers/ui/quick_answers_pre_target_handler.h b/ash/quick_answers/ui/quick_answers_pre_target_handler.h index 09b54fe..b8e51ed 100644 --- a/ash/quick_answers/ui/quick_answers_pre_target_handler.h +++ b/ash/quick_answers/ui/quick_answers_pre_target_handler.h
@@ -21,6 +21,7 @@ class QuickAnswersView; namespace quick_answers { +class UserConsentView; class UserNoticeView; } // namespace quick_answers @@ -30,6 +31,7 @@ class QuickAnswersPreTargetHandler : public ui::EventHandler { public: explicit QuickAnswersPreTargetHandler(QuickAnswersView* view); + explicit QuickAnswersPreTargetHandler(quick_answers::UserConsentView* view); explicit QuickAnswersPreTargetHandler(quick_answers::UserNoticeView* view); // Disallow copy and assign.
diff --git a/ash/quick_answers/ui/user_consent_view.cc b/ash/quick_answers/ui/user_consent_view.cc new file mode 100644 index 0000000..8f047233 --- /dev/null +++ b/ash/quick_answers/ui/user_consent_view.cc
@@ -0,0 +1,370 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/quick_answers/ui/user_consent_view.h" + +#include "ash/accessibility/accessibility_controller_impl.h" +#include "ash/constants/ash_features.h" +#include "ash/public/cpp/app_list/vector_icons/vector_icons.h" +#include "ash/quick_answers/quick_answers_ui_controller.h" +#include "ash/resources/vector_icons/vector_icons.h" +#include "ash/shell.h" +#include "ash/strings/grit/ash_strings.h" +#include "base/bind.h" +#include "chromeos/ui/vector_icons/vector_icons.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/events/event_handler.h" +#include "ui/gfx/paint_vector_icon.h" +#include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/background.h" +#include "ui/views/border.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/md_text_button.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/controls/label.h" +#include "ui/views/controls/menu/menu_config.h" +#include "ui/views/controls/menu/menu_controller.h" +#include "ui/views/layout/box_layout.h" +#include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/flex_layout.h" +#include "ui/views/layout/layout_provider.h" +#include "ui/views/widget/tooltip_manager.h" +#include "ui/views/widget/widget.h" +#include "ui/wm/core/coordinate_conversion.h" + +namespace ash { +namespace quick_answers { + +namespace { + +// Main view (or common) specs. +constexpr int kMarginDip = 10; +constexpr int kLineHeightDip = 20; +constexpr int kContentSpacingDip = 8; +constexpr gfx::Insets kMainViewInsets = {16, 12, 16, 16}; +constexpr gfx::Insets kContentInsets = {0, 12, 0, 0}; +// TODO(b/190554570): Use semantic color for quick answers related views. +constexpr SkColor kMainViewBgColor = SK_ColorWHITE; + +// Google icon. +constexpr int kGoogleIconSizeDip = 16; + +// Title text. +constexpr SkColor kTitleTextColor = gfx::kGoogleGrey900; +constexpr int kTitleFontSizeDelta = 2; + +// Description text. +constexpr SkColor kDescTextColor = gfx::kGoogleGrey700; +constexpr int kDescFontSizeDelta = 1; + +// Buttons common. +constexpr int kButtonSpacingDip = 8; +constexpr gfx::Insets kButtonBarInsets = {8, 0, 0, 0}; +constexpr gfx::Insets kButtonInsets = {6, 16, 6, 16}; +constexpr int kButtonFontSizeDelta = 1; + +// Compact buttons layout. +constexpr int kCompactButtonLayoutThreshold = 200; +constexpr gfx::Insets kCompactButtonInsets = {6, 12, 6, 12}; +constexpr int kCompactButtonFontSizeDelta = 0; + +// Manage-Settings button. +constexpr SkColor kSettingsButtonTextColor = gfx::kGoogleBlue600; + +// Accept button. +constexpr SkColor kAcceptButtonTextColor = gfx::kGoogleGrey200; + +int GetActualLabelWidth(int anchor_view_width) { + return anchor_view_width - kMainViewInsets.width() - kContentInsets.width() - + kGoogleIconSizeDip; +} + +bool ShouldUseCompactButtonLayout(int anchor_view_width) { + return GetActualLabelWidth(anchor_view_width) < kCompactButtonLayoutThreshold; +} + +// Create and return a simple label with provided specs. +std::unique_ptr<views::Label> CreateLabel(const std::u16string& text, + const SkColor color, + int font_size_delta) { + auto label = std::make_unique<views::Label>(text); + label->SetAutoColorReadabilityEnabled(false); + label->SetEnabledColor(color); + label->SetLineHeight(kLineHeightDip); + label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + label->SetFontList( + views::Label::GetDefaultFontList().DeriveWithSizeDelta(font_size_delta)); + return label; +} + +// views::LabelButton with custom line-height, color and font-list for the +// underlying label. +class CustomizedLabelButton : public views::MdTextButton { + public: + CustomizedLabelButton(PressedCallback callback, + const std::u16string& text, + const SkColor color, + bool is_compact) + : MdTextButton(std::move(callback), text) { + SetCustomPadding(is_compact ? kCompactButtonInsets : kButtonInsets); + SetEnabledTextColors(color); + label()->SetLineHeight(kLineHeightDip); + label()->SetFontList( + views::Label::GetDefaultFontList() + .DeriveWithSizeDelta(is_compact ? kCompactButtonFontSizeDelta + : kButtonFontSizeDelta) + .DeriveWithWeight(gfx::Font::Weight::MEDIUM)); + } + + // Disallow copy and assign. + CustomizedLabelButton(const CustomizedLabelButton&) = delete; + CustomizedLabelButton& operator=(const CustomizedLabelButton&) = delete; + + ~CustomizedLabelButton() override = default; + + // views::View: + const char* GetClassName() const override { return "CustomizedLabelButton"; } +}; + +} // namespace + +// UserConsentView +// ------------------------------------------------------------- + +UserConsentView::UserConsentView(const gfx::Rect& anchor_view_bounds, + const std::u16string& intent_type, + const std::u16string& intent_text, + QuickAnswersUiController* ui_controller) + : anchor_view_bounds_(anchor_view_bounds), + event_handler_(this), + ui_controller_(ui_controller), + focus_search_(this, + base::BindRepeating(&UserConsentView::GetFocusableViews, + base::Unretained(this))) { + if (intent_type.empty() || intent_text.empty()) { + title_ = l10n_util::GetStringUTF16( + IDS_ASH_QUICK_ANSWERS_USER_NOTICE_VIEW_TITLE_TEXT); + } else { + title_ = l10n_util::GetStringFUTF16( + IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_TITLE_TEXT_WITH_INTENT, + intent_type, intent_text); + } + + InitLayout(); + InitWidget(); + + // Focus should cycle to each of the buttons the view contains and back to it. + SetFocusBehavior(FocusBehavior::ALWAYS); + views::FocusRing::Install(this); + + // Allow tooltips to be shown despite menu-controller owning capture. + GetWidget()->SetNativeWindowProperty( + views::TooltipManager::kGroupingPropertyKey, + reinterpret_cast<void*>(views::MenuConfig::kMenuControllerGroupingId)); + + // Read out user-consent text if screen-reader is active. + GetViewAccessibility().AnnounceText(l10n_util::GetStringUTF16( + IDS_ASH_QUICK_ANSWERS_USER_NOTICE_VIEW_A11Y_INFO_ALERT_TEXT)); +} + +UserConsentView::~UserConsentView() = default; + +const char* UserConsentView::GetClassName() const { + return "UserConsentView"; +} + +gfx::Size UserConsentView::CalculatePreferredSize() const { + // View should match width of the anchor. + auto width = anchor_view_bounds_.width(); + return gfx::Size(width, GetHeightForWidth(width)); +} + +void UserConsentView::OnFocus() { + // Unless screen-reader mode is enabled, transfer the focus to an actionable + // button, otherwise retain to read out its contents. + if (!ash::Shell::Get() + ->accessibility_controller() + ->spoken_feedback() + .enabled()) { + no_thanks_button_->RequestFocus(); + } +} + +views::FocusTraversable* UserConsentView::GetPaneFocusTraversable() { + return &focus_search_; +} + +void UserConsentView::GetAccessibleNodeData(ui::AXNodeData* node_data) { + node_data->role = ax::mojom::Role::kDialog; + node_data->SetName(title_); + auto desc = l10n_util::GetStringFUTF8( + IDS_ASH_QUICK_ANSWERS_USER_NOTICE_VIEW_A11Y_INFO_DESC_TEMPLATE, + l10n_util::GetStringUTF16( + IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_DESC_TEXT)); + node_data->SetDescription(desc); +} + +std::vector<views::View*> UserConsentView::GetFocusableViews() { + std::vector<views::View*> focusable_views; + // The view itself is not included in focus loop, unless screen-reader is on. + if (ash::Shell::Get() + ->accessibility_controller() + ->spoken_feedback() + .enabled()) { + focusable_views.push_back(this); + } + focusable_views.push_back(no_thanks_button_); + focusable_views.push_back(allow_button_); + return focusable_views; +} + +void UserConsentView::UpdateAnchorViewBounds( + const gfx::Rect& anchor_view_bounds) { + anchor_view_bounds_ = anchor_view_bounds; + UpdateWidgetBounds(); +} + +void UserConsentView::InitLayout() { + SetLayoutManager(std::make_unique<views::FillLayout>()); + SetBackground(views::CreateSolidBackground(kMainViewBgColor)); + + // Main-view Layout. + main_view_ = AddChildView(std::make_unique<views::View>()); + auto* layout = + main_view_->SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout->SetOrientation(views::LayoutOrientation::kHorizontal) + .SetInteriorMargin(kMainViewInsets) + .SetCrossAxisAlignment(views::LayoutAlignment::kStart); + + // Google icon. + auto* google_icon = + main_view_->AddChildView(std::make_unique<views::ImageView>()); + google_icon->SetBorder(views::CreateEmptyBorder( + (kLineHeightDip - kGoogleIconSizeDip) / 2, 0, 0, 0)); + google_icon->SetImage(gfx::CreateVectorIcon( + kGoogleColorIcon, kGoogleIconSizeDip, gfx::kPlaceholderColor)); + + // Content. + InitContent(); +} + +void UserConsentView::InitContent() { + // Layout. + content_ = main_view_->AddChildView(std::make_unique<views::View>()); + + auto* layout = + content_->SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout->SetOrientation(views::LayoutOrientation::kVertical) + .SetIgnoreDefaultMainAxisMargins(true) + .SetInteriorMargin(kContentInsets) + .SetCollapseMargins(true) + .SetDefault(views::kMarginsKey, gfx::Insets(/*top=*/0, /*left=*/0, + /*bottom=*/kContentSpacingDip, + /*right=*/0)); + + // Title. + auto* title = content_->AddChildView( + CreateLabel(title_, kTitleTextColor, kTitleFontSizeDelta)); + // Set the maximum width of the label to the width it would need to be for the + // UserConsentView to be the same width as the anchor, so its preferred size + // will be calculated correctly. + int maximum_width = GetActualLabelWidth(anchor_view_bounds_.width()); + title->SetMaximumWidthSingleLine(maximum_width); + + // Description. + auto* desc = content_->AddChildView( + CreateLabel(l10n_util::GetStringUTF16( + IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_DESC_TEXT), + kDescTextColor, kDescFontSizeDelta)); + desc->SetMultiLine(true); + + desc->SetMaximumWidth(maximum_width); + + // Button bar. + InitButtonBar(); +} + +void UserConsentView::InitButtonBar() { + // Layout. + auto* button_bar = content_->AddChildView(std::make_unique<views::View>()); + auto* layout = + button_bar->SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout->SetOrientation(views::LayoutOrientation::kHorizontal) + .SetIgnoreDefaultMainAxisMargins(true) + .SetInteriorMargin(kButtonBarInsets) + .SetMainAxisAlignment(views::LayoutAlignment::kEnd) + .SetCollapseMargins(true) + .SetDefault(views::kMarginsKey, + gfx::Insets(/*top=*/0, /*left=*/0, /*bottom=*/0, + /*right=*/kButtonSpacingDip)); + + // No thanks button. + auto no_thanks_button = std::make_unique<CustomizedLabelButton>( + base::BindRepeating(&QuickAnswersUiController::OnUserConsentResult, + base::Unretained(ui_controller_), false), + l10n_util::GetStringUTF16( + IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_NO_THANKS_BUTTON), + kSettingsButtonTextColor, + ShouldUseCompactButtonLayout(anchor_view_bounds_.width())); + no_thanks_button_ = button_bar->AddChildView(std::move(no_thanks_button)); + + // Allow button + auto allow_button = std::make_unique<CustomizedLabelButton>( + base::BindRepeating( + [](QuickAnswersPreTargetHandler* handler, + QuickAnswersUiController* controller) { + // When user consent is accepted, QuickAnswersView will be + // displayed instead of dismissing the menu. + handler->set_dismiss_anchor_menu_on_view_closed(false); + controller->OnUserConsentResult(true); + }, + &event_handler_, ui_controller_), + l10n_util::GetStringUTF16( + IDS_ASH_QUICK_ANSWERS_USER_CONSENT_VIEW_ALLOW_BUTTON), + kAcceptButtonTextColor, + ShouldUseCompactButtonLayout(anchor_view_bounds_.width())); + allow_button->SetProminent(true); + allow_button_ = button_bar->AddChildView(std::move(allow_button)); +} + +void UserConsentView::InitWidget() { + views::Widget::InitParams params; + params.activatable = views::Widget::InitParams::Activatable::kNo; + params.shadow_elevation = 2; + params.shadow_type = views::Widget::InitParams::ShadowType::kDrop; + params.type = views::Widget::InitParams::TYPE_POPUP; + params.z_order = ui::ZOrderLevel::kFloatingUIElement; + + // Parent the widget depending on the context. + auto* active_menu_controller = views::MenuController::GetActiveInstance(); + if (active_menu_controller && active_menu_controller->owner()) { + params.parent = active_menu_controller->owner()->GetNativeView(); + params.child = true; + } else { + params.context = Shell::Get()->GetRootWindowForNewWindows(); + } + + views::Widget* widget = new views::Widget(); + widget->Init(std::move(params)); + widget->SetContentsView(this); + UpdateWidgetBounds(); +} + +void UserConsentView::UpdateWidgetBounds() { + const gfx::Size size = GetPreferredSize(); + int x = anchor_view_bounds_.x(); + int y = anchor_view_bounds_.y() - size.height() - kMarginDip; + if (y < display::Screen::GetScreen() + ->GetDisplayMatching(anchor_view_bounds_) + .bounds() + .y()) { + y = anchor_view_bounds_.bottom() + kMarginDip; + } + gfx::Rect bounds({x, y}, size); + wm::ConvertRectFromScreen(GetWidget()->GetNativeWindow()->parent(), &bounds); + GetWidget()->SetBounds(bounds); +} + +} // namespace quick_answers +} // namespace ash
diff --git a/ash/quick_answers/ui/user_consent_view.h b/ash/quick_answers/ui/user_consent_view.h new file mode 100644 index 0000000..3555a9fb --- /dev/null +++ b/ash/quick_answers/ui/user_consent_view.h
@@ -0,0 +1,79 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_QUICK_ANSWERS_UI_USER_CONSENT_VIEW_H_ +#define ASH_QUICK_ANSWERS_UI_USER_CONSENT_VIEW_H_ + +#include <memory> + +#include "ash/quick_answers/ui/quick_answers_focus_search.h" +#include "ash/quick_answers/ui/quick_answers_pre_target_handler.h" +#include "ui/views/view.h" + +namespace views { +class LabelButton; +} // namespace views + +namespace ash { + +class QuickAnswersUiController; + +namespace quick_answers { + +// |intent_type| and |intent_text| are used to generate the consent title +// including predicted intent information. Fallback to title without intent +// information if any of these two strings are empty. +class UserConsentView : public views::View { + public: + UserConsentView(const gfx::Rect& anchor_view_bounds, + const std::u16string& intent_type, + const std::u16string& intent_text, + QuickAnswersUiController* ui_controller); + + // Disallow copy and assign. + UserConsentView(const UserConsentView&) = delete; + UserConsentView& operator=(const UserConsentView&) = delete; + + ~UserConsentView() override; + + // views::View: + const char* GetClassName() const override; + gfx::Size CalculatePreferredSize() const override; + void OnFocus() override; + views::FocusTraversable* GetPaneFocusTraversable() override; + void GetAccessibleNodeData(ui::AXNodeData* node_data) override; + + void UpdateAnchorViewBounds(const gfx::Rect& anchor_view_bounds); + + private: + void InitLayout(); + void InitContent(); + void InitButtonBar(); + void InitWidget(); + void UpdateWidgetBounds(); + + // QuickAnswersFocusSearch::GetFocusableViewsCallback to poll currently + // focusable views. + std::vector<views::View*> GetFocusableViews(); + + // Cached bounds of the anchor this view is tied to. + gfx::Rect anchor_view_bounds_; + // Cached title text. + std::u16string title_; + + QuickAnswersPreTargetHandler event_handler_; + QuickAnswersUiController* const ui_controller_; + QuickAnswersFocusSearch focus_search_; + + // Owned by view hierarchy. + views::View* main_view_ = nullptr; + views::View* content_ = nullptr; + views::LabelButton* no_thanks_button_ = nullptr; + views::LabelButton* allow_button_ = nullptr; +}; + +} // namespace quick_answers +} // namespace ash + +#endif // ASH_QUICK_ANSWERS_UI_USER_CONSENT_VIEW_H_
diff --git a/ash/services/recording/video_capture_params.cc b/ash/services/recording/video_capture_params.cc index 5d1d9894..1c771faa 100644 --- a/ash/services/recording/video_capture_params.cc +++ b/ash/services/recording/video_capture_params.cc
@@ -16,6 +16,14 @@ namespace { +// Returns a rect that is the result of intersecting the given two rects. +gfx::Rect GetIntersectionRect(const gfx::Rect& rect_a, + const gfx::Rect& rect_b) { + auto result = rect_a; + result.Intersect(rect_b); + return result; +} + // ----------------------------------------------------------------------------- // FullscreenCaptureParams: @@ -60,9 +68,22 @@ ~WindowCaptureParams() override = default; // VideoCaptureParams: + void SetCapturerResolutionConstraints( + mojo::Remote<viz::mojom::FrameSinkVideoCapturer>& capturer) + const override { + DCHECK(capturer); + + // To avoid receiving letterboxed video frames from the capturer, we ask it + // to give us an exact resolution matching the window's size. + capturer->SetResolutionConstraints(/*min_size=*/current_window_size_, + /*max_size=*/current_window_size_, + /*use_fixed_aspect_ratio=*/true); + } + gfx::Rect GetVideoFrameVisibleRect( const gfx::Rect& original_frame_visible_rect) const override { - return gfx::Rect(current_window_size_); + return GetIntersectionRect(original_frame_visible_rect, + gfx::Rect(current_window_size_)); } gfx::Size GetVideoSize() const override { return current_window_size_; } @@ -74,20 +95,16 @@ DCHECK(new_frame_sink_id.is_valid()); DCHECK_NE(frame_sink_id_, new_frame_sink_id); - // The video encoder deals with video frames. Changing the frame sink ID - // doesn't affect the encoder. What affects it is a change in the video - // frames size. - const bool should_reconfigure_video_encoder = - current_frame_sink_size_ != new_frame_sink_size; - current_frame_sink_size_ = new_frame_sink_size; frame_sink_id_ = new_frame_sink_id; - capturer->SetResolutionConstraints(/*min_size=*/current_frame_sink_size_, - /*max_size=*/current_frame_sink_size_, - /*use_fixed_aspect_ratio=*/true); capturer->ChangeTarget(frame_sink_id_, subtree_capture_id_); - return should_reconfigure_video_encoder; + // Changing the frame sink (i.e. changing the root window) should not lead + // to reconfiguring the encoder, even if the new frame sink size is + // different. This is because the video size matches the recorded window's + // size (i.e. |current_window_size_|). This is already handled in + // OnRecordedWindowSizeChanged() below. + return false; } bool OnRecordedWindowSizeChanged( @@ -96,6 +113,7 @@ if (current_window_size_ == new_window_size) return false; current_window_size_ = new_window_size; + SetCapturerResolutionConstraints(capturer); return true; } @@ -124,9 +142,7 @@ const gfx::Rect& original_frame_visible_rect) const override { // We can't crop the video frame by an invalid bounds. The crop bounds must // be contained within the original frame bounds. - gfx::Rect visible_rect = original_frame_visible_rect; - visible_rect.Intersect(crop_region_); - return visible_rect; + return GetIntersectionRect(original_frame_visible_rect, crop_region_); } gfx::Size GetVideoSize() const override { @@ -176,9 +192,7 @@ capturer->SetMinCapturePeriod(kMinCapturePeriod); capturer->SetMinSizeChangePeriod(kMinPeriodForResizeThrottling); - capturer->SetResolutionConstraints(/*min_size=*/current_frame_sink_size_, - /*max_size=*/current_frame_sink_size_, - /*use_fixed_aspect_ratio=*/true); + SetCapturerResolutionConstraints(capturer); capturer->SetAutoThrottlingEnabled(false); // TODO(afakhry): Discuss with //media/ team the implications of color space // conversions. @@ -186,6 +200,15 @@ capturer->ChangeTarget(frame_sink_id_, subtree_capture_id_); } +void VideoCaptureParams::SetCapturerResolutionConstraints( + mojo::Remote<viz::mojom::FrameSinkVideoCapturer>& capturer) const { + DCHECK(capturer); + + capturer->SetResolutionConstraints(/*min_size=*/current_frame_sink_size_, + /*max_size=*/current_frame_sink_size_, + /*use_fixed_aspect_ratio=*/true); +} + gfx::Rect VideoCaptureParams::GetVideoFrameVisibleRect( const gfx::Rect& original_frame_visible_rect) const { return original_frame_visible_rect; @@ -213,9 +236,7 @@ return false; current_frame_sink_size_ = new_frame_sink_size; - capturer->SetResolutionConstraints(/*min_size=*/current_frame_sink_size_, - /*max_size=*/current_frame_sink_size_, - /*use_fixed_aspect_ratio=*/true); + SetCapturerResolutionConstraints(capturer); return true; }
diff --git a/ash/services/recording/video_capture_params.h b/ash/services/recording/video_capture_params.h index 54197185..5c9d82a 100644 --- a/ash/services/recording/video_capture_params.h +++ b/ash/services/recording/video_capture_params.h
@@ -70,6 +70,12 @@ void InitializeVideoCapturer( mojo::Remote<viz::mojom::FrameSinkVideoCapturer>& capturer) const; + // Sets the desired resolution constraints on the given |capturer|. By default + // the size of the recorded frame sink is used. Sub classes can override this + // behavior if needed. + virtual void SetCapturerResolutionConstraints( + mojo::Remote<viz::mojom::FrameSinkVideoCapturer>& capturer) const; + // Returns the bounds to which a video frame, whose // |original_frame_visible_rect| is given, should be cropped. If no cropping // is desired, |original_frame_visible_rect| is returned. All bounds are in
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 834df65a..fdc5b534 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -317,6 +317,7 @@ <translation id="3510164367642747937">Maus kursorunu vurğulayın</translation> <translation id="3513798432020909783"><ph name="MANAGER_EMAIL" /> tərəfindən idarə edilən hesab</translation> <translation id="3552189655002856821">Wi-Fi deaktiv edilib</translation> +<translation id="3560866052109807830">Markerli rəsm alətləri</translation> <translation id="3563775809269155755">Hotspotu aktiv edin</translation> <translation id="3571734092741541777">Quraşdırın</translation> <translation id="3573179567135747900">"<ph name="FROM_LOCALE" />" qaytarın (yenidən başlanmanı tələb edir)</translation> @@ -411,6 +412,7 @@ <translation id="4274537685965975248">Ctrl + Alt + Aşağı Ox klaviatura qısayolu dəyişib. Son düyməsindən istifadə etmək üçün <ph name="LAUNCHER_KEY_NAME" /> + Sağa Ox düyməsini basın.</translation> <translation id="4279490309300973883">Əks etdirilir</translation> <translation id="4285498937028063278">Çıxarın</translation> +<translation id="429402653707266969">Alətlər panelinin məkanını dəyişin</translation> <translation id="4294319844246081198">Sabahınız xeyir, <ph name="GIVEN_NAME" /></translation> <translation id="4296136865091727875"><ph name="COUNT" /> bildirişin hamısını silin</translation> <translation id="4302592941791324970">Əlçatan deyil</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index b0cc2ce..1c8efd3 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -317,6 +317,7 @@ <translation id="3510164367642747937">Mettre le curseur de la souris en surbrillance</translation> <translation id="3513798432020909783">Compte géré par <ph name="MANAGER_EMAIL" /></translation> <translation id="3552189655002856821">Le Wi-Fi est désactivé</translation> +<translation id="3560866052109807830">Outils de dessin : marqueur</translation> <translation id="3563775809269155755">Activer le point d'accès sans fil</translation> <translation id="3571734092741541777">Configurer</translation> <translation id="3573179567135747900">Revenir à « <ph name="FROM_LOCALE" /> » (redémarrage requis)</translation> @@ -411,6 +412,7 @@ <translation id="4274537685965975248">Le raccourci-clavier Ctrl+Alt+flèche vers le bas a changé. Pour utiliser la touche Fin, appuyez sur la touche <ph name="LAUNCHER_KEY_NAME" />+flèche vers la droite.</translation> <translation id="4279490309300973883">Mise en miroir</translation> <translation id="4285498937028063278">Annuler l'épinglage</translation> +<translation id="429402653707266969">Basculer l'emplacement de la barre d'outils</translation> <translation id="4294319844246081198">Bonjour <ph name="GIVEN_NAME" />,</translation> <translation id="4296136865091727875">Effacer les <ph name="COUNT" /> notifications</translation> <translation id="4302592941791324970">Non accessible</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 2390c21b..d305bee 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -317,6 +317,7 @@ <translation id="3510164367642747937">Destacar o cursor do rato</translation> <translation id="3513798432020909783">A conta está xestionada por <ph name="MANAGER_EMAIL" /></translation> <translation id="3552189655002856821">A wifi está desactivada</translation> +<translation id="3560866052109807830">Ferramentas de debuxo (marcador)</translation> <translation id="3563775809269155755">Activar zona wifi</translation> <translation id="3571734092741541777">Configurar</translation> <translation id="3573179567135747900">Volver cambiar a "<ph name="FROM_LOCALE" />" (é necesario reiniciar)</translation> @@ -412,6 +413,7 @@ <translation id="4274537685965975248">O atallo Control + Alt + Frecha abaixo cambiou. Para usar a tecla Fin, preme <ph name="LAUNCHER_KEY_NAME" /> + Frecha dereita.</translation> <translation id="4279490309300973883">Proxección</translation> <translation id="4285498937028063278">Deixar de fixar</translation> +<translation id="429402653707266969">Alternar localización da barra de ferramentas</translation> <translation id="4294319844246081198">Bos días, <ph name="GIVEN_NAME" />!</translation> <translation id="4296136865091727875">Borrar as <ph name="COUNT" /> notificacións</translation> <translation id="4302592941791324970">Non dispoñible</translation> @@ -754,7 +756,7 @@ <translation id="7045595904618419789">Iniciar lupa</translation> <translation id="7055910611768509537">O lapis óptico non se usou desde hai máis dunha semana</translation> <translation id="7066646422045619941">Esta rede está desactivada polo administrador.</translation> -<translation id="7067196344162293536">Xirar automaticamente</translation> +<translation id="7067196344162293536">Xirar automat.</translation> <translation id="7068360136237591149">Abrir ficheiros</translation> <translation id="7076293881109082629">Iniciando sesión</translation> <translation id="7088960765736518739">Acceso con interruptores</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 4cf6caff..ad9f5800 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -317,6 +317,7 @@ <translation id="3510164367642747937">Тінтуір курсорын бөлектеу</translation> <translation id="3513798432020909783"><ph name="MANAGER_EMAIL" /> басқаратын есептік жазба</translation> <translation id="3552189655002856821">Wi-Fi өшірулі.</translation> +<translation id="3560866052109807830">Маркермен сызу құралдары</translation> <translation id="3563775809269155755">Хотспотты қосу</translation> <translation id="3571734092741541777">Орнату</translation> <translation id="3573179567135747900">Қайта "<ph name="FROM_LOCALE" />" етіп өзгерту (қайта іске қосуды қажет етеді)</translation> @@ -411,6 +412,7 @@ <translation id="4274537685965975248">Ctrl + Alt + төменге бағыттауыш перне тіркесімінің функциясы өзгерді. End пернесінің әрекетін орындау үшін <ph name="LAUNCHER_KEY_NAME" /> пернесі + оң жаққа бағыттауыш перне тіркесімін басыңыз.</translation> <translation id="4279490309300973883">Экран көшірмесін көрсету</translation> <translation id="4285498937028063278">Босату</translation> +<translation id="429402653707266969">Құралдар тақтасының орнын ауыстыру</translation> <translation id="4294319844246081198">Қайырлы таң, <ph name="GIVEN_NAME" />!</translation> <translation id="4296136865091727875">Барлық <ph name="COUNT" /> хабарландыруды өшіру</translation> <translation id="4302592941791324970">Қолжетімді емес</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 5cfcf0cd..aa8eb9de3 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -317,6 +317,7 @@ <translation id="3510164367642747937">Чычкан курсору баса белгиленсин</translation> <translation id="3513798432020909783">Аккаунтту башкарган: <ph name="MANAGER_EMAIL" /></translation> <translation id="3552189655002856821">Wi-Fi өчүрүлгөн</translation> +<translation id="3560866052109807830">Маркер калемдер</translation> <translation id="3563775809269155755">Туташуу түйүнүн иштетүү</translation> <translation id="3571734092741541777">Орнотуу</translation> <translation id="3573179567135747900">Төмөнкүгө кайра өзгөртүү "<ph name="FROM_LOCALE" />" (өчүрүп күйгүзүү керек)</translation> @@ -411,6 +412,7 @@ <translation id="4274537685965975248">Ctrl + Alt + ылдый жебе ыкчам баскычы өзгөртүлдү. Аягы баскычын колдонуу үчүн <ph name="LAUNCHER_KEY_NAME" /> баскычын + oңго жебени басыңыз.</translation> <translation id="4279490309300973883">Чагылыштыруу</translation> <translation id="4285498937028063278">Бошотуу</translation> +<translation id="429402653707266969">Куралдар тилкесинин жайгашкан жерин өчүрүү/күйгүзүү</translation> <translation id="4294319844246081198">Кутмандуу таңыңыз менен, <ph name="GIVEN_NAME" />,</translation> <translation id="4296136865091727875"><ph name="COUNT" /> билдирменин баарын өчүрүү</translation> <translation id="4302592941791324970">Жеткиликсиз</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index d337cf0..165e692 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -776,7 +776,7 @@ <translation id="7406608787870898861">आफ्नो मोबाइल नेटवर्क सेटअप गर्ने कार्य पूरा गर्नुहोस्</translation> <translation id="741244894080940828">रूपान्तरण</translation> <translation id="7413851974711031813">बन्द गर्न Escape थिच्नुहोस्</translation> -<translation id="742594950370306541">क्यामेरा प्रयोगमा छ।</translation> +<translation id="742594950370306541">क्यामेरा प्रयोग भइरहेको छ।</translation> <translation id="742608627846767349">नमस्ते,</translation> <translation id="743058460480092004">क्यामेरा र माइक्रोफोन प्रयोगमा छ।</translation> <translation id="7434543979546293336">यो मुख्य विचारका रूपमा चिन्ह लगाइएको छ</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 87956d4..7bbeded 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -674,7 +674,7 @@ <translation id="6424520630891723617">Himoya: <ph name="SECURITY_STATUS" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" /></translation> <translation id="642644398083277086">Barcha eslatmalarni tozalang</translation> <translation id="643147933154517414">Bajarildi</translation> -<translation id="6431865393913628856">Ekranni yozib olish</translation> +<translation id="6431865393913628856">Ekran yozuvi</translation> <translation id="6445835306623867477"><ph name="ROUTE_TITLE" /> <ph name="RECEIVER_NAME" /> qurilmasiga translatsiya qilinmoqda</translation> <translation id="6452181791372256707">Rad etish</translation> <translation id="6453179446719226835">Til sozlamalari o‘zgardi</translation> @@ -755,7 +755,7 @@ <translation id="7045595904618419789">Lupani yoqish</translation> <translation id="7055910611768509537">Stilus bir haftadan beri ishlatilmagan</translation> <translation id="7066646422045619941">Bu tarmoq administrator tomonidan o‘chirib qo‘yilgan.</translation> -<translation id="7067196344162293536">Avtomatik burilish</translation> +<translation id="7067196344162293536">Avto-burilish</translation> <translation id="7068360136237591149">Ochiq fayllar</translation> <translation id="7076293881109082629">Kirish</translation> <translation id="7088960765736518739">Switch Access</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 22959cd..8f64da38 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -317,6 +317,7 @@ <translation id="3510164367642747937">Đánh dấu con trỏ chuột</translation> <translation id="3513798432020909783">Người quản lý tài khoản: <ph name="MANAGER_EMAIL" /></translation> <translation id="3552189655002856821">Wi-Fi đang tắt</translation> +<translation id="3560866052109807830">Công cụ đánh dấu</translation> <translation id="3563775809269155755">Bật điểm phát sóng</translation> <translation id="3571734092741541777">Thiết lập</translation> <translation id="3573179567135747900">Thay đổi lại thành "<ph name="FROM_LOCALE" />" (yêu cầu khởi động lại)</translation> @@ -411,6 +412,7 @@ <translation id="4274537685965975248">Phím tắt Ctrl + Alt + Mũi tên xuống đã thay đổi. Để sử dụng phím End, hãy nhấn tổ hợp phím <ph name="LAUNCHER_KEY_NAME" /> + Mũi tên phải.</translation> <translation id="4279490309300973883">Đang phản chiếu</translation> <translation id="4285498937028063278">Bỏ ghim</translation> +<translation id="429402653707266969">Bật/tắt vị trí thanh công cụ</translation> <translation id="4294319844246081198">Xin chào <ph name="GIVEN_NAME" />!</translation> <translation id="4296136865091727875">Xóa tất cả <ph name="COUNT" /> thông báo</translation> <translation id="4302592941791324970">Không dùng được</translation>
diff --git a/ash/system/holding_space/holding_space_item_chip_view.cc b/ash/system/holding_space/holding_space_item_chip_view.cc index 104e22d6b..5bdd3288 100644 --- a/ash/system/holding_space/holding_space_item_chip_view.cc +++ b/ash/system/holding_space/holding_space_item_chip_view.cc
@@ -15,6 +15,7 @@ #include "ash/resources/vector_icons/vector_icons.h" #include "ash/style/ash_color_provider.h" #include "ash/system/holding_space/holding_space_item_view.h" +#include "ash/system/holding_space/holding_space_view_builder.h" #include "ash/system/holding_space/holding_space_view_delegate.h" #include "base/bind.h" #include "ui/base/metadata/metadata_impl_macros.h" @@ -30,7 +31,10 @@ #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/layout/box_layout_view.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/flex_layout.h" +#include "ui/views/metadata/view_factory.h" namespace ash { namespace { @@ -44,35 +48,86 @@ constexpr int kPreferredWidth = 160; constexpr int kSecondaryActionIconSize = 16; -// Helpers --------------------------------------------------------------------- - -// TODO(crbug.com/1202796): Create ash colors. -SkColor GetMultiSelectTextColor() { - return AshColorProvider::Get()->IsDarkModeEnabled() ? gfx::kGoogleBlue100 - : gfx::kGoogleBlue800; -} - // PaintCallbackLabel ---------------------------------------------------------- class PaintCallbackLabel : public views::Label { public: - using PaintCallback = base::RepeatingCallback<void(gfx::Canvas* canvas)>; - - explicit PaintCallbackLabel(PaintCallback callback) : callback_(callback) {} + PaintCallbackLabel() = default; PaintCallbackLabel(const PaintCallbackLabel&) = delete; PaintCallbackLabel& operator=(const PaintCallbackLabel&) = delete; ~PaintCallbackLabel() override = default; + using Callback = base::RepeatingCallback<void(gfx::Canvas* canvas)>; + void SetCallback(Callback callback) { callback_ = std::move(callback); } + private: // views::Label: void OnPaint(gfx::Canvas* canvas) override { views::Label::OnPaint(canvas); - callback_.Run(canvas); + if (!callback_.is_null()) + callback_.Run(canvas); } - PaintCallback callback_; + Callback callback_; }; +BEGIN_VIEW_BUILDER(/*no export*/, PaintCallbackLabel, views::Label) +VIEW_BUILDER_PROPERTY(PaintCallbackLabel::Callback, Callback) +END_VIEW_BUILDER + +} // namespace +} // namespace ash + +DEFINE_VIEW_BUILDER(/*no export*/, ash::PaintCallbackLabel) + +namespace ash { +namespace { + +// Helpers --------------------------------------------------------------------- + +// Returns a label builder with desired `style`, `text` and paint `callback`. +std::unique_ptr<HoldingSpaceViewBuilder<views::Label>> CreateLabelBuilder( + bubble_utils::LabelStyle style, + const std::u16string& text, + PaintCallbackLabel::Callback callback) { + auto label = views::Builder<PaintCallbackLabel>() + .SetBorder(views::CreateEmptyBorder(kLabelMargins)) + .SetCallback(std::move(callback)) + .SetElideBehavior(gfx::ELIDE_MIDDLE) + .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT) + .SetPaintToLayer() + .SetText(text) + .Build(); + + // NOTE: A11y events are handled by `HoldingSpaceItemChipView`. + label->GetViewAccessibility().OverrideIsIgnored(true); + label->layer()->SetFillsBoundsOpaquely(false); + bubble_utils::ApplyStyle(label.get(), style); + return std::make_unique<HoldingSpaceViewBuilder<views::Label>>( + std::move(label)); +} + +// Returns a secondary action builder that invokes `callback` on press. +std::unique_ptr<HoldingSpaceViewBuilder<views::ImageButton>> +CreateSecondaryActionBuilder(views::ImageButton::PressedCallback callback) { + using HorizontalAlignment = views::ImageButton::HorizontalAlignment; + using VerticalAlignment = views::ImageButton::VerticalAlignment; + return std::make_unique<HoldingSpaceViewBuilder<views::ImageButton>>( + views::Builder<views::ImageButton>() + .SetCallback(std::move(callback)) + .SetFocusBehavior(views::View::FocusBehavior::NEVER) + .SetImageHorizontalAlignment(HorizontalAlignment::ALIGN_CENTER) + .SetImageVerticalAlignment(VerticalAlignment::ALIGN_MIDDLE) + .SetVisible(false)); +} + +// TODO(crbug.com/1202796): Create ash colors. +// Returns the theme color to use for text in multiselect. +SkColor GetMultiSelectTextColor() { + return AshColorProvider::Get()->IsDarkModeEnabled() ? gfx::kGoogleBlue100 + : gfx::kGoogleBlue800; +} + } // namespace // HoldingSpaceItemChipView ---------------------------------------------------- @@ -81,24 +136,71 @@ HoldingSpaceViewDelegate* delegate, const HoldingSpaceItem* item) : HoldingSpaceItemView(delegate, item) { - auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, kPadding, kChildSpacing)); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kCenter); + using CrossAxisAlignment = views::BoxLayout::CrossAxisAlignment; + using MainAxisAlignment = views::BoxLayout::MainAxisAlignment; + using Orientation = views::BoxLayout::Orientation; - SetPreferredSize(gfx::Size(kPreferredWidth, kPreferredHeight)); + auto layout_manager = std::make_unique<views::FlexLayout>(); + layout_manager->SetOrientation(views::LayoutOrientation::kHorizontal) + .SetCrossAxisAlignment(views::LayoutAlignment::kCenter) + .SetCollapseMargins(true) + .SetIgnoreDefaultMainAxisMargins(true) + .SetInteriorMargin(gfx::Insets(kPadding)) + .SetDefault(views::kMarginsKey, gfx::Insets(0, kChildSpacing)); - auto* image_checkmark_and_secondary_action_container = - AddChildView(std::make_unique<views::View>()); - image_checkmark_and_secondary_action_container->SetLayoutManager( - std::make_unique<views::FillLayout>()); + auto paint_label_mask_callback = base::BindRepeating( + &HoldingSpaceItemChipView::OnPaintLabelMask, base::Unretained(this)); - // Image. - image_ = image_checkmark_and_secondary_action_container->AddChildView( - std::make_unique<RoundedImageView>( - kHoldingSpaceChipIconSize / 2, - RoundedImageView::Alignment::kLeading)); - image_->SetID(kHoldingSpaceItemImageId); + auto secondary_action_callback = + base::BindRepeating(&HoldingSpaceItemChipView::OnSecondaryActionPressed, + base::Unretained(this)); + + HoldingSpaceViewBuilder<HoldingSpaceItemChipView>(this) + .SetPreferredSize(gfx::Size(kPreferredWidth, kPreferredHeight)) + .SetLayoutManager(std::move(layout_manager)) + .AddChild( + HoldingSpaceViewBuilder<views::View>( + views::Builder<views::View>().SetUseDefaultFillLayout(true)) + .AddChild(views::Builder<RoundedImageView>() + .CopyAddressTo(&image_) + .SetID(kHoldingSpaceItemImageId) + .SetCornerRadius(kHoldingSpaceChipIconSize / 2)) + .AddChild(CreateCheckmark()) + .AddChild( + HoldingSpaceViewBuilder<views::View>( + views::Builder<views::View>() + .CopyAddressTo(&secondary_action_container_) + .SetID(kHoldingSpaceItemSecondaryActionContainerId) + .SetUseDefaultFillLayout(true) + .SetVisible(false)) + .AddChild(CreateSecondaryActionBuilder( + secondary_action_callback) + ->CopyAddressTo(&secondary_action_pause_) + .SetID(kHoldingSpaceItemPauseButtonId)) + .AddChild(CreateSecondaryActionBuilder( + secondary_action_callback) + ->CopyAddressTo(&secondary_action_resume_) + .SetID(kHoldingSpaceItemResumeButtonId)))) + .AddChild( + HoldingSpaceViewBuilder<views::View>( + views::Builder<views::View>() + .SetUseDefaultFillLayout(true) + .SetProperty(views::kFlexBehaviorKey, + views::FlexSpecification( + views::MinimumFlexSizeRule::kScaleToZero, + views::MaximumFlexSizeRule::kUnbounded))) + .AddChild(CreateLabelBuilder(bubble_utils::LabelStyle::kChip, + item->text(), + paint_label_mask_callback) + ->CopyAddressTo(&label_)) + .AddChild( + HoldingSpaceViewBuilder<views::BoxLayoutView>( + views::Builder<views::BoxLayoutView>() + .SetOrientation(Orientation::kHorizontal) + .SetMainAxisAlignment(MainAxisAlignment::kEnd) + .SetCrossAxisAlignment(CrossAxisAlignment::kCenter)) + .AddChild(CreatePrimaryAction(/*min_size=*/gfx::Size())))) + .BuildChildren(); // Subscribe to be notified of changes to `item_`'s image. image_subscription_ = @@ -106,82 +208,6 @@ &HoldingSpaceItemChipView::UpdateImage, base::Unretained(this))); UpdateImage(); - - // Checkmark. - AddCheckmark(/*parent=*/image_checkmark_and_secondary_action_container); - - // Secondary action. - secondary_action_container_ = - image_checkmark_and_secondary_action_container->AddChildView( - std::make_unique<views::View>()); - secondary_action_container_->SetID( - kHoldingSpaceItemSecondaryActionContainerId); - secondary_action_container_->SetLayoutManager( - std::make_unique<views::FillLayout>()); - secondary_action_container_->SetVisible(false); - - // Pause. - secondary_action_pause_ = secondary_action_container_->AddChildView( - std::make_unique<views::ImageButton>(base::BindRepeating( - &HoldingSpaceItemChipView::OnSecondaryActionPressed, - base::Unretained(this)))); - secondary_action_pause_->SetID(kHoldingSpaceItemPauseButtonId); - secondary_action_pause_->SetFocusBehavior(views::View::FocusBehavior::NEVER); - secondary_action_pause_->SetImageHorizontalAlignment( - views::ImageButton::HorizontalAlignment::ALIGN_CENTER); - secondary_action_pause_->SetImageVerticalAlignment( - views::ImageButton::VerticalAlignment::ALIGN_MIDDLE); - secondary_action_pause_->SetVisible(false); - - // Resume. - secondary_action_resume_ = secondary_action_container_->AddChildView( - std::make_unique<views::ImageButton>(base::BindRepeating( - &HoldingSpaceItemChipView::OnSecondaryActionPressed, - base::Unretained(this)))); - secondary_action_resume_->SetID(kHoldingSpaceItemResumeButtonId); - secondary_action_resume_->SetFocusBehavior(views::View::FocusBehavior::NEVER); - secondary_action_resume_->SetImageHorizontalAlignment( - views::ImageButton::HorizontalAlignment::ALIGN_CENTER); - secondary_action_resume_->SetImageVerticalAlignment( - views::ImageButton::VerticalAlignment::ALIGN_MIDDLE); - secondary_action_resume_->SetVisible(false); - - auto* label_and_primary_action_container = - AddChildView(std::make_unique<views::View>()); - label_and_primary_action_container->SetLayoutManager( - std::make_unique<views::FillLayout>()); - layout->SetFlexForView(label_and_primary_action_container, 1); - - // Label. - // NOTE: A11y events for `label_` are handled by its parent. - label_ = label_and_primary_action_container->AddChildView( - std::make_unique<PaintCallbackLabel>( - base::BindRepeating(&HoldingSpaceItemChipView::OnPaintLabelMask, - base::Unretained(this)))); - label_->GetViewAccessibility().OverrideIsIgnored(true); - label_->SetBorder(views::CreateEmptyBorder(kLabelMargins)); - label_->SetElideBehavior(gfx::ELIDE_MIDDLE); - label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - label_->SetText(item->text()); - label_->SetPaintToLayer(); - label_->layer()->SetFillsBoundsOpaquely(false); - - bubble_utils::ApplyStyle(label_, bubble_utils::LabelStyle::kChip); - - // Primary action. - views::View* primary_action_container = - label_and_primary_action_container->AddChildView( - std::make_unique<views::View>()); - - layout = primary_action_container->SetLayoutManager( - std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal)); - layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kEnd); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kCenter); - - AddPrimaryAction(/*parent=*/primary_action_container, - /*min_size=*/gfx::Size()); } HoldingSpaceItemChipView::~HoldingSpaceItemChipView() = default;
diff --git a/ash/system/holding_space/holding_space_item_screen_capture_view.cc b/ash/system/holding_space/holding_space_item_screen_capture_view.cc index 3358503..33f2118b 100644 --- a/ash/system/holding_space/holding_space_item_screen_capture_view.cc +++ b/ash/system/holding_space/holding_space_item_screen_capture_view.cc
@@ -10,6 +10,7 @@ #include "ash/public/cpp/rounded_image_view.h" #include "ash/style/ash_color_provider.h" #include "ash/system/holding_space/holding_space_util.h" +#include "ash/system/holding_space/holding_space_view_builder.h" #include "ash/system/tray/tray_constants.h" #include "base/bind.h" #include "components/vector_icons/vector_icons.h" @@ -20,7 +21,10 @@ #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/image_view.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/layout/box_layout_view.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/layout/flex_layout_view.h" +#include "ui/views/metadata/view_factory.h" namespace ash { @@ -33,12 +37,46 @@ HoldingSpaceViewDelegate* delegate, const HoldingSpaceItem* item) : HoldingSpaceItemView(delegate, item) { - SetPreferredSize(kHoldingSpaceScreenCaptureSize); - SetLayoutManager(std::make_unique<views::FillLayout>()); + using CrossAxisAlignment = views::BoxLayout::CrossAxisAlignment; + using MainAxisAlignment = views::BoxLayout::MainAxisAlignment; - image_ = AddChildView(std::make_unique<RoundedImageView>( - kHoldingSpaceCornerRadius, RoundedImageView::Alignment::kLeading)); - image_->SetID(kHoldingSpaceItemImageId); + HoldingSpaceViewBuilder<HoldingSpaceItemScreenCaptureView>(this) + .SetPreferredSize(kHoldingSpaceScreenCaptureSize) + .SetLayoutManager(std::make_unique<views::FillLayout>()) + .AddChild(views::Builder<RoundedImageView>() + .CopyAddressTo(&image_) + .SetID(kHoldingSpaceItemImageId) + .SetCornerRadius(kHoldingSpaceCornerRadius)) + .AddChildIf( + item->type() == HoldingSpaceItem::Type::kScreenRecording, + base::BindOnce( + [](views::ImageView** play_icon) -> std::unique_ptr<views::View> { + return views::Builder<views::BoxLayoutView>() + .SetOrientation(views::BoxLayout::Orientation::kHorizontal) + .SetMainAxisAlignment(MainAxisAlignment::kCenter) + .SetCrossAxisAlignment(CrossAxisAlignment::kCenter) + .SetFocusBehavior(views::View::FocusBehavior::NEVER) + .AddChild(views::Builder<views::ImageView>() + .CopyAddressTo(play_icon) + .SetID(kHoldingSpaceScreenCapturePlayIconId) + .SetPreferredSize(kPlayIconSize)) + .Build(); + }, + &play_icon_)) + .AddChild(HoldingSpaceViewBuilder<views::FlexLayoutView>( + views::Builder<views::FlexLayoutView>() + .SetOrientation(views::LayoutOrientation::kHorizontal) + .SetCrossAxisAlignment(views::LayoutAlignment::kStart) + .SetInteriorMargin( + kCheckmarkAndPrimaryActionContainerPadding)) + .AddChild(CreateCheckmark()) + .AddChild(views::Builder<views::View>().SetProperty( + views::kFlexBehaviorKey, + views::FlexSpecification( + views::MinimumFlexSizeRule::kScaleToZero, + views::MaximumFlexSizeRule::kUnbounded))) + .AddChild(CreatePrimaryAction(kPrimaryActionSize))) + .BuildChildren(); // Subscribe to be notified of changes to `item_`'s image. image_subscription_ = item->image().AddImageSkiaChangedCallback( @@ -46,30 +84,6 @@ base::Unretained(this))); UpdateImage(); - - if (item->type() == HoldingSpaceItem::Type::kScreenRecording) - AddPlayIcon(); - - views::View* checkmark_and_primary_action_container = - AddChildView(std::make_unique<views::View>()); - auto* layout = checkmark_and_primary_action_container->SetLayoutManager( - std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, - kCheckmarkAndPrimaryActionContainerPadding)); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kStart); - - // Checkmark. - AddCheckmark(/*parent=*/checkmark_and_primary_action_container); - - // Spacer. - views::View* spacer = checkmark_and_primary_action_container->AddChildView( - std::make_unique<views::View>()); - layout->SetFlexForView(spacer, 1); - - // Primary action. - AddPrimaryAction(/*parent=*/checkmark_and_primary_action_container, - /*min_size=*/kPrimaryActionSize); } HoldingSpaceItemScreenCaptureView::~HoldingSpaceItemScreenCaptureView() = @@ -125,23 +139,6 @@ SchedulePaint(); } -void HoldingSpaceItemScreenCaptureView::AddPlayIcon() { - auto* play_icon_container = AddChildView(std::make_unique<views::View>()); - play_icon_container->SetFocusBehavior(views::View::FocusBehavior::NEVER); - - auto* layout = - play_icon_container->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal)); - layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kCenter); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kCenter); - - play_icon_ = - play_icon_container->AddChildView(std::make_unique<views::ImageView>()); - play_icon_->SetID(kHoldingSpaceScreenCapturePlayIconId); - play_icon_->SetPreferredSize(kPlayIconSize); -} - BEGIN_METADATA(HoldingSpaceItemScreenCaptureView, HoldingSpaceItemView) END_METADATA
diff --git a/ash/system/holding_space/holding_space_item_screen_capture_view.h b/ash/system/holding_space/holding_space_item_screen_capture_view.h index ea987e8..3e1629c 100644 --- a/ash/system/holding_space/holding_space_item_screen_capture_view.h +++ b/ash/system/holding_space/holding_space_item_screen_capture_view.h
@@ -42,9 +42,6 @@ void UpdateImage(); - // Overlays a play icon over `image_`. - void AddPlayIcon(); - // Owned by view hierarchy. RoundedImageView* image_ = nullptr; views::ImageView* play_icon_ = nullptr;
diff --git a/ash/system/holding_space/holding_space_item_view.cc b/ash/system/holding_space/holding_space_item_view.cc index 213f7f8..7f75d1f 100644 --- a/ash/system/holding_space/holding_space_item_view.cc +++ b/ash/system/holding_space/holding_space_item_view.cc
@@ -26,6 +26,7 @@ #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/image_view.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/view_factory.h" #include "ui/views/painter.h" #include "ui/views/style/platform_style.h" #include "ui/views/vector_icons.h" @@ -327,54 +328,57 @@ OnSelectionUiChanged(); } -views::ImageView* HoldingSpaceItemView::AddCheckmark(views::View* parent) { +std::unique_ptr<views::ImageView> HoldingSpaceItemView::CreateCheckmark() { DCHECK(!checkmark_); - checkmark_ = parent->AddChildView(std::make_unique<views::ImageView>()); - checkmark_->SetID(kHoldingSpaceItemCheckmarkId); - checkmark_->SetVisible(selected()); - return checkmark_; + return views::Builder<views::ImageView>() + .CopyAddressTo(&checkmark_) + .SetID(kHoldingSpaceItemCheckmarkId) + .SetVisible(selected()) + .Build(); } -views::View* HoldingSpaceItemView::AddPrimaryAction(views::View* parent, - const gfx::Size& min_size) { +std::unique_ptr<views::View> HoldingSpaceItemView::CreatePrimaryAction( + const gfx::Size& min_size) { DCHECK(!primary_action_container_); DCHECK(!primary_action_cancel_); DCHECK(!primary_action_pin_); - primary_action_container_ = - parent->AddChildView(std::make_unique<MinimumSizableView>(min_size)); - primary_action_container_->SetID(kHoldingSpaceItemPrimaryActionContainerId); - primary_action_container_->SetLayoutManager( - std::make_unique<views::FillLayout>()); - primary_action_container_->SetVisible(false); + using HorizontalAlignment = views::ImageButton::HorizontalAlignment; + using VerticalAlignment = views::ImageButton::VerticalAlignment; - // Cancel. - primary_action_cancel_ = primary_action_container_->AddChildView( - std::make_unique<views::ImageButton>( - base::BindRepeating(&HoldingSpaceItemView::OnPrimaryActionPressed, - base::Unretained(this)))); - primary_action_cancel_->SetID(kHoldingSpaceItemCancelButtonId); - primary_action_cancel_->SetFocusBehavior(views::View::FocusBehavior::NEVER); - primary_action_cancel_->SetImageHorizontalAlignment( - views::ImageButton::HorizontalAlignment::ALIGN_CENTER); - primary_action_cancel_->SetImageVerticalAlignment( - views::ImageButton::VerticalAlignment::ALIGN_MIDDLE); - primary_action_cancel_->SetVisible(false); + gfx::Size preferred_size(kHoldingSpaceIconSize, kHoldingSpaceIconSize); + preferred_size.SetToMax(min_size); - // Pin. - primary_action_pin_ = primary_action_container_->AddChildView( - std::make_unique<views::ToggleImageButton>( - base::BindRepeating(&HoldingSpaceItemView::OnPrimaryActionPressed, - base::Unretained(this)))); - primary_action_pin_->SetID(kHoldingSpaceItemPinButtonId); - primary_action_pin_->SetFocusBehavior(views::View::FocusBehavior::NEVER); - primary_action_pin_->SetImageHorizontalAlignment( - views::ToggleImageButton::HorizontalAlignment::ALIGN_CENTER); - primary_action_pin_->SetImageVerticalAlignment( - views::ToggleImageButton::VerticalAlignment::ALIGN_MIDDLE); - primary_action_pin_->SetVisible(false); - - return primary_action_container_; + return views::Builder<views::View>() + .CopyAddressTo(&primary_action_container_) + .SetID(kHoldingSpaceItemPrimaryActionContainerId) + .SetUseDefaultFillLayout(true) + .SetVisible(false) + .AddChild( + views::Builder<views::ImageButton>() + .CopyAddressTo(&primary_action_cancel_) + .SetID(kHoldingSpaceItemCancelButtonId) + .SetCallback(base::BindRepeating( + &HoldingSpaceItemView::OnPrimaryActionPressed, + base::Unretained(this))) + .SetFocusBehavior(views::View::FocusBehavior::NEVER) + .SetImageHorizontalAlignment(HorizontalAlignment::ALIGN_CENTER) + .SetImageVerticalAlignment(VerticalAlignment::ALIGN_MIDDLE) + .SetPreferredSize(preferred_size) + .SetVisible(false)) + .AddChild( + views::Builder<views::ToggleImageButton>() + .CopyAddressTo(&primary_action_pin_) + .SetID(kHoldingSpaceItemPinButtonId) + .SetCallback(base::BindRepeating( + &HoldingSpaceItemView::OnPrimaryActionPressed, + base::Unretained(this))) + .SetFocusBehavior(views::View::FocusBehavior::NEVER) + .SetImageHorizontalAlignment(HorizontalAlignment::ALIGN_CENTER) + .SetImageVerticalAlignment(VerticalAlignment::ALIGN_MIDDLE) + .SetPreferredSize(preferred_size) + .SetVisible(false)) + .Build(); } void HoldingSpaceItemView::OnSelectionUiChanged() {
diff --git a/ash/system/holding_space/holding_space_item_view.h b/ash/system/holding_space/holding_space_item_view.h index 356fb307..5b3de88e 100644 --- a/ash/system/holding_space/holding_space_item_view.h +++ b/ash/system/holding_space/holding_space_item_view.h
@@ -80,8 +80,8 @@ bool selected() const { return selected_; } protected: - views::ImageView* AddCheckmark(views::View* parent); - views::View* AddPrimaryAction(views::View* parent, const gfx::Size& min_size); + std::unique_ptr<views::ImageView> CreateCheckmark(); + std::unique_ptr<views::View> CreatePrimaryAction(const gfx::Size& min_size); virtual void OnPrimaryActionVisibilityChanged(bool visible) {} virtual void OnSelectionUiChanged();
diff --git a/ash/system/holding_space/holding_space_test_api.cc b/ash/system/holding_space/holding_space_test_api.cc index 11183ed..a7a64e38 100644 --- a/ash/system/holding_space/holding_space_test_api.cc +++ b/ash/system/holding_space/holding_space_test_api.cc
@@ -97,6 +97,11 @@ return holding_space_tray_ && holding_space_tray_->GetVisible(); } +const base::FilePath& HoldingSpaceTestApi::GetHoldingSpaceItemFilePath( + const views::View* item_view) const { + return HoldingSpaceItemView::Cast(item_view)->item()->file_path(); +} + const std::string& HoldingSpaceTestApi::GetHoldingSpaceItemId( const views::View* item_view) const { return HoldingSpaceItemView::Cast(item_view)->item_id();
diff --git a/ash/system/holding_space/holding_space_view_builder.h b/ash/system/holding_space/holding_space_view_builder.h new file mode 100644 index 0000000..394fe3e --- /dev/null +++ b/ash/system/holding_space/holding_space_view_builder.h
@@ -0,0 +1,132 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_VIEW_BUILDER_H_ +#define ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_VIEW_BUILDER_H_ + +#include "memory" +#include "vector" + +#include "base/callback.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/gfx/geometry/size.h" +#include "ui/views/view.h" + +namespace views { +class LayoutManager; +} // namespace views + +namespace ash { + +// A class which facilitates building of a view hierarchy. It is designed to be +// used similarly to (and conjunction with) `views::Builder` but differs in that +// it uses `std::unique_ptr<ViewType>` as its underlying storage mechanism +// rather than wrapped `views::Builder<ViewType>` references. This allows it to +// interop with both builders as well as traditionally constructed views. +// NOTE: The intention is to remove this class once changes have been made at +// the views framework level to support improved child lifetime management in +// `views::Builder>. That effort is being tracked in https://crbug.com/1218115. +template <typename ViewType> +class HoldingSpaceViewBuilder { + public: + // Constructs an instance from a `builder`. + template <typename BuilderType> + HoldingSpaceViewBuilder(BuilderType& builder) + : HoldingSpaceViewBuilder(builder.Build()) {} + + // Constructs an instance from an owned `root_view`. + explicit HoldingSpaceViewBuilder(std::unique_ptr<ViewType> root_view) + : owned_root_view_(std::move(root_view)), + root_view_(owned_root_view_.get()) { + DCHECK(owned_root_view_); + DCHECK(root_view_); + } + + // Constructs an instance from an unowned `root_view`. + explicit HoldingSpaceViewBuilder(ViewType* root_view) + : root_view_(root_view) { + DCHECK(root_view_); + } + + HoldingSpaceViewBuilder(const HoldingSpaceViewBuilder&) = delete; + HoldingSpaceViewBuilder& operator=(const HoldingSpaceViewBuilder&) = delete; + ~HoldingSpaceViewBuilder() = default; + + // Builds and returns an `owned_root_view_`. + std::unique_ptr<ViewType> Build() { + DCHECK(owned_root_view_); + BuildChildren(); + return std::move(owned_root_view_); + } + + // Builds children for a potentially unowned `root_view_`. + void BuildChildren() { + for (auto& child : children_) + root_view_->AddChildView(std::move(child)); + children_.clear(); + } + + // Adds a pending child to be added to `root_view_` at `Build*()` time, + // returning a reference to `this` as a convenience. + template <typename BuilderType> + HoldingSpaceViewBuilder<ViewType>& AddChild(BuilderType& builder) { + return AddChild(builder.Build()); + } + + // Adds a pending `child` to be added to `root_view_` at `Build*()` time, + // returning a reference to `this` as a convenience. + HoldingSpaceViewBuilder<ViewType>& AddChild( + std::unique_ptr<views::View> child) { + children_.push_back(std::move(child)); + return *this; + } + + // Adds a pending `child` to be added to `root_view_` at `Build*()` time if + // the specified `condition` is `true`, returning a reference to `this` as a + // convenience. + HoldingSpaceViewBuilder<ViewType>& AddChildIf( + bool condition, + base::OnceCallback<std::unique_ptr<views::View>()> callback) { + return condition ? AddChild(std::move(callback).Run()) : *this; + } + + // Copies the address of `root_view_` to the specified `address_ptr`, + // returning a reference to `this` as a convenience. + HoldingSpaceViewBuilder<ViewType>& CopyAddressTo(ViewType** address_ptr) { + *address_ptr = root_view_; + return *this; + } + + // Sets the `id` for `root_view_`, returning a reference to `this` as a + // convenience. + HoldingSpaceViewBuilder<ViewType>& SetID(int id) { + root_view_->SetID(id); + return *this; + } + + // Sets the `layout_manager` for `root_view_`, returning a reference to `this` + // as a convenience. + HoldingSpaceViewBuilder<ViewType>& SetLayoutManager( + std::unique_ptr<views::LayoutManager> layout_manager) { + root_view_->SetLayoutManager(std::move(layout_manager)); + return *this; + } + + // Sets the `preferred_size` for `root_view`, returning a reference to `this` + // as a convenience. + HoldingSpaceViewBuilder<ViewType>& SetPreferredSize( + const gfx::Size& preferred_size) { + root_view_->SetPreferredSize(preferred_size); + return *this; + } + + private: + std::unique_ptr<ViewType> owned_root_view_; + ViewType* const root_view_; + std::vector<std::unique_ptr<views::View>> children_; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_HOLDING_SPACE_HOLDING_SPACE_VIEW_BUILDER_H_
diff --git a/ash/system/holding_space/holding_space_view_delegate.cc b/ash/system/holding_space/holding_space_view_delegate.cc index b2c4d629..b7a695f3 100644 --- a/ash/system/holding_space/holding_space_view_delegate.cc +++ b/ash/system/holding_space/holding_space_view_delegate.cc
@@ -543,9 +543,13 @@ bool is_pausable = true; bool is_resumable = true; bool is_cancelable = true; - bool is_pinnable = false; bool is_removable = true; + // A value for `is_pinnable` will only be present if the `selection` contains + // at least one holding space item which is *not* in-progress. In-progress + // items are ignored with respect to pin-/unpin-ability. + absl::optional<bool> is_pinnable; + HoldingSpaceModel* const model = HoldingSpaceController::Get()->model(); for (const HoldingSpaceItemView* view : selection) { const HoldingSpaceItem* item = view->item(); @@ -562,15 +566,21 @@ // holding space items are cancelable. is_cancelable &= item->IsInProgress(); - // The "Pin" command should be present if *any* selected holding space item - // is unpinned. When executing this command, any holding space items that - // are already pinned will be ignored. - is_pinnable |= !model->ContainsItem(HoldingSpaceItem::Type::kPinnedFile, - item->file_path()); - // The "Remove" command should only be present if *all* of the selected // holding space items are removable. is_removable &= item->type() != HoldingSpaceItem::Type::kPinnedFile; + + // In-progress holding space items are ignored with respect to the pin-/ + // unpin-ability of the `selection`. + if (item->IsInProgress()) + continue; + + // The "Pin" command should be present if *any* selected holding space item + // is unpinned. When executing this command, any holding space items that + // are already pinned will be ignored. + is_pinnable = is_pinnable.value_or(false) || + !model->ContainsItem(HoldingSpaceItem::Type::kPinnedFile, + item->file_path()); } if (is_pausable) { @@ -629,18 +639,20 @@ } } - if (is_pinnable) { - context_menu_model_->AddItemWithIcon( - static_cast<int>(HoldingSpaceCommandId::kPinItem), - l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_CONTEXT_MENU_PIN), - ui::ImageModel::FromVectorIcon(views::kPinIcon, /*color_id=*/-1, - kHoldingSpaceIconSize)); - } else { - context_menu_model_->AddItemWithIcon( - static_cast<int>(HoldingSpaceCommandId::kUnpinItem), - l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_CONTEXT_MENU_UNPIN), - ui::ImageModel::FromVectorIcon(views::kUnpinIcon, /*color_id=*/-1, - kHoldingSpaceIconSize)); + if (is_pinnable.has_value()) { + if (is_pinnable.value()) { + context_menu_model_->AddItemWithIcon( + static_cast<int>(HoldingSpaceCommandId::kPinItem), + l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_CONTEXT_MENU_PIN), + ui::ImageModel::FromVectorIcon(views::kPinIcon, /*color_id=*/-1, + kHoldingSpaceIconSize)); + } else { + context_menu_model_->AddItemWithIcon( + static_cast<int>(HoldingSpaceCommandId::kUnpinItem), + l10n_util::GetStringUTF16(IDS_ASH_HOLDING_SPACE_CONTEXT_MENU_UNPIN), + ui::ImageModel::FromVectorIcon(views::kUnpinIcon, /*color_id=*/-1, + kHoldingSpaceIconSize)); + } } if (is_removable) {
diff --git a/ash/system/network/vpn_list.cc b/ash/system/network/vpn_list.cc index 83e1866..18ab170 100644 --- a/ash/system/network/vpn_list.cc +++ b/ash/system/network/vpn_list.cc
@@ -63,6 +63,7 @@ switch (provider->type) { case VpnType::kL2TPIPsec: case VpnType::kOpenVPN: + case VpnType::kWireGuard: // Only third party VpnProvider instances should exist. NOTREACHED(); break;
diff --git a/ash/system/power/peripheral_battery_notifier_unittest.cc b/ash/system/power/peripheral_battery_notifier_unittest.cc index 3f01a59..cd49334 100644 --- a/ash/system/power/peripheral_battery_notifier_unittest.cc +++ b/ash/system/power/peripheral_battery_notifier_unittest.cc
@@ -52,7 +52,6 @@ ~PeripheralBatteryNotifierTest() override = default; void SetUp() override { - ui::DeviceDataManager::CreateInstance(); chromeos::PowerManagerClient::InitializeFake(); AshTestBase::SetUp(); ASSERT_TRUE(ui::DeviceDataManager::HasInstance()); @@ -71,11 +70,10 @@ } void TearDown() override { - AshTestBase::TearDown(); battery_notifier_.reset(); battery_listener_.reset(); + AshTestBase::TearDown(); chromeos::PowerManagerClient::Shutdown(); - ui::DeviceDataManager::DeleteInstance(); } // Extracts the battery percentage from the message of a notification.
diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc index d9fd5cc..72e80d7 100644 --- a/ash/system/status_area_widget.cc +++ b/ash/system/status_area_widget.cc
@@ -98,52 +98,65 @@ DCHECK(!initialized_); // Create the child views, left to right. - overflow_button_tray_ = + auto overflow_button_tray = std::make_unique<StatusAreaOverflowButtonTray>(shelf_); - AddTrayButton(overflow_button_tray_.get()); + overflow_button_tray_ = overflow_button_tray.get(); + AddTrayButton(std::move(overflow_button_tray)); - holding_space_tray_ = std::make_unique<HoldingSpaceTray>(shelf_); - AddTrayButton(holding_space_tray_.get()); + auto holding_space_tray = std::make_unique<HoldingSpaceTray>(shelf_); + holding_space_tray_ = holding_space_tray.get(); + AddTrayButton(std::move(holding_space_tray)); - logout_button_tray_ = std::make_unique<LogoutButtonTray>(shelf_); - AddTrayButton(logout_button_tray_.get()); + auto logout_button_tray = std::make_unique<LogoutButtonTray>(shelf_); + logout_button_tray_ = logout_button_tray.get(); + AddTrayButton(std::move(logout_button_tray)); - dictation_button_tray_ = std::make_unique<DictationButtonTray>(shelf_); - AddTrayButton(dictation_button_tray_.get()); + auto dictation_button_tray = std::make_unique<DictationButtonTray>(shelf_); + dictation_button_tray_ = dictation_button_tray.get(); + AddTrayButton(std::move(dictation_button_tray)); - select_to_speak_tray_ = std::make_unique<SelectToSpeakTray>(shelf_); - AddTrayButton(select_to_speak_tray_.get()); + auto select_to_speak_tray = std::make_unique<SelectToSpeakTray>(shelf_); + select_to_speak_tray_ = select_to_speak_tray.get(); + AddTrayButton(std::move(select_to_speak_tray)); - ime_menu_tray_ = std::make_unique<ImeMenuTray>(shelf_); - AddTrayButton(ime_menu_tray_.get()); + auto ime_menu_tray = std::make_unique<ImeMenuTray>(shelf_); + ime_menu_tray_ = ime_menu_tray.get(); + AddTrayButton(std::move(ime_menu_tray)); - virtual_keyboard_tray_ = std::make_unique<VirtualKeyboardTray>(shelf_); - AddTrayButton(virtual_keyboard_tray_.get()); + auto virtual_keyboard_tray = std::make_unique<VirtualKeyboardTray>(shelf_); + virtual_keyboard_tray_ = virtual_keyboard_tray.get(); + AddTrayButton(std::move(virtual_keyboard_tray)); if (features::IsCaptureModeEnabled()) { - stop_recording_button_tray_ = + auto stop_recording_button_tray = std::make_unique<StopRecordingButtonTray>(shelf_); - AddTrayButton(stop_recording_button_tray_.get()); + stop_recording_button_tray_ = stop_recording_button_tray.get(); + AddTrayButton(std::move(stop_recording_button_tray)); } - palette_tray_ = std::make_unique<PaletteTray>(shelf_); - AddTrayButton(palette_tray_.get()); + auto palette_tray = std::make_unique<PaletteTray>(shelf_); + palette_tray_ = palette_tray.get(); + AddTrayButton(std::move(palette_tray)); if (base::FeatureList::IsEnabled(media::kGlobalMediaControlsForChromeOS)) { - media_tray_ = std::make_unique<MediaTray>(shelf_); - AddTrayButton(media_tray_.get()); + auto media_tray = std::make_unique<MediaTray>(shelf_); + media_tray_ = media_tray.get(); + AddTrayButton(std::move(media_tray)); } if (chromeos::features::IsPhoneHubEnabled()) { - phone_hub_tray_ = std::make_unique<PhoneHubTray>(shelf_); - AddTrayButton(phone_hub_tray_.get()); + auto phone_hub_tray = std::make_unique<PhoneHubTray>(shelf_); + phone_hub_tray_ = phone_hub_tray.get(); + AddTrayButton(std::move(phone_hub_tray)); } - unified_system_tray_ = std::make_unique<UnifiedSystemTray>(shelf_); - AddTrayButton(unified_system_tray_.get()); + auto unified_system_tray = std::make_unique<UnifiedSystemTray>(shelf_); + unified_system_tray_ = unified_system_tray.get(); + AddTrayButton(std::move(unified_system_tray)); - overview_button_tray_ = std::make_unique<OverviewButtonTray>(shelf_); - AddTrayButton(overview_button_tray_.get()); + auto overview_button_tray = std::make_unique<OverviewButtonTray>(shelf_); + overview_button_tray_ = overview_button_tray.get(); + AddTrayButton(std::move(overview_button_tray)); // Each tray_button's animation will be disabled for the life time of this // local `animation_disablers`, which means the closures to enable the @@ -173,6 +186,10 @@ StatusAreaWidget::~StatusAreaWidget() { Shell::Get()->session_controller()->RemoveObserver(this); + // TODO(pbos): Investigate if this is necessary. This is a bit defensive but + // it's done to make sure that StatusAreaWidget isn't accessed by the View + // hierarchy during destruction. + status_area_widget_delegate_->RemoveAllChildViews(/*delete=*/true); } // static @@ -190,7 +207,7 @@ } void StatusAreaWidget::SetSystemTrayVisibility(bool visible) { - TrayBackgroundView* tray = unified_system_tray_.get(); + TrayBackgroundView* tray = unified_system_tray_; tray->SetVisiblePreferred(visible); if (visible) { Show(); @@ -230,9 +247,9 @@ void StatusAreaWidget::LogVisiblePodCountMetric() { int visible_pod_count = 0; for (auto* tray_button : tray_buttons_) { - if (tray_button == overflow_button_tray_.get() || - tray_button == overview_button_tray_.get() || - tray_button == unified_system_tray_.get() || !tray_button->GetVisible()) + if (tray_button == overflow_button_tray_ || + tray_button == overview_button_tray_ || + tray_button == unified_system_tray_ || !tray_button->GetVisible()) continue; visible_pod_count += 1; @@ -371,7 +388,7 @@ if (!tray->visible_preferred()) continue; // Skip |stop_recording_button_tray_| since it's always visible. - if (tray == stop_recording_button_tray_.get()) + if (tray == stop_recording_button_tray_) continue; // Show overflow button once available width is exceeded. @@ -404,8 +421,8 @@ void StatusAreaWidget::EnsureTrayOrder() { if (features::IsCaptureModeEnabled()) { - status_area_widget_delegate_->ReorderChildView( - stop_recording_button_tray_.get(), 1); + status_area_widget_delegate_->ReorderChildView(stop_recording_button_tray_, + 1); } } @@ -451,7 +468,7 @@ for (TrayBackgroundView* tray : base::Reversed(tray_buttons_)) { // If we reach the final overflow tray button, then all the tray buttons // fit and there is no need for a collapse state. - if (tray == overflow_button_tray_.get()) + if (tray == overflow_button_tray_) return CollapseState::NOT_COLLAPSIBLE; // Skip non-enabled tray buttons. @@ -472,9 +489,9 @@ // view because the view is still visible when fading away, but we do not want // to anchor to this element in that case. if (overview_button_tray_->layer()->GetTargetVisibility()) - return overview_button_tray_.get(); + return overview_button_tray_; - return unified_system_tray_.get(); + return unified_system_tray_; } gfx::Rect StatusAreaWidget::GetMediaTrayAnchorRect() const { @@ -489,7 +506,7 @@ // Accumulate the width/height of all visible tray buttons after media tray. for (views::View* tray_button : tray_buttons_) { - if (tray_button == media_tray_.get()) { + if (tray_button == media_tray_) { found_media_tray = true; continue; } @@ -571,7 +588,7 @@ // Clicking anywhere except the virtual keyboard tray icon should hide the // virtual keyboard. gfx::Point location = event->location(); - views::View::ConvertPointFromWidget(virtual_keyboard_tray_.get(), &location); + views::View::ConvertPointFromWidget(virtual_keyboard_tray_, &location); if (event->type() == ui::ET_MOUSE_PRESSED && !virtual_keyboard_tray_->HitTestPoint(location)) { keyboard::KeyboardUIController::Get()->HideKeyboardImplicitlyByUser(); @@ -583,7 +600,7 @@ // Tapping anywhere except the virtual keyboard tray icon should hide the // virtual keyboard. gfx::Point location = event->location(); - views::View::ConvertPointFromWidget(virtual_keyboard_tray_.get(), &location); + views::View::ConvertPointFromWidget(virtual_keyboard_tray_, &location); if (event->type() == ui::ET_GESTURE_TAP_DOWN && !virtual_keyboard_tray_->HitTestPoint(location)) { keyboard::KeyboardUIController::Get()->HideKeyboardImplicitlyByUser(); @@ -597,9 +614,10 @@ views::Widget::OnScrollEvent(event); } -void StatusAreaWidget::AddTrayButton(TrayBackgroundView* tray_button) { - status_area_widget_delegate_->AddChildView(tray_button); - tray_buttons_.push_back(tray_button); +void StatusAreaWidget::AddTrayButton( + std::unique_ptr<TrayBackgroundView> tray_button) { + tray_buttons_.push_back(tray_button.get()); + status_area_widget_delegate_->AddChildView(std::move(tray_button)); } StatusAreaWidget::LayoutInputs StatusAreaWidget::GetLayoutInputs() const {
diff --git a/ash/system/status_area_widget.h b/ash/system/status_area_widget.h index f54a9f2c..4eaf65e 100644 --- a/ash/system/status_area_widget.h +++ b/ash/system/status_area_widget.h
@@ -108,30 +108,24 @@ StatusAreaWidgetDelegate* status_area_widget_delegate() { return status_area_widget_delegate_; } - UnifiedSystemTray* unified_system_tray() { - return unified_system_tray_.get(); - } + UnifiedSystemTray* unified_system_tray() { return unified_system_tray_; } DictationButtonTray* dictation_button_tray() { - return dictation_button_tray_.get(); + return dictation_button_tray_; } - MediaTray* media_tray() { return media_tray_.get(); } + MediaTray* media_tray() { return media_tray_; } StatusAreaOverflowButtonTray* overflow_button_tray() { - return overflow_button_tray_.get(); + return overflow_button_tray_; } - OverviewButtonTray* overview_button_tray() { - return overview_button_tray_.get(); - } - PaletteTray* palette_tray() { return palette_tray_.get(); } + OverviewButtonTray* overview_button_tray() { return overview_button_tray_; } + PaletteTray* palette_tray() { return palette_tray_; } StopRecordingButtonTray* stop_recording_button_tray() { - return stop_recording_button_tray_.get(); + return stop_recording_button_tray_; } - ImeMenuTray* ime_menu_tray() { return ime_menu_tray_.get(); } - HoldingSpaceTray* holding_space_tray() { return holding_space_tray_.get(); } - PhoneHubTray* phone_hub_tray() { return phone_hub_tray_.get(); } + ImeMenuTray* ime_menu_tray() { return ime_menu_tray_; } + HoldingSpaceTray* holding_space_tray() { return holding_space_tray_; } + PhoneHubTray* phone_hub_tray() { return phone_hub_tray_; } - SelectToSpeakTray* select_to_speak_tray() { - return select_to_speak_tray_.get(); - } + SelectToSpeakTray* select_to_speak_tray() { return select_to_speak_tray_; } Shelf* shelf() { return shelf_; } @@ -158,10 +152,10 @@ // TODO(jamescook): Introduce a test API instead of these methods. LogoutButtonTray* logout_button_tray_for_testing() { - return logout_button_tray_.get(); + return logout_button_tray_; } VirtualKeyboardTray* virtual_keyboard_tray_for_testing() { - return virtual_keyboard_tray_.get(); + return virtual_keyboard_tray_; } CollapseState collapse_state() const { return collapse_state_; } @@ -207,7 +201,7 @@ void OnScrollEvent(ui::ScrollEvent* event) override; // Adds a new tray button to the status area. - void AddTrayButton(TrayBackgroundView* tray_button); + void AddTrayButton(std::unique_ptr<TrayBackgroundView> tray_button); // Called when in the collapsed state to calculate and update the visibility // of each tray button. @@ -223,19 +217,19 @@ StatusAreaWidgetDelegate* status_area_widget_delegate_; - std::unique_ptr<StatusAreaOverflowButtonTray> overflow_button_tray_; - std::unique_ptr<OverviewButtonTray> overview_button_tray_; - std::unique_ptr<DictationButtonTray> dictation_button_tray_; - std::unique_ptr<MediaTray> media_tray_; - std::unique_ptr<UnifiedSystemTray> unified_system_tray_; - std::unique_ptr<LogoutButtonTray> logout_button_tray_; - std::unique_ptr<PaletteTray> palette_tray_; - std::unique_ptr<PhoneHubTray> phone_hub_tray_; - std::unique_ptr<StopRecordingButtonTray> stop_recording_button_tray_; - std::unique_ptr<VirtualKeyboardTray> virtual_keyboard_tray_; - std::unique_ptr<ImeMenuTray> ime_menu_tray_; - std::unique_ptr<SelectToSpeakTray> select_to_speak_tray_; - std::unique_ptr<HoldingSpaceTray> holding_space_tray_; + StatusAreaOverflowButtonTray* overflow_button_tray_ = nullptr; + OverviewButtonTray* overview_button_tray_ = nullptr; + DictationButtonTray* dictation_button_tray_ = nullptr; + MediaTray* media_tray_ = nullptr; + UnifiedSystemTray* unified_system_tray_ = nullptr; + LogoutButtonTray* logout_button_tray_ = nullptr; + PaletteTray* palette_tray_ = nullptr; + PhoneHubTray* phone_hub_tray_ = nullptr; + StopRecordingButtonTray* stop_recording_button_tray_ = nullptr; + VirtualKeyboardTray* virtual_keyboard_tray_ = nullptr; + ImeMenuTray* ime_menu_tray_ = nullptr; + SelectToSpeakTray* select_to_speak_tray_ = nullptr; + HoldingSpaceTray* holding_space_tray_ = nullptr; // Vector of the tray buttons above. The ordering is used to determine which // tray buttons are hidden when they overflow the available width.
diff --git a/ash/system/tray/tray_background_view_unittest.cc b/ash/system/tray/tray_background_view_unittest.cc index ef162e5..9e6a3ce 100644 --- a/ash/system/tray/tray_background_view_unittest.cc +++ b/ash/system/tray/tray_background_view_unittest.cc
@@ -51,9 +51,11 @@ void SetUp() override { AshTestBase::SetUp(); - test_view = std::make_unique<TrayBackgroundViewTestView>(GetPrimaryShelf()); + auto test_view = + std::make_unique<TrayBackgroundViewTestView>(GetPrimaryShelf()); + test_view_ = test_view.get(); - // Adds this `test_view` to the mock `StatusAreaWidget`. We need to remove + // Adds this `test_view_` to the mock `StatusAreaWidget`. We need to remove // the layout manager from the delegate before adding a new child, since // there's an DCHECK in the `GridLayout` to assert no more child can be // added. @@ -61,7 +63,7 @@ ->status_area_widget_delegate() ->SetLayoutManager(nullptr); StatusAreaWidgetTestHelper::GetStatusAreaWidget()->AddTrayButton( - test_view.get()); + std::move(test_view)); // Set Dictation button to be visible. AccessibilityControllerImpl* controller = @@ -70,10 +72,7 @@ controller->dictation().SetEnabled(true); } - void TearDown() override { - test_view.reset(); - AshTestBase::TearDown(); - } + TrayBackgroundViewTestView* test_view() const { return test_view_; } protected: // Here we use dictation tray for testing secondary screen. @@ -87,7 +86,8 @@ ->dictation_button_tray(); } - std::unique_ptr<TrayBackgroundViewTestView> test_view; + private: + TrayBackgroundViewTestView* test_view_ = nullptr; }; TEST_F(TrayBackgroundViewTest, ShowingAnimationAbortedByHideAnimation) { @@ -95,26 +95,26 @@ ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); // Starts showing up animation. - test_view->SetVisiblePreferred(true); - EXPECT_TRUE(test_view->GetVisible()); - EXPECT_TRUE(test_view->layer()->GetTargetVisibility()); - EXPECT_TRUE(test_view->layer()->GetAnimator()->is_animating()); + test_view()->SetVisiblePreferred(true); + EXPECT_TRUE(test_view()->GetVisible()); + EXPECT_TRUE(test_view()->layer()->GetTargetVisibility()); + EXPECT_TRUE(test_view()->layer()->GetAnimator()->is_animating()); // Starts hide animation. The view is visible but the layer's target // visibility is false. - test_view->SetVisiblePreferred(false); - EXPECT_TRUE(test_view->GetVisible()); - EXPECT_FALSE(test_view->layer()->GetTargetVisibility()); - EXPECT_TRUE(test_view->layer()->GetAnimator()->is_animating()); + test_view()->SetVisiblePreferred(false); + EXPECT_TRUE(test_view()->GetVisible()); + EXPECT_FALSE(test_view()->layer()->GetTargetVisibility()); + EXPECT_TRUE(test_view()->layer()->GetAnimator()->is_animating()); // Here we wait until the animation is finished and we give it one more second // to finish the callbacks in `OnVisibilityAnimationFinished()`. - StatusAreaWidgetTestHelper::WaitForLayerAnimationEnd(test_view->layer()); + StatusAreaWidgetTestHelper::WaitForLayerAnimationEnd(test_view()->layer()); task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(1)); - // After the hide animation is finished, `test_view` is not visible. - EXPECT_FALSE(test_view->GetVisible()); - EXPECT_FALSE(test_view->layer()->GetAnimator()->is_animating()); + // After the hide animation is finished, test_view() is not visible. + EXPECT_FALSE(test_view()->GetVisible()); + EXPECT_FALSE(test_view()->layer()->GetAnimator()->is_animating()); } TEST_F(TrayBackgroundViewTest, HandleSessionChange) { @@ -129,55 +129,55 @@ // finish when this duration ends. The same for the other places below. task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - test_view->SetVisiblePreferred(false); - test_view->SetVisiblePreferred(true); + test_view()->SetVisiblePreferred(false); + test_view()->SetVisiblePreferred(true); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - EXPECT_TRUE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + EXPECT_TRUE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); GetSessionControllerClient()->SetSessionState( session_manager::SessionState::ACTIVE); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - EXPECT_FALSE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + EXPECT_FALSE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); // Enable the animation after session state get changed. task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - test_view->SetVisiblePreferred(false); - test_view->SetVisiblePreferred(true); + test_view()->SetVisiblePreferred(false); + test_view()->SetVisiblePreferred(true); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - EXPECT_TRUE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + EXPECT_TRUE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); // Not showing animation after unlocking screen. GetSessionControllerClient()->SetSessionState( session_manager::SessionState::LOCKED); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - test_view->SetVisiblePreferred(false); - test_view->SetVisiblePreferred(true); + test_view()->SetVisiblePreferred(false); + test_view()->SetVisiblePreferred(true); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - EXPECT_TRUE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + EXPECT_TRUE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); GetSessionControllerClient()->SetSessionState( session_manager::SessionState::ACTIVE); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - EXPECT_FALSE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + EXPECT_FALSE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); // Not showing animation when switching users. GetSessionControllerClient()->AddUserSession("a"); - test_view->SetVisiblePreferred(false); - test_view->SetVisiblePreferred(true); - EXPECT_TRUE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + test_view()->SetVisiblePreferred(false); + test_view()->SetVisiblePreferred(true); + EXPECT_TRUE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); // Simulates user switching by changing the order of session_ids. Shell::Get()->session_controller()->SetUserSessionOrder({2u, 1u}); task_environment()->FastForwardBy(base::TimeDelta::FromMilliseconds(20)); - EXPECT_FALSE(test_view->layer()->GetAnimator()->is_animating()); - EXPECT_TRUE(test_view->GetVisible()); + EXPECT_FALSE(test_view()->layer()->GetAnimator()->is_animating()); + EXPECT_TRUE(test_view()->GetVisible()); } TEST_F(TrayBackgroundViewTest, SecondaryDisplay) { @@ -221,4 +221,4 @@ EXPECT_TRUE(GetPrimaryDictationTray()->GetVisible()); } -} // namespace ash \ No newline at end of file +} // namespace ash
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc index 85beffb..a290d02 100644 --- a/ash/system/tray/tray_bubble_view.cc +++ b/ash/system/tray/tray_bubble_view.cc
@@ -8,6 +8,7 @@ #include <numeric> #include "ash/accessibility/accessibility_controller_impl.h" +#include "ash/public/cpp/accelerators.h" #include "ash/public/cpp/ash_features.h" #include "ash/shell.h" #include "ash/style/ash_color_provider.h" @@ -34,7 +35,6 @@ #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/layout/box_layout.h" #include "ui/views/painter.h" -#include "ui/views/views_delegate.h" #include "ui/wm/core/shadow_types.h" #include "ui/wm/core/window_util.h" @@ -42,7 +42,6 @@ using views::BubbleFrameView; using views::NonClientFrameView; using views::View; -using views::ViewsDelegate; using views::Widget; namespace ash { @@ -199,13 +198,13 @@ // MenuController::OnWillDispatchKeyEvent. event->StopPropagation(); - // To provide consistent behavior with a menu, process accelerator as a menu - // is open if the event is not handled by the widget. + // Process accelerators here since the event will not be propagated past this + // point. ui::Accelerator accelerator(*event); - ViewsDelegate::ProcessMenuAcceleratorResult result = - ViewsDelegate::GetInstance()->ProcessAcceleratorWhileMenuShowing( - accelerator); - if (result == ViewsDelegate::ProcessMenuAcceleratorResult::CLOSE_MENU) + AcceleratorController::Get()->Process(accelerator); + + // Close menu if required by the accelerator. + if (AcceleratorController::Get()->OnMenuAccelerator(accelerator)) tray_bubble_view_->CloseBubbleView(); }
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index 74e4e478..16a4148 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -5852,6 +5852,23 @@ EXPECT_EQ(desk_buttons_text[i], desks_controller->desks()[i]->name()); } +TEST_F(PersistentDesksBarTest, LeavingOrEnteringTabletModeWithOverviewModeOn) { + NewDesk(); + EXPECT_EQ(2u, DesksController::Get()->desks().size()); + EXPECT_TRUE(GetBarWidget()); + + // The bar should not be created while entering or leaving tablet mode with + // overview mode on. + auto* overview_controller = Shell::Get()->overview_controller(); + overview_controller->StartOverview(); + TabletModeControllerTestApi().EnterTabletMode(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + EXPECT_FALSE(GetBarWidget()); + TabletModeControllerTestApi().LeaveTabletMode(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + EXPECT_FALSE(GetBarWidget()); +} + // TODO(afakhry): Add more tests: // - Always on top windows are not tracked by any desk. // - Reusing containers when desks are removed and created.
diff --git a/ash/wm/desks/persistent_desks_bar_controller.cc b/ash/wm/desks/persistent_desks_bar_controller.cc index 0565503..8b9de05 100644 --- a/ash/wm/desks/persistent_desks_bar_controller.cc +++ b/ash/wm/desks/persistent_desks_bar_controller.cc
@@ -51,6 +51,7 @@ // Returns true if the persistent desks bar should be created and shown. bool ShouldPersistentDesksBarBeCreated() { return !TabletMode::Get()->InTabletMode() && + !Shell::Get()->overview_controller()->InOverviewSession() && DesksController::Get()->desks().size() > 1; } @@ -93,8 +94,7 @@ } void PersistentDesksBarController::OnDeskAdded(const Desk* desk) { - if (!Shell::Get()->overview_controller()->InOverviewSession()) - MaybeInitBarWidget(); + MaybeInitBarWidget(); } void PersistentDesksBarController::OnDeskRemoved(const Desk* desk) {
diff --git a/ash/wm/drag_window_resizer.cc b/ash/wm/drag_window_resizer.cc index b71865a3..10152ed 100644 --- a/ash/wm/drag_window_resizer.cc +++ b/ash/wm/drag_window_resizer.cc
@@ -29,17 +29,6 @@ #include "ui/wm/core/window_util.h" namespace ash { -namespace { - -void RecursiveSchedulePainter(ui::Layer* layer) { - if (!layer) - return; - layer->SchedulePaint(gfx::Rect(layer->size())); - for (auto* child : layer->children()) - RecursiveSchedulePainter(child); -} - -} // namespace // static DragWindowResizer* DragWindowResizer::instance_ = nullptr; @@ -124,10 +113,6 @@ void DragWindowResizer::EndDragImpl() { drag_window_controller_.reset(); - // TODO(malaykeshav) - This is temporary fix/workaround that keeps performance - // but may not give the best UI while dragging. See https://crbug/834114 - RecursiveSchedulePainter(GetTarget()->layer()); - // Check if the destination is another display. if (details().source == wm::WINDOW_MOVE_SOURCE_TOUCH) return;
diff --git a/ash/wm/full_restore/full_restore_controller.cc b/ash/wm/full_restore/full_restore_controller.cc index aa059f0..551c20a5 100644 --- a/ash/wm/full_restore/full_restore_controller.cc +++ b/ash/wm/full_restore/full_restore_controller.cc
@@ -301,6 +301,9 @@ DCHECK(windows_observation_.IsObservingSource(window)); windows_observation_.RemoveObservation(window); to_be_shown_windows_.erase(window); + + if (base::Contains(restore_property_clear_callbacks_, window)) + CancelAndRemoveRestorePropertyClearCallback(window); } void FullRestoreController::OnWindowStackingChanged(aura::Window* window) { @@ -537,11 +540,7 @@ } void FullRestoreController::ClearLaunchedKey(aura::Window* window) { - DCHECK(window); - DCHECK(base::Contains(restore_property_clear_callbacks_, window)); - - restore_property_clear_callbacks_[window].Cancel(); - restore_property_clear_callbacks_.erase(window); + CancelAndRemoveRestorePropertyClearCallback(window); // If the window is destroying then prevent extra work by not clearing the // property. @@ -549,6 +548,15 @@ window->SetProperty(full_restore::kLaunchedFromFullRestoreKey, false); } +void FullRestoreController::CancelAndRemoveRestorePropertyClearCallback( + aura::Window* window) { + DCHECK(window); + DCHECK(base::Contains(restore_property_clear_callbacks_, window)); + + restore_property_clear_callbacks_[window].Cancel(); + restore_property_clear_callbacks_.erase(window); +} + void FullRestoreController::SetReadWindowCallbackForTesting( ReadWindowCallback callback) { g_read_window_callback_for_testing = std::move(callback);
diff --git a/ash/wm/full_restore/full_restore_controller.h b/ash/wm/full_restore/full_restore_controller.h index 2929247..26e04c7 100644 --- a/ash/wm/full_restore/full_restore_controller.h +++ b/ash/wm/full_restore/full_restore_controller.h
@@ -112,12 +112,15 @@ // `full_restore::kLaunchedFromFullRestoreKey`. void RestoreStateTypeAndClearLaunchedKey(aura::Window* window); - // Cancels and removes the Full Restore property clear callback for `window` - // from `restore_property_clear_callbacks_`. Also sets the `window`'s - // `full_restore::kLaunchedFromFullRestoreKey` to false if the window is not - // destroying. + // Calls `CancelAndRemoveRestorePropertyClearCallback()`. Also sets the + // `window`'s `full_restore::kLaunchedFromFullRestoreKey` to false if the + // window is not destroying. void ClearLaunchedKey(aura::Window* window); + // Cancels and removes the Full Restore property clear callback for `window` + // from `restore_property_clear_callbacks_`. + void CancelAndRemoveRestorePropertyClearCallback(aura::Window* window); + // Sets a callback for testing that will be read from in // `OnWidgetInitialized()`. void SetReadWindowCallbackForTesting(ReadWindowCallback callback);
diff --git a/ash/wm/window_cycle/window_cycle_controller.cc b/ash/wm/window_cycle/window_cycle_controller.cc index a0756ad..ab8b00a 100644 --- a/ash/wm/window_cycle/window_cycle_controller.cc +++ b/ash/wm/window_cycle/window_cycle_controller.cc
@@ -253,6 +253,8 @@ ? AltTabMode::kCurrentDesk : AltTabMode::kAllDesks); } + + desks_observation_.Observe(DesksController::Get()); } void WindowCycleController::CompleteCycling() { @@ -381,6 +383,14 @@ } } +void WindowCycleController::OnDeskAdded(const Desk* desk) { + CancelCycling(); +} + +void WindowCycleController::OnDeskRemoved(const Desk* desk) { + CancelCycling(); +} + ////////////////////////////////////////////////////////////////////////////// // WindowCycleController, private: @@ -410,6 +420,8 @@ } void WindowCycleController::StopCycling() { + desks_observation_.Reset(); + window_cycle_list_.reset(); // We can't use the MRU window list here to get the active window, since
diff --git a/ash/wm/window_cycle/window_cycle_controller.h b/ash/wm/window_cycle/window_cycle_controller.h index c52cb9ea..759f7a86 100644 --- a/ash/wm/window_cycle/window_cycle_controller.h +++ b/ash/wm/window_cycle/window_cycle_controller.h
@@ -10,8 +10,10 @@ #include "ash/ash_export.h" #include "ash/public/cpp/session/session_observer.h" #include "ash/public/cpp/shell_window_ids.h" +#include "ash/wm/desks/desks_controller.h" #include "ash/wm/mru_window_tracker.h" #include "base/macros.h" +#include "base/scoped_observation.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_registry_simple.h" @@ -35,7 +37,8 @@ // until the cycling ends. Thus we maintain the state of the windows // at the beginning of the gesture so you can cycle through in a consistent // order. -class ASH_EXPORT WindowCycleController : public SessionObserver { +class ASH_EXPORT WindowCycleController : public SessionObserver, + public DesksController::Observer { public: using WindowList = std::vector<aura::Window*>; @@ -143,6 +146,15 @@ // user switches the alt-tab mode via keyboard navigation or button clicking. void OnModeChanged(bool per_desk, ModeSwitchSource source); + // DesksController::Observer: + void OnDeskAdded(const Desk* desk) override; + void OnDeskRemoved(const Desk* desk) override; + void OnDeskReordered(int old_index, int new_index) override {} + void OnDeskActivationChanged(const Desk* activated, + const Desk* deactivated) override {} + void OnDeskSwitchAnimationLaunching() override {} + void OnDeskSwitchAnimationFinished() override {} + private: // Gets a list of windows from the currently open windows, removing windows // with transient roots already in the list. The returned list of windows @@ -195,6 +207,9 @@ // The pref change registrar to observe changes in prefs value. std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_; + base::ScopedObservation<DesksController, DesksController::Observer> + desks_observation_{this}; + DISALLOW_COPY_AND_ASSIGN(WindowCycleController); };
diff --git a/ash/wm/window_cycle/window_cycle_controller_unittest.cc b/ash/wm/window_cycle/window_cycle_controller_unittest.cc index 77984858..87dc37f 100644 --- a/ash/wm/window_cycle/window_cycle_controller_unittest.cc +++ b/ash/wm/window_cycle/window_cycle_controller_unittest.cc
@@ -2589,6 +2589,58 @@ EXPECT_TRUE(wm::IsActiveWindow(win0.get())); } +// Regression test to make sure there is no crash if a desk is added while the +// window cycle ui is visible. Regression test for https://crbug.com/1216238. +TEST_F(ModeSelectionWindowCycleControllerTest, NoCrashAfterAddingDesk) { + WindowCycleController* cycle_controller = + Shell::Get()->window_cycle_controller(); + + // Create enough windows so that cycling will result in the WindowCycleView + // being layouted. + const size_t num_windows = 10; + std::vector<std::unique_ptr<aura::Window>> windows(num_windows); + for (size_t i = 0; i < num_windows; ++i) + windows[i] = CreateAppWindow(gfx::Rect(200, 200)); + + auto* desks_controller = DesksController::Get(); + ASSERT_EQ(1u, desks_controller->desks().size()); + + // Start window cycle, the desk mode switcher UI should not be shown. + cycle_controller->HandleCycleWindow( + WindowCycleController::WindowCyclingDirection::kForward); + ASSERT_TRUE(GetWindowCycleTabSliderButtons().empty()); + ASSERT_FALSE(GetWindowCycleNoRecentItemsLabel()); + + // Create a new desk while cycling, which should stop cycling. + desks_controller->NewDesk(DesksCreationRemovalSource::kButton); + ASSERT_EQ(2u, desks_controller->desks().size()); + EXPECT_FALSE(cycle_controller->IsCycling()); + + // Cycling forward should trigger a relayout, which should not crash. + cycle_controller->HandleCycleWindow( + WindowCycleController::WindowCyclingDirection::kForward); + EXPECT_FALSE(GetWindowCycleTabSliderButtons().empty()); + EXPECT_TRUE(GetWindowCycleNoRecentItemsLabel()); +} + +// Tests that destroying all windows while cycling does not cause a crash. +TEST_F(ModeSelectionWindowCycleControllerTest, WindowDestructionWhileCycling) { + WindowCycleController* cycle_controller = + Shell::Get()->window_cycle_controller(); + + auto win1 = CreateAppWindow(gfx::Rect(200, 200)); + auto win2 = CreateAppWindow(gfx::Rect(200, 200)); + + // Start window cycle, the desk mode switcher UI should not be shown. + cycle_controller->HandleCycleWindow( + WindowCycleController::WindowCyclingDirection::kForward); + ASSERT_TRUE(GetWindowCycleTabSliderButtons().empty()); + ASSERT_FALSE(GetWindowCycleNoRecentItemsLabel()); + + win1.reset(); + win2.reset(); +} + // Tests that ChromeVox alerts correctly when the current desk has no window // during alt-tab mode switching via both keyboard navigation and button click. TEST_F(ModeSelectionWindowCycleControllerTest, ChromeVoxNoWindow) {
diff --git a/ash/wm/window_cycle/window_cycle_list.cc b/ash/wm/window_cycle/window_cycle_list.cc index 3bea636d..136c7edc 100644 --- a/ash/wm/window_cycle/window_cycle_list.cc +++ b/ash/wm/window_cycle/window_cycle_list.cc
@@ -442,8 +442,11 @@ ->window_cycle_controller() ->IsInteractiveAltTabModeAllowed(); - if (is_interactive_alt_tab_mode_allowed) + if (is_interactive_alt_tab_mode_allowed) { + DCHECK(no_recent_items_label_); no_recent_items_label_->SetVisible(no_windows); + } + if (no_windows) return; @@ -493,9 +496,8 @@ // |horizontal_distance_dragged_|. horizontal_distance_dragged_ = 0.f; - if (GetWidget()) { + if (GetWidget()) Layout(); - } } void SetTargetWindow(aura::Window* target) { @@ -605,6 +607,7 @@ if (Shell::Get() ->window_cycle_controller() ->IsInteractiveAltTabModeAllowed()) { + DCHECK(tab_slider_container_); // |mirror_container_| can have window list with width smaller the tab // slider's width. The padding should be 64px from the tab slider. const int min_width = @@ -643,6 +646,7 @@ views::View::ConvertRectToTarget(target_view, mirror_container_, &target_bounds); } else { + DCHECK(no_recent_items_label_); target_bounds = gfx::RectF(no_recent_items_label_->bounds()); } @@ -682,6 +686,8 @@ // Layout a tab slider if Bento is enabled. if (is_interactive_alt_tab_mode_allowed) { + DCHECK(tab_slider_container_); + DCHECK(no_recent_items_label_); // Layout the tab slider. const gfx::Size tab_slider_size = tab_slider_container_->GetPreferredSize(); @@ -767,12 +773,17 @@ } const views::View::Views& GetTabSliderButtonsForTesting() const { + if (!tab_slider_container_) { + static const views::View::Views empty; + return empty; + } return tab_slider_container_->GetTabSliderButtonsForTesting(); } const views::Label* GetNoRecentItemsLabelForTesting() const { return no_recent_items_label_; } + const aura::Window* GetTargetWindowForTesting() const { return target_window_; } @@ -804,14 +815,9 @@ // label when there is no window to be shown. gfx::Rect GetContentContainerBounds() const { const bool empty_mirror_container = mirror_container_->children().empty(); - // Check that mirror container can only be empty when alt-tab mode is - // enabled. - DCHECK(!empty_mirror_container || Shell::Get() - ->window_cycle_controller() - ->IsInteractiveAltTabModeAllowed()); - return empty_mirror_container - ? gfx::Rect(no_recent_items_label_->GetPreferredSize()) - : gfx::Rect(mirror_container_->GetPreferredSize()); + if (empty_mirror_container && no_recent_items_label_) + return gfx::Rect(no_recent_items_label_->GetPreferredSize()); + return gfx::Rect(mirror_container_->GetPreferredSize()); } aura::Window* const root_window_;
diff --git a/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java b/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java index 2510693..b3c9c67 100644 --- a/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java +++ b/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java
@@ -305,7 +305,6 @@ TypeName nativeInterfaceType = TypeName.get(nativeInterface.asType()); TypeSpec.Builder builder = TypeSpec.classBuilder(name) .addSuperinterface(nativeInterfaceType) - .addModifiers(Modifier.FINAL) .addAnnotation(createAnnotationWithValue(Generated.class, JniProcessor.class.getCanonicalName())); if (isPublic) {
diff --git a/base/metrics/persistent_histogram_storage_unittest.cc b/base/metrics/persistent_histogram_storage_unittest.cc index adbcdfc..59a1910 100644 --- a/base/metrics/persistent_histogram_storage_unittest.cc +++ b/base/metrics/persistent_histogram_storage_unittest.cc
@@ -10,6 +10,7 @@ #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/persistent_histogram_allocator.h" #include "base/time/time.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" @@ -69,6 +70,9 @@ // destruction of the PersistentHistogramStorage instance. EXPECT_TRUE(DirectoryExists(test_storage_dir())); EXPECT_FALSE(IsDirectoryEmpty(test_storage_dir())); + + // Clean up for subsequent tests. + GlobalHistogramAllocator::ReleaseForTesting(); } #endif // !defined(OS_NACL)
diff --git a/base/test/run_all_unittests.cc b/base/test/run_all_unittests.cc index 3ab55cf..152cf9bd 100644 --- a/base/test/run_all_unittests.cc +++ b/base/test/run_all_unittests.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/bind.h" +#include "base/metrics/persistent_histogram_allocator.h" #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #include "base/time/time.h" @@ -25,6 +26,14 @@ } }; +class HistogramAllocatorCheck : public testing::EmptyTestEventListener { + public: + void OnTestEnd(const testing::TestInfo& test) override { + // Verify that the histogram allocator was released by the test. + CHECK(!GlobalHistogramAllocator::Get()); + } +}; + class TimerCheck : public testing::EmptyTestEventListener { public: void OnTestEnd(const testing::TestInfo& test_info) override { @@ -46,6 +55,7 @@ testing::TestEventListeners& listeners = testing::UnitTest::GetInstance()->listeners(); listeners.Append(new ComLeakCheck); + listeners.Append(new HistogramAllocatorCheck); listeners.Append(new TimerCheck); #endif // defined(OS_WIN) }
diff --git a/build/android/gyp/compile_java.py b/build/android/gyp/compile_java.py index e9e8071..0aafee1 100755 --- a/build/android/gyp/compile_java.py +++ b/build/android/gyp/compile_java.py
@@ -357,7 +357,7 @@ logging.info('Completed jar file: %s', jar_path) -def _OnStaleMd5(options, javac_cmd, javac_args, java_files): +def _OnStaleMd5(changes, options, javac_cmd, javac_args, java_files): logging.info('Starting _OnStaleMd5') if options.enable_kythe_annotations: # Kythe requires those env variables to be set and compile_java.py does the @@ -372,30 +372,73 @@ _JAVAC_EXTRACTOR, ] try: - _RunCompiler(options, javac_extractor_cmd + javac_args, java_files, - options.classpath, options.jar_path + '.javac_extractor', - save_outputs=False), + # _RunCompiler()'s partial javac implementation does not support + # generating outputs in $KYTHE_OUTPUT_DIRECTORY. + _RunCompiler(changes, + options, + javac_extractor_cmd + javac_args, + java_files, + options.jar_path + '.javac_extractor', + enable_partial_javac=False) except build_utils.CalledProcessError as e: # Having no index for particular target is better than failing entire # codesearch. Log and error and move on. logging.error('Could not generate kzip: %s', e) + intermediates_out_dir = None + jar_info_path = None + if not options.enable_errorprone: + # Delete any stale files in the generated directory. The purpose of + # options.generated_dir is for codesearch. + shutil.rmtree(options.generated_dir, True) + intermediates_out_dir = options.generated_dir + + jar_info_path = options.jar_path + '.info' + # Compiles with Error Prone take twice as long to run as pure javac. Thus GN # rules run both in parallel, with Error Prone only used for checks. - _RunCompiler(options, + _RunCompiler(changes, + options, javac_cmd + javac_args, java_files, - options.classpath, options.jar_path, - save_outputs=not options.enable_errorprone) + jar_info_path=jar_info_path, + intermediates_out_dir=intermediates_out_dir, + enable_partial_javac=True) logging.info('Completed all steps in _OnStaleMd5') -def _RunCompiler(options, javac_cmd, java_files, classpath, jar_path, - save_outputs=True): +def _RunCompiler(changes, + options, + javac_cmd, + java_files, + jar_path, + jar_info_path=None, + intermediates_out_dir=None, + enable_partial_javac=False): + """Runs java compiler. + + Args: + changes: md5_check.Changes object. + options: Object with command line flags. + javac_cmd: Command to execute. + java_files: List of java files passed from command line. + jar_path: Path of output jar file. + jar_info_path: Path of the .info file to generate. + If None, .info file will not be generated. + intermediates_out_dir: Directory for saving intermediate outputs. + If None a temporary directory is used. + enable_partial_javac: Enables compiling only Java files which have changed + in the special case that no method signatures have changed. This is + useful for large GN targets. + Not supported if compiling generates outputs other than |jar_path| and + |jar_info_path|. + """ logging.info('Starting _RunCompiler') java_files = java_files.copy() + java_srcjars = options.java_srcjars + save_info_file = jar_info_path is not None # Use jar_path's directory to ensure paths are relative (needed for goma). temp_dir = jar_path + '.staging' @@ -406,24 +449,43 @@ service_provider_configuration = os.path.join( temp_dir, 'service_provider_configuration') - if save_outputs: - input_srcjars_dir = os.path.join(options.generated_dir, 'input_srcjars') - # Delete any stale files in the generated directory. The purpose of - # options.generated_dir is for codesearch. - shutil.rmtree(options.generated_dir, True) + if java_files: + os.makedirs(classes_dir) + + if enable_partial_javac: + all_changed_paths_are_java = all( + [p.endswith(".java") for p in changes.IterChangedPaths()]) + if (all_changed_paths_are_java and not changes.HasStringChanges() + and os.path.exists(jar_path) + and (jar_info_path is None or os.path.exists(jar_info_path))): + # Header jar corresponding to |java_files| did not change. + # As a build speed optimization (crbug.com/1170778), re-compile only + # java files which have changed. Re-use old jar .info file. + java_files = list(changes.IterChangedPaths()) + java_srcjars = None + + # Reuse old .info file. + save_info_file = False + + build_utils.ExtractAll(jar_path, classes_dir) + + if save_info_file: info_file_context = _InfoFileContext(options.chromium_code, options.jar_info_exclude_globs) - else: - input_srcjars_dir = os.path.join(temp_dir, 'input_srcjars') - if options.java_srcjars: + if intermediates_out_dir is None: + input_srcjars_dir = os.path.join(temp_dir, 'input_srcjars') + else: + input_srcjars_dir = os.path.join(intermediates_out_dir, 'input_srcjars') + + if java_srcjars: logging.info('Extracting srcjars to %s', input_srcjars_dir) build_utils.MakeDirectory(input_srcjars_dir) for srcjar in options.java_srcjars: extracted_files = build_utils.ExtractAll( srcjar, no_clobber=True, path=input_srcjars_dir, pattern='*.java') java_files.extend(extracted_files) - if save_outputs: + if save_info_file: info_file_context.AddSrcJarSources(srcjar, extracted_files, input_srcjars_dir) logging.info('Done extracting srcjars') @@ -438,18 +500,17 @@ pattern='META-INF/services/*') logging.info('Done extracting service provider configs') - if save_outputs and java_files: + if save_info_file and java_files: info_file_context.SubmitFiles(java_files) if java_files: # Don't include the output directory in the initial set of args since it # being in a temp dir makes it unstable (breaks md5 stamping). cmd = list(javac_cmd) - os.makedirs(classes_dir) cmd += ['-d', classes_dir] - if classpath: - cmd += ['-classpath', ':'.join(classpath)] + if options.classpath: + cmd += ['-classpath', ':'.join(options.classpath)] # Pass source paths as response files to avoid extremely long command # lines that are tedius to debug. @@ -471,13 +532,11 @@ end = time.time() - start logging.info('Java compilation took %ss', end) - if save_outputs: - _CreateJarFile(jar_path, service_provider_configuration, - options.additional_jar_files, classes_dir) + _CreateJarFile(jar_path, service_provider_configuration, + options.additional_jar_files, classes_dir) - info_file_context.Commit(jar_path + '.info') - else: - build_utils.Touch(jar_path) + if save_info_file: + info_file_context.Commit(jar_info_path) logging.info('Completed all steps in _RunCompiler') finally: @@ -693,15 +752,15 @@ options.warnings_as_errors, options.jar_info_exclude_globs ] - # Keep md5_check since we plan to use its changes feature to implement a build - # speed improvement for non-signature compiles: https://crbug.com/1170778 - md5_check.CallAndWriteDepfileIfStale( - lambda: _OnStaleMd5(options, javac_cmd, javac_args, java_files), - options, - depfile_deps=depfile_deps, - input_paths=input_paths, - input_strings=input_strings, - output_paths=output_paths) + # Use md5_check for |pass_changes| feature. + md5_check.CallAndWriteDepfileIfStale(lambda changes: _OnStaleMd5( + changes, options, javac_cmd, javac_args, java_files), + options, + depfile_deps=depfile_deps, + input_paths=input_paths, + input_strings=input_strings, + output_paths=output_paths, + pass_changes=True) if __name__ == '__main__':
diff --git a/build/android/gyp/nocompile_test.py b/build/android/gyp/nocompile_test.py index d56b046..f02a2ad 100755 --- a/build/android/gyp/nocompile_test.py +++ b/build/android/gyp/nocompile_test.py
@@ -18,6 +18,9 @@ # Relative to _CHROMIUM_SRC _GN_SRC_REL_PATH = os.path.join('third_party', 'depot_tools', 'gn') +# Regex for determining whether compile failed because 'gn gen' needs to be run. +_GN_GEN_REGEX = re.compile(r'ninja: (error|fatal):') + def _raise_command_exception(args, returncode, output): """Raises an exception whose message describes a command failure. @@ -98,10 +101,13 @@ if regex.find('\n') >= 0: return re.search(regex, failure_message) - for line in failure_message.split('\n')[:5]: + return _search_regex_in_list(failure_message.split('\n')[:5], regex) + + +def _search_regex_in_list(value, regex): + for line in value: if re.search(regex, line): return True - return False @@ -138,14 +144,15 @@ _copy_and_append_gn_args(options.gn_args_path, out_gn_args_path, extra_gn_args) - # As all of the test targets are declared in the same BUILD.gn file, it does - # not matter which test target is used as the root target. + # Extract directory from test target. As all of the test targets are declared + # in the same BUILD.gn file, it does not matter which test target is used. + target0_dir = test_configs[0]['target'].rsplit(':', 1)[0] gn_args = [ - _GN_SRC_REL_PATH, '--root-target=' + test_configs[0]['target'], 'gen', + _GN_SRC_REL_PATH, '--root-target=' + target0_dir, 'gen', os.path.relpath(options.out_dir, _CHROMIUM_SRC) ] - _run_command(gn_args, cwd=_CHROMIUM_SRC) + ran_gn_gen = False error_messages = [] for config in test_configs: # Strip leading '//' @@ -157,6 +164,16 @@ # "Compile successful." is not a compiler log message. test_output = _run_command_get_output(ninja_args, '""\nCompile successful.') + # 'gn gen' takes > 1s to run. Only run 'gn gen' if it is needed for compile. + if _search_regex_in_list(test_output.split('\n'), _GN_GEN_REGEX): + assert not ran_gn_gen + ran_gn_gen = True + _run_command(gn_args, cwd=_CHROMIUM_SRC) + + # Redo compile. + test_output = _run_command_get_output(ninja_args, + '""\nCompile successful.') + if not _find_regex_in_test_failure_output(test_output, expect_regex): error_message = '//{} failed.\nExpected compile output pattern:\n'\ '{}\nActual compile output:\n{}'.format(
diff --git a/build/android/gyp/prepare_resources.py b/build/android/gyp/prepare_resources.py index 93fe9f91..ba75afa 100755 --- a/build/android/gyp/prepare_resources.py +++ b/build/android/gyp/prepare_resources.py
@@ -39,6 +39,12 @@ 'in the generated R.txt when generating R.java.') parser.add_argument( + '--allow-missing-resources', + action='store_true', + help='Do not fail if some resources exist in the res/ dir but are not ' + 'listed in the sources.') + + parser.add_argument( '--resource-zip-out', help='Path to a zip archive containing all resources from ' '--resource-dirs, merged into a single directory tree.') @@ -130,7 +136,7 @@ def _OnStaleMd5(options): with resource_utils.BuildContext() as build: - if options.sources: + if options.sources and not options.allow_missing_resources: _CheckAllFilesListed(options.sources, options.resource_dirs) if options.r_text_in: r_txt_path = options.r_text_in
diff --git a/build/android/test/BUILD.gn b/build/android/test/BUILD.gn index 4ad4b492..d395aee 100644 --- a/build/android/test/BUILD.gn +++ b/build/android/test/BUILD.gn
@@ -6,18 +6,22 @@ import("nocompile_gn/nocompile_sources.gni") if (enable_java_templates) { - android_nocompile_test_suite("android_lint_test") { - # Depend on lint and compile_java Python scripts so that the action is re-run whenever the - # scripts are modified. - pydeps = [ - "//build/android/gyp/compile_java.pydeps", - "//build/android/gyp/lint.pydeps", - ] + group("android_nocompile_tests") { + testonly = true - sources = [ rebase_path( - missing_symbol_generated_importer_template_nocompile_source, - "", - "nocompile_gn") ] + # No-compile tests use an output directory dedicated to no-compile tests. + # All test suites use targets in nocompile_gn/BUILD.gn in order to share the + # same target output directory and avoid running 'gn gen' for each + # android_nocompile_test_suite(). + deps = [ + ":android_lint_tests", + ":android_lookup_dep_tests", + ] + } + + android_nocompile_test_suite("android_lint_tests") { + # Depend on lint script so that the action is re-run whenever the script is modified. + pydeps = [ "//build/android/gyp/lint.pydeps" ] tests = [ { @@ -34,6 +38,19 @@ rebase_path(new_api_lint_test_nocompile_sources, "", "nocompile_gn") expected_compile_output_regex = "Error:.*NewApi" }, + ] + } + + android_nocompile_test_suite("android_lookup_dep_tests") { + # Depend on compile_java Python scripts so that the action is re-run whenever the script is modified. + pydeps = [ "//build/android/gyp/compile_java.pydeps" ] + + sources = [ rebase_path( + missing_symbol_generated_importer_template_nocompile_source, + "", + "nocompile_gn") ] + + tests = [ { target = "nocompile_gn:import_child_missing_symbol_test_java" nocompile_sources =
diff --git a/build/config/android/android_nocompile.gni b/build/config/android/android_nocompile.gni index 09e2e33e..9e25b39 100644 --- a/build/config/android/android_nocompile.gni +++ b/build/config/android/android_nocompile.gni
@@ -38,6 +38,7 @@ _tests = invoker.tests _test0 = _tests[0] _test0_dir = get_label_info(_test0["target"], "dir") + _test0_target_out_dir = get_label_info(_test0["target"], "target_out_dir") foreach(_test_config, _tests) { assert( _test0_dir == get_label_info(_test_config["target"], "dir"), @@ -84,13 +85,18 @@ _config_path = "$target_gen_dir/${target_name}.nocompile_config" write_file(_config_path, _json_test_configs, "json") + # Compute output directory for no-compile tests based on the directory containing test + # targets instead of based on the test suite target name. This avoids calling 'gn gen' for each + # android_nocompile_test_suite() for test suites whose tests are declared in the same BUILD.gn + # file. + _out_dir = "${_test0_target_out_dir}/nocompile_out" + _stamp_path = "${target_gen_dir}/${target_name}.stamp" args = [ "--gn-args-path", "args.gn", "--out-dir", - rebase_path("${target_out_dir}/${target_name}/nocompile_out", - root_build_dir), + rebase_path(_out_dir, root_build_dir), "--test-configs-path", rebase_path(_config_path, root_build_dir), "--stamp",
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index df55535..472a6f6 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -2163,6 +2163,10 @@ if (defined(invoker.strip_drawables) && invoker.strip_drawables) { args += [ "--strip-drawables" ] } + if (defined(invoker.allow_missing_resources) && + invoker.allow_missing_resources) { + args += [ "--allow-missing-resources" ] + } } }
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index d33240d..d61fa88 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -954,6 +954,8 @@ # merged into apks that directly or indirectly depend on this target. # android_manifest_dep: Target that generates AndroidManifest (if applicable) # custom_package: java package for generated .java files. + # allow_missing_resources: Do not fail if a resource exists in a directory + # but is not listed in sources. # shared_resources: If true make a resource package that can be loaded by a # different application at runtime to access the package's resources. # resource_overlay: Whether the resources in 'sources' should override @@ -1060,6 +1062,7 @@ forward_variables_from(invoker, [ "strip_drawables", + "allow_missing_resources", "visibility", ]) deps = _deps
diff --git a/build/config/chromeos/rules.gni b/build/config/chromeos/rules.gni index 0ccbcb2..04ad162b 100644 --- a/build/config/chromeos/rules.gni +++ b/build/config/chromeos/rules.gni
@@ -366,7 +366,7 @@ # The following expression filters out all non-critical tests. See the link # below for more details: # https://chromium.googlesource.com/chromiumos/platform/tast/+/main/docs/test_attributes.md - tast_attr_expr = "\"group:mainline\" && \"dep:chrome\"" + tast_attr_expr = "\"group:mainline\" && \"dep:chrome\" && !\"dep:lacros\"" if (defined(enable_tast_informational_tests) && enable_tast_informational_tests) {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index ac380b3..d17342d 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -5.20210609.3.1 +5.20210613.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index ac380b3..d17342d 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -5.20210609.3.1 +5.20210613.3.1
diff --git a/build/util/BUILD.gn b/build/util/BUILD.gn index 2ba66a4..91d768a 100644 --- a/build/util/BUILD.gn +++ b/build/util/BUILD.gn
@@ -4,27 +4,19 @@ import("//build/util/lastchange.gni") -action("webkit_version") { - script = "version.py" +action("chromium_git_revision") { + script = "lastchange.py" - template_file = "webkit_version.h.in" - inputs = [ - lastchange_file, - template_file, - ] - - output_file = "$target_gen_dir/webkit_version.h" + output_file = "$target_gen_dir/chromium_git_revision.h" outputs = [ output_file ] args = [ - # LASTCHANGE contains "<build hash>-<ref>". The user agent only wants the - # "<build hash>" bit, so chop off everything after it. - "-e", - "LASTCHANGE=LASTCHANGE[:LASTCHANGE.find('-')]", - "-f", - rebase_path(lastchange_file, root_build_dir), - rebase_path(template_file, root_build_dir), + "--header", rebase_path(output_file, root_build_dir), + "--revision-id-only", + "--revision-id-prefix", + "@", + "-m CHROMIUM_GIT_REVISION", ] }
diff --git a/build/util/lastchange.py b/build/util/lastchange.py index 874870ad..669fcee 100755 --- a/build/util/lastchange.py +++ b/build/util/lastchange.py
@@ -234,6 +234,9 @@ help=("Output the revision as a VCS revision ID only (in " "Git, a 40-character commit hash, excluding the " "Cr-Commit-Position).")) + parser.add_argument("--revision-id-prefix", + metavar="PREFIX", + help=("Adds a string prefix to the VCS revision ID.")) parser.add_argument("--print-only", action="store_true", help=("Just print the revision string. Overrides any " "file-output-related options.")) @@ -294,6 +297,9 @@ if args.revision_id_only: revision_string = version_info.revision_id + if args.revision_id_prefix: + revision_string = args.revision_id_prefix + revision_string + if args.print_only: print(revision_string) else:
diff --git a/build/util/webkit_version.h.in b/build/util/webkit_version.h.in deleted file mode 100644 index 41960e7..0000000 --- a/build/util/webkit_version.h.in +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source is governed by a BSD-style license that can be -// found in the LICENSE file. - -// webkit_version.h is generated from webkit_version.h.in. Edit the source! - -#define WEBKIT_VERSION_MAJOR 537 -#define WEBKIT_VERSION_MINOR 36 -#define WEBKIT_SVN_REVISION "@@LASTCHANGE@"
diff --git a/buildtools/reclient_cfgs/win-cross-experiments/rewrapper_windows.cfg b/buildtools/reclient_cfgs/win-cross-experiments/rewrapper_windows.cfg index 6d6a955..aa639377 100644 --- a/buildtools/reclient_cfgs/win-cross-experiments/rewrapper_windows.cfg +++ b/buildtools/reclient_cfgs/win-cross-experiments/rewrapper_windows.cfg
@@ -1,5 +1,5 @@ -# llvmorg-13-init-12491-g055770d5-1 -platform=container-image=docker://gcr.io/goma-foundry-experiments/re-client/chromium-win-cross@sha256:3c55b933f7a30921697dd4d9337ac388aa86f7bbbec6f1d0b46f2652b47f0e3d,OSFamily=Linux +# llvmorg-13-init-12576-g643b6407-1 +platform=container-image=docker://gcr.io/goma-foundry-experiments/re-client/chromium-win-cross@sha256:49865ac8a5052081ea38b764645b54ee9bf1707f70cd58fb8b526aaea8fb238a,OSFamily=Linux server_address=pipe://reproxy.pipe labels=type=compile,compiler=clang-cl,lang=cpp exec_strategy=remote_local_fallback
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index 2f6f6f8..03cb730 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc
@@ -349,9 +349,13 @@ // Rounded corner clipping, bounds clipping and mask clipping can result in // new areas of subtrees being exposed on a bounds change. Ensure the damaged - // areas are updated. + // areas are updated. Also, if the layer subtree (rooted at this layer) is + // marked as capturable (via a valid SubtreeCaptureId), then the property tree + // needs rebuild so that |EffectNode::subtree_size| is updated with the new + // size of this layer. if (!layer_tree_host_->IsUsingLayerLists()) { - if (masks_to_bounds() || mask_layer() || HasRoundedCorner()) { + if (subtree_capture_id().is_valid() || masks_to_bounds() || mask_layer() || + HasRoundedCorner()) { SetSubtreePropertyChanged(); SetPropertyTreesNeedRebuild(); }
diff --git a/chrome/VERSION b/chrome/VERSION index 54b25a5..7c4ee589 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=93 MINOR=0 -BUILD=4540 +BUILD=4543 PATCH=0
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index fc27ae9..2635d93 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -205,6 +205,7 @@ "junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotificationTest.java", "junit/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapterTest.java", "junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java", + "junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java", "junit/src/org/chromium/chrome/browser/share/ShareRegistrationCoordinatorTest.java", "junit/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandlerTest.java", "junit/src/org/chromium/chrome/browser/signin/SigninBridgeTest.java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected index db9645c0..76277822 100644 --- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -824,6 +824,13 @@ android:name="com.google.android.apps.chrome.webapps.WebappManager" android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity"> </activity-alias> # DIFF-ANCHOR: 8e23336d + <activity-alias # DIFF-ANCHOR: da85c28e + android:name="org.chromium.android_webview.SafeModeState" + android:enabled="false" + android:process=":webview_apk" + android:targetActivity="org.chromium.android_webview.devui.MainActivity" + android:visibleToInstantApps="true"> + </activity-alias> # DIFF-ANCHOR: da85c28e <activity-alias # DIFF-ANCHOR: b7cc06e9 android:name="org.chromium.android_webview.devui.DeveloperModeState" android:enabled="false" @@ -899,6 +906,13 @@ android:process=":webview_service" android:visibleToInstantApps="true"> </provider> # DIFF-ANCHOR: bfe37944 + <provider # DIFF-ANCHOR: ecfff997 + android:name="org.chromium.android_webview.services.SafeModeContentProvider" + android:authorities="$PACKAGE.SafeModeContentProvider" + android:exported="true" + android:process=":webview_service" + android:visibleToInstantApps="true"> + </provider> # DIFF-ANCHOR: ecfff997 <provider # DIFF-ANCHOR: c2150e02 android:name="org.chromium.chrome.browser.attribution_reporting.AttributionReportingProvider" android:authorities="$PACKAGE.AttributionReporting" @@ -1140,6 +1154,11 @@ android:process=":webview_service" android:visibleToInstantApps="true"> </service> # DIFF-ANCHOR: eecf2fee + <service # DIFF-ANCHOR: 47046f1b + android:name="org.chromium.android_webview.services.SafeModeService" + android:exported="true" + android:process=":webview_service"> + </service> # DIFF-ANCHOR: 47046f1b <service # DIFF-ANCHOR: dc926e35 android:name="org.chromium.android_webview.services.VariationsSeedServer" android:exported="true"
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index c4e9a0d..0c8f209f 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -280,14 +280,27 @@ mIsInitPending = false; if (mTasksSurface != null) { - mTasksSurface.initialize(); + mTasksSurface.initialize(shouldRefreshMVTilesOnInitialize()); } } + private boolean shouldRefreshMVTilesOnInitialize() { + // Only refreshes MV tiles when the Start surface homepage is showing or if the Tab switcher + // has a Home button. + @StartSurfaceState + int state = mStartSurfaceMediator.getStartSurfaceState(); + return state == StartSurfaceState.SHOWN_HOMEPAGE + || state == StartSurfaceState.SHOWING_HOMEPAGE + || state == StartSurfaceState.SHOWING_START + || state == StartSurfaceState.SHOWING_PREVIOUS + || StartSurfaceConfiguration.HOME_BUTTON_ON_GRID_TAB_SWITCHER.getValue(); + } + @Override public void destroy() { if (mTasksSurface != null) { mTasksSurface.removeFakeSearchBoxShrinkAnimation(); + mTasksSurface.onHide(); } if (mOffsetChangedListenerToGenerateScrollEvents != null) { removeHeaderOffsetChangeListener(mOffsetChangedListenerToGenerateScrollEvents); @@ -296,6 +309,13 @@ } @Override + public void onHide() { + if (mTasksSurface != null) { + mTasksSurface.onHide(); + } + } + + @Override public void addHeaderOffsetChangeListener( AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) { // TODO (crbug.com/1113852): Add a header offset change listener for incognito homepage. @@ -376,7 +396,7 @@ mIsSecondaryTaskInitPending = false; mSecondaryTasksSurface.onFinishNativeInitialization( mActivity, mOmniboxStubSupplier.get()); - mSecondaryTasksSurface.initialize(); + mSecondaryTasksSurface.initialize(false); } } @@ -450,6 +470,11 @@ : SurfaceMode.NO_START_SURFACE; } + @VisibleForTesting + public boolean isMVTilesCleanedUpForTesting() { + return mTasksSurface.isMVTilesCleanedUp(); + } + private void createAndSetStartSurface(boolean excludeMVTiles) { ArrayList<PropertyKey> allProperties = new ArrayList<>(Arrays.asList(TasksSurfaceProperties.ALL_KEYS)); @@ -504,7 +529,7 @@ if (mIsInitializedWithNative) { mSecondaryTasksSurface.onFinishNativeInitialization( mActivity, mOmniboxStubSupplier.get()); - mSecondaryTasksSurface.initialize(); + mSecondaryTasksSurface.initialize(false); } else { mIsSecondaryTaskInitPending = true; }
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java index 09415eb6..ec6631d 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
@@ -274,6 +274,7 @@ @Override public void doneHiding() { super.doneHiding(); + mStartSurface.onHide(); RecordUserAction.record("MobileExitStackView"); }
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index b79b8ee..e7aeec7 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -497,7 +497,6 @@ } } - @VisibleForTesting @Override @StartSurfaceState public int getStartSurfaceState() {
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index 96e1939a..27c6b2e 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -153,7 +153,7 @@ @Rule public ChromeRenderTestRule mRenderTestRule = - ChromeRenderTestRule.Builder.withPublicCorpus().build(); + ChromeRenderTestRule.Builder.withPublicCorpus().setRevision(1).build(); @Rule public ErrorCollector collector = new ErrorCollector();
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index 625772d6..67dc9b8 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -474,11 +474,6 @@ @CommandLineFlags.Add({BASE_PARAMS + "/single"}) public void testShow_SingleAsHomepage_FromResumeShowStart() throws Exception { // clang-format on - Assume.assumeFalse("https://crbug.com/1196473", - isInstantReturn() - && (Build.VERSION.SDK_INT == Build.VERSION_CODES.N - || Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1)); - if (!mImmediateReturn) { StartSurfaceTestUtils.pressHomePageButton(mActivityTestRule.getActivity()); } @@ -1797,6 +1792,34 @@ mLayoutChangedCallbackHelper, mCurrentlyActiveLayout); } + @Test + @MediumTest + @Feature({"StartSurface"}) + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS + "/single"}) + public void testCleanUpMVTilesAfterHiding() { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + if (!mImmediateReturn) StartSurfaceTestUtils.pressHomePageButton(cta); + StartSurfaceTestUtils.waitForOverviewVisible( + mLayoutChangedCallbackHelper, mCurrentlyActiveLayout); + StartSurfaceTestUtils.waitForTabModel(cta); + StartSurfaceCoordinator startSurfaceCoordinator = + StartSurfaceTestUtils.getStartSurfaceFromUIThread(cta); + TestThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertFalse(startSurfaceCoordinator.isMVTilesCleanedUpForTesting()); + }); + + StartSurfaceTestUtils.launchFirstMVTile(cta, /* currentTabCount = */ 1); + Assert.assertEquals("The launched tab should have the launch type FROM_START_SURFACE", + TabLaunchType.FROM_START_SURFACE, + cta.getActivityTabProvider().get().getLaunchType()); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertTrue(startSurfaceCoordinator.isMVTilesCleanedUpForTesting()); + }); + } + private void backActionDeleteBlankTabForOmniboxFocusedOnNewTabSingleSurface( Runnable backAction) { if (!mImmediateReturn) {
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java index daba099..118e5418 100644 --- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java +++ b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -28,6 +28,11 @@ void destroy(); /** + * Called when the Start surface is hidden. + */ + void onHide(); + + /** * An observer that is notified when the start surface internal state, excluding * the states notified in {@link OverviewModeObserver}, is changed. *
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java index e26e4fc..2cf9a6ab 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/MostVisitedListCoordinator.java
@@ -7,6 +7,8 @@ import android.app.Activity; import android.view.ViewGroup; +import androidx.annotation.VisibleForTesting; + import org.chromium.base.Log; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.native_page.ContextMenuManager; @@ -65,6 +67,7 @@ private final Supplier<Tab> mParentTabSupplier; private final SnackbarManager mSnackbarManager; private TileGroup mTileGroup; + private TileGroup.Delegate mTileGroupDelegate; private TileRenderer mRenderer; private SuggestionsUiDelegate mSuggestionsUiDelegate; private ContextMenuManager mContextMenuManager; @@ -130,10 +133,10 @@ mOfflinePageBridge = SuggestionsDependencyFactory.getInstance().getOfflinePageBridge(profile); } - TileGroupDelegateImpl tileGroupDelegate = new TileGroupDelegateImpl( + mTileGroupDelegate = new TileGroupDelegateImpl( mActivity, profile, mNavigationDelegate, mSnackbarManager); mTileGroup = new TileGroup(mRenderer, mSuggestionsUiDelegate, mContextMenuManager, - tileGroupDelegate, this, mOfflinePageBridge); + mTileGroupDelegate, this, mOfflinePageBridge); mTileGroup.startObserving(MAX_RESULTS); mInitializationComplete = true; } @@ -256,6 +259,21 @@ } } + /** Called when the TasksSurface is hidden. */ + public void destroyMVTiles() { + if (mTileGroupDelegate != null) { + mTileGroupDelegate.destroy(); + mTileGroupDelegate = null; + } + mTileGroup = null; + mMvTilesLayout.removeAllViews(); + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + boolean isMVTilesCleanedUp() { + return mTileGroupDelegate == null && mTileGroup == null; + } + /** Suggestions UI Delegate for constructing the TileGroup. */ private static class MostVisitedSuggestionsUiDelegate extends SuggestionsUiDelegateImpl { public MostVisitedSuggestionsUiDelegate(SuggestionsNavigationDelegate navigationDelegate,
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java index fe69dff..818e817 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java
@@ -9,6 +9,7 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.google.android.material.appbar.AppBarLayout; @@ -28,8 +29,9 @@ * It should be called before showing. * It should not be called in the critical startup process since it will do expensive work. * It might be called many times. + * @param refreshMVTiles Whether to refresh MV Tiles if exists. */ - void initialize(); + void initialize(boolean refreshMVTiles); /** * Set the listener to get the {@link Layout#onTabSelecting} event from the Grid Tab Switcher. @@ -100,4 +102,13 @@ * Remove the omnibox shrink animation. */ void removeFakeSearchBoxShrinkAnimation(); + + /** + * Called when the Tasks surface is hidden. + */ + void onHide(); + + @VisibleForTesting + /** Returns whether the cleanup of MV Tiles has been done after hiding the Start surface. */ + boolean isMVTilesCleanedUp(); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java index 630df90..071e1fbc4 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java
@@ -12,6 +12,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.google.android.material.appbar.AppBarLayout; @@ -59,6 +60,9 @@ private final TabContentManager mTabContentManager; private final ModalDialogManager mModalDialogManager; + /** This flag should be reset once {@link mMostVisitedList#destroyMVTiles()} is called. */ + private boolean mIsMVTilesInitialized; + /** {@see TabManagementDelegate#createTasksSurface} */ public TasksSurfaceCoordinator(@NonNull Activity activity, @NonNull ScrimCoordinator scrimCoordinator, @NonNull PropertyModel propertyModel, @@ -129,12 +133,17 @@ } } - /** TasksSurface implementation. */ + /** + * TasksSurface implementation. + * @param refreshMVTiles Whether to refresh MV Tiles if exists. + */ @Override - public void initialize() { + public void initialize(boolean refreshMVTiles) { assert LibraryLoader.getInstance().isInitialized(); - - if (mMostVisitedList != null) mMostVisitedList.initWithNative(); + if (!mIsMVTilesInitialized && mMostVisitedList != null && refreshMVTiles) { + mMostVisitedList.initWithNative(); + mIsMVTilesInitialized = true; + } mMediator.initialize(); } @@ -211,4 +220,19 @@ public void removeFakeSearchBoxShrinkAnimation() { mView.removeFakeSearchBoxShrinkAnimation(); } + + @Override + public void onHide() { + if (mMostVisitedList != null) { + mMostVisitedList.destroyMVTiles(); + mIsMVTilesInitialized = false; + } + } + + @VisibleForTesting + @Override + public boolean isMVTilesCleanedUp() { + assert mMostVisitedList != null; + return mMostVisitedList.isMVTilesCleanedUp(); + } }
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb index c8b9f67a..367e506d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb
@@ -38,7 +38,7 @@ <translation id="492284538114688557">Бағасы арзандады</translation> <translation id="5007392906805964215">Көру</translation> <translation id="5073204694187207510">Толық экрандық торды жасыру</translation> -<translation id="5082793167783849073">Топ жасай отырып, беттерді жылдам салыстырыңыз. Бастау үшін сілтемені басып ұстап тұрыңыз.</translation> +<translation id="5082793167783849073">Топ жасай отырып, беттерді жылдам салыстырыңыз. Бастау үшін сілтемені басып тұрыңыз.</translation> <translation id="5490235265819901748">Қойындылар тобы жайылды</translation> <translation id="5533021382642990449">Кейінірек көрсету</translation> <translation id="5556417849629758491">Дүкен туралы ақпаратты көру (опция экранның жоғарғы жағында орналасқан)</translation> @@ -52,7 +52,7 @@ <translation id="6510648526783655549">Қойындылар жолағын жабу</translation> <translation id="6562820390860419811">Қойындыны солға жылжыту</translation> <translation id="6615455863669487791">Маған көрсету</translation> -<translation id="6840760312327750441">Қойындыларды топтау үшін қойындыны түртіп, ұстап тұрыңыз. Одан кейін басқа қойындыға сүйреңіз.</translation> +<translation id="6840760312327750441">Қойындыларды топтау үшін қойындыны басып тұрыңыз. Одан кейін басқа қойындыға сүйреңіз.</translation> <translation id="6856809498882026482">Бірнеше нұсқа таңдау режимін жасыру</translation> <translation id="7151209024774799310">Қойындыларды топтан өшіру</translation> <translation id="7204204600596740190">Бірнеше нұсқа таңдау режимі</translation>
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java index 25baaef..08860ba 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStream.java
@@ -28,6 +28,7 @@ import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.Supplier; import org.chromium.base.task.PostTask; +import org.chromium.chrome.browser.feed.FeedReliabilityLoggingBridge; import org.chromium.chrome.browser.feed.FeedServiceBridge; import org.chromium.chrome.browser.feed.FeedSurfaceMediator; import org.chromium.chrome.browser.feed.NtpListContentManager; @@ -419,6 +420,7 @@ private ScrollReporter mScrollReporter; private final Map<String, Object> mHandlersMap; private RotationObserver mRotationObserver; + private FeedReliabilityLoggingBridge mReliabilityLoggingBridge; // Things valid only when bound. private @Nullable RecyclerView mRecyclerView; @@ -452,7 +454,9 @@ boolean isInterestFeed) { this.mActivity = activity; mIsInterestFeed = isInterestFeed; - mNativeFeedStream = FeedStreamJni.get().init(this, isInterestFeed); + mReliabilityLoggingBridge = new FeedReliabilityLoggingBridge(); + mNativeFeedStream = FeedStreamJni.get().init( + this, isInterestFeed, mReliabilityLoggingBridge.getNativePtr()); mBottomSheetController = bottomSheetController; mNavigationDelegate = nativePageNavigationDelegate; @@ -502,6 +506,7 @@ if (mUnreadContentObserver != null) { mUnreadContentObserver.destroy(); } + mReliabilityLoggingBridge.destroy(); } @Override @@ -515,6 +520,7 @@ FeedSurfaceMediator.ScrollState savedInstanceState, SurfaceScope surfaceScope, HybridListRenderer renderer, FeedLaunchReliabilityLogger launchReliabilityLogger) { launchReliabilityLogger.logFeedReloading(System.nanoTime()); + mReliabilityLoggingBridge.setLogger(launchReliabilityLogger); mScrollStateToRestore = savedInstanceState; manager.setHandlers(mHandlersMap); @@ -1032,7 +1038,7 @@ @NativeMethods @VisibleForTesting public interface Natives { - long init(FeedStream caller, boolean isForYou); + long init(FeedStream caller, boolean isForYou, long nativeFeedReliabilityLoggingBridge); boolean isActivityLoggingEnabled(long nativeFeedStream, FeedStream caller); void reportFeedViewed(long nativeFeedStream, FeedStream caller); void reportSliceViewed(long nativeFeedStream, FeedStream caller, String sliceId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java index 8d68a5a..944d741 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java
@@ -20,8 +20,8 @@ import org.chromium.base.LocaleUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.accessibility.FontSizePrefs; -import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.browsing_data.BrowsingDataBridge; import org.chromium.chrome.browser.browsing_data.BrowsingDataType; import org.chromium.chrome.browser.browsing_data.TimePeriod; @@ -40,6 +40,9 @@ import org.chromium.components.browser_ui.share.ShareImageFileUtils; import org.chromium.components.user_prefs.UserPrefs; +import java.util.HashMap; +import java.util.Map; + /** * Tracks the foreground session state for the Chrome activities. */ @@ -49,6 +52,8 @@ private static ChromeActivitySessionTracker sInstance; private final PowerBroadcastReceiver mPowerBroadcastReceiver = new PowerBroadcastReceiver(); + private final Map<Activity, Supplier<TabModelSelector>> mTabModelSelectorSuppliers = + new HashMap<>(); // Used to trigger variation changes (such as seed fetches) upon application foregrounding. private VariationsSession mVariationsSession; @@ -75,6 +80,24 @@ } /** + * Register a supplier which returns the total tab count for the given application. + * @param activity The activity associated with the given tab count supplier. + * @param tabCountSupplier Supplies the current tab count for the given activity. + */ + public void registerTabModelSelectorSupplier( + Activity activity, Supplier<TabModelSelector> tabCountSupplier) { + mTabModelSelectorSuppliers.put(activity, tabCountSupplier); + } + + /** + * Unregisters the supplier associated with the given activity. + * @param activity Tha activity to unregister. + */ + public void unregisterTabModelSelectorSupplier(Activity activity) { + mTabModelSelectorSuppliers.remove(activity); + } + + /** * Asynchronously returns the value of the "restrict" URL param that the variations service * should use for variation seed requests. * @param callback Callback that will be called with the param value when available. @@ -165,14 +188,10 @@ int totalTabCount = 0; for (Activity activity : ApplicationStatus.getRunningActivities()) { - if (activity instanceof ChromeActivity - && ((ChromeActivity) activity).areTabModelsInitialized()) { - TabModelSelector tabModelSelector = - ((ChromeActivity) activity).getTabModelSelector(); - if (tabModelSelector != null) { - totalTabCount += tabModelSelector.getTotalTabCount(); - } - } + Supplier<TabModelSelector> tabModelSelectorSupplier = + mTabModelSelectorSuppliers.get(activity); + if (tabModelSelectorSupplier == null || !tabModelSelectorSupplier.hasValue()) continue; + totalTabCount += tabModelSelectorSupplier.get().getTotalTabCount(); } RecordHistogram.recordCountHistogram( "Tab.TotalTabCount.BeforeLeavingApp", totalTabCount);
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 b0e718a..89da7c8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -83,6 +83,7 @@ import org.chromium.chrome.browser.dependency_injection.ChromeActivityComponent; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.dom_distiller.ReaderModeManager; +import org.chromium.chrome.browser.download.DownloadNotificationService; import org.chromium.chrome.browser.download.DownloadOpenSource; import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; @@ -807,6 +808,7 @@ // background. if (!IncognitoUtils.doIncognitoTabsExist()) { IncognitoNotificationManager.dismissIncognitoNotification(); + DownloadNotificationService.getInstance().cancelOffTheRecordDownloads(); } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/DEPS index 5a18b9e..6c175c4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/DEPS +++ b/chrome/android/java/src/org/chromium/chrome/browser/DEPS
@@ -14,9 +14,6 @@ specific_include_rules = { # Exceptions to the ChromeActivity dependency restriction. These will all eventually be removed # new code should rely on acceptable dependency aquisition patterns. - "ChromeActivitySessionTracker\.java": [ - "+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java", - ], "ChromePowerModeVoter\.java": [ "+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java", ],
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHelper.java index 5055b9ed..98f9a574 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHelper.java
@@ -15,6 +15,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.components.signin.AccountManagerFacadeProvider; +import org.chromium.components.signin.AccountUtils; import java.io.File; import java.util.List; @@ -41,9 +42,9 @@ static void sendEmail( String email, String subject, String body, String chooserTitle, String fileToAttach) { if (TextUtils.isEmpty(email)) { - List<Account> accounts = - AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(); - if (accounts != null && accounts.size() == 1 + List<Account> accounts = AccountUtils.getAccountsIfFulfilledOrEmpty( + AccountManagerFacadeProvider.getInstance().getAccounts()); + if (accounts.size() == 1 && Patterns.EMAIL_ADDRESS.matcher(accounts.get(0).name).matches()) { email = accounts.get(0).name; }
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 fd98c72f..0108f1ff 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
@@ -7,7 +7,6 @@ import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; -import android.app.DirectAction; import android.app.Fragment; import android.app.SearchManager; import android.app.assist.AssistContent; @@ -603,7 +602,10 @@ protected void initializeStartupMetrics() { // Initialize the activity session tracker as early as possible so that // it can start background tasks. - ChromeActivitySessionTracker.getInstance(); + ChromeActivitySessionTracker chromeActivitySessionTracker = + ChromeActivitySessionTracker.getInstance(); + chromeActivitySessionTracker.registerTabModelSelectorSupplier( + this, mTabModelSelectorSupplier); mActivityTabStartupMetricsTracker = new ActivityTabStartupMetricsTracker(mTabModelSelectorSupplier); } @@ -1389,7 +1391,9 @@ } } - @Override + // TODO(crbug.com/973781): Once Chromium is built against Android Q SDK, replace + // @SuppressWarnings with @Override + @SuppressWarnings("MissingOverride") @TargetApi(29) @UsedByReflection("Called from Android Q") public void onPerformDirectAction(String actionId, Bundle arguments, @@ -1397,11 +1401,13 @@ mRootUiCoordinator.onPerformDirectAction(actionId, arguments, cancellationSignal, callback); } - @Override + // TODO(crbug.com/973781): Once Chromium is built against Android Q SDK: + // - replace @SuppressWarnings with @Override + // - replace Consumer with Consumer<List<DirectAction>> + @SuppressWarnings("MissingOverride") @TargetApi(29) @UsedByReflection("Called from Android Q") - public void onGetDirectActions( - CancellationSignal cancellationSignal, Consumer<List<DirectAction>> callback) { + public void onGetDirectActions(CancellationSignal cancellationSignal, Consumer callback) { mRootUiCoordinator.onGetDirectActions(cancellationSignal, callback); } @@ -1511,6 +1517,7 @@ } mActivityTabProvider.destroy(); + ChromeActivitySessionTracker.getInstance().unregisterTabModelSelectorSupplier(this); mComponent = null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index ea02c60..f003799 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -916,7 +916,7 @@ if (LensUtils.enableImageChip() || LensUtils.enableTranslateChip()) { // TODO(crbug.com/783819): Migrate LensChipDelegate to GURL. return new LensChipDelegate(mParams.getPageUrl().getSpec(), mParams.getTitleText(), - mParams.getSrcUrl().getSpec(), getPageTitle(), isIncognito(), + mParams.getSrcUrl().getSpec(), getPageTitle(), isIncognito(), isTabletScreen(), mItemDelegate.getWebContents(), mNativeDelegate, getOnChipClickedCallback(), getOnChipShownCallback()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java index 5833b2c..909944c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java
@@ -24,15 +24,16 @@ private Callback<Integer> mOnChipShownCallback; public LensChipDelegate(String pageUrl, String titleOrAltText, String srcUrl, String pageTitle, - boolean isIncognito, WebContents webContents, ContextMenuNativeDelegate nativeDelegate, - Callback<Integer> onChipClickedCallback, Callback<Integer> onChipShownCallback) { + boolean isIncognito, boolean isTablet, WebContents webContents, + ContextMenuNativeDelegate nativeDelegate, Callback<Integer> onChipClickedCallback, + Callback<Integer> onChipShownCallback) { mLensController = LensController.getInstance(); mIsChipSupported = mLensController.isQueryEnabled(); if (!mIsChipSupported) { return; } mLensQueryParams = - new LensQueryParams.Builder(LensEntryPoint.CONTEXT_MENU_CHIP, isIncognito) + new LensQueryParams.Builder(LensEntryPoint.CONTEXT_MENU_CHIP, isIncognito, isTablet) .withPageUrl(pageUrl) .withImageTitleOrAltText(titleOrAltText) .withSrcUrl(srcUrl)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionCoordinator.java index 24d9d31b..b59ef9b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionCoordinator.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.directactions; import android.annotation.TargetApi; -import android.app.DirectAction; import android.os.Bundle; import androidx.annotation.NonNull; @@ -48,8 +47,8 @@ } /** Sends a list of supported actions to the given callback. */ - public final void onGetDirectActions(Consumer<List<DirectAction>> callback) { - DirectActionReporter reporter = createReporterDirectAction(callback); + public final void onGetDirectActions(Consumer<List> callback) { + DirectActionReporter reporter = createReporter(callback); if (mIsEnabled.get()) { for (DirectActionHandler handler : mHandlers) { handler.reportAvailableDirectActions(reporter); @@ -80,20 +79,7 @@ } /** Subclasses should provide an implementation of a DirectActionReporter. */ - protected DirectActionReporter createReporter(Consumer<List> callback) { - return null; - } - - /** - * This casting chain is necessary to migrate to the native DirectAction object and not break - * clank downstream. - */ - protected DirectActionReporter createReporterDirectAction( - Consumer<List<DirectAction>> callback) { - Consumer castOne = (Consumer) callback; - Consumer<List> castTwo = (Consumer<List>) castOne; - return createReporter(castTwo); - } + protected abstract DirectActionReporter createReporter(Consumer<List> callback); /** Initializes the coordinator. */ void init(@NonNull Supplier<Boolean> isEnabled) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionInitializer.java index 69258f70..527ad7f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionInitializer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/directactions/DirectActionInitializer.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.directactions; import android.annotation.TargetApi; -import android.app.DirectAction; import android.content.Context; import android.os.Bundle; import android.os.CancellationSignal; @@ -117,8 +116,7 @@ * @param cancellationSignal Signal used to cancel a direct action from the caller. * @param callback Callback to run when the action is done. */ - public void onGetDirectActions( - CancellationSignal cancellationSignal, Consumer<List<DirectAction>> callback) { + public void onGetDirectActions(CancellationSignal cancellationSignal, Consumer<List> callback) { if (mCoordinator == null || !mDirectActionsRegistered) { callback.accept(Collections.emptyList()); return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index 76e1218..e9403348 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -712,7 +712,7 @@ } } - private void cancelOffTheRecordDownloads() { + public void cancelOffTheRecordDownloads() { boolean cancelActualDownload = BrowserStartupController.getInstance().isFullBrowserStarted() && Profile.getLastUsedRegularProfile().hasPrimaryOTRProfile();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index eb44139..5c6261e6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -20,7 +20,6 @@ import org.chromium.base.ActivityState; import org.chromium.base.Callback; -import org.chromium.base.Log; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.R; @@ -642,9 +641,6 @@ * autocomplete suggestions should be updated. */ public void onTextChanged(String textWithoutAutocomplete, String textWithAutocomplete) { - // crbug.com/764749 - Log.w(TAG, "onTextChangedForAutocomplete"); - if (mShouldPreventOmniboxAutocomplete) return; mIgnoreOmniboxItemSelection = true; @@ -659,11 +655,11 @@ stopAutocomplete(false); if (TextUtils.isEmpty(textWithoutAutocomplete)) { - // crbug.com/764749 - Log.w(TAG, "onTextChangedForAutocomplete: url is empty"); hideSuggestions(); postAutocompleteRequest(this::startZeroSuggest, SCHEDULE_FOR_IMMEDIATE_EXECUTION); } else { + // There may be no tabs when searching form omnibox in overview mode. In that case, + // LocationBarDataProvider.getCurrentUrl() returns NTP url. if (mDataProvider.hasTab() || mDataProvider.isInOverviewAndShowingOmnibox()) { boolean preventAutocomplete = !mUrlBarEditingTextProvider.shouldAutocomplete(); int cursorPosition = mUrlBarEditingTextProvider.getSelectionStart() @@ -680,11 +676,6 @@ mAutocomplete.start(currentUrl, pageClassification, textWithoutAutocomplete, cursorPosition, preventAutocomplete, null, isQueryStartedFromTiles); }, OMNIBOX_SUGGESTION_START_DELAY_MS); - } else { - // There may be no tabs when searching form omnibox in overview mode. In that case, - // LocationBarDataProvider.getCurrentUrl() returns NTP url. - // crbug.com/764749 - Log.w(TAG, "onTextChangedForAutocomplete: no tab"); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerTextNewLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerTextNewLayout.java index 7316c89c..9d97005 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerTextNewLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerTextNewLayout.java
@@ -10,7 +10,6 @@ import androidx.annotation.StyleRes; -import org.chromium.base.Log; import org.chromium.chrome.R; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.components.omnibox.AnswerTextType; @@ -168,7 +167,7 @@ break; default: - Log.w(TAG, "Unknown answer type: " + type); + assert false : "Unknown answer type: " + type; res = R.style.TextAppearance_TextLarge_Primary; break; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java index b154e02..f3dff21 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java
@@ -13,7 +13,6 @@ import org.chromium.base.BaseSwitches; import org.chromium.base.CommandLine; -import org.chromium.base.Log; import org.chromium.base.SysUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.supplier.Supplier; @@ -129,7 +128,7 @@ try { color = Color.parseColor(colorSpec); } catch (IllegalArgumentException e) { - Log.i(TAG, "Failed to parse dominant color: " + colorSpec); + // The supplied color information could not be parsed. return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java index 48d3357..82e916e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java
@@ -6,13 +6,14 @@ import android.content.Context; import android.content.res.Configuration; +import android.graphics.drawable.Drawable; import android.view.View.OnClickListener; -import androidx.appcompat.content.res.AppCompatResources; - +import org.chromium.base.FeatureList; import org.chromium.base.ObserverList; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.ObservableSupplier; +import org.chromium.base.supplier.Supplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -25,6 +26,12 @@ import org.chromium.chrome.browser.toolbar.ButtonDataProvider; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures.AdaptiveToolbarButtonVariant; +import org.chromium.chrome.browser.user_education.IPHCommandBuilder; +import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightParams; +import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightShape; +import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver; import org.chromium.ui.modelutil.PropertyModel; @@ -46,6 +53,8 @@ private final ObservableSupplier<ShareDelegate> mShareDelegateSupplier; + private final Supplier<Tracker> mTrackerSupplier; + private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; // The activity tab provider. @@ -66,8 +75,10 @@ /** * Creates ShareButtonController object. * @param context The Context for retrieving resources, etc. + * @param buttonDrawable Drawable for the new tab button. * @param tabProvider The {@link ActivityTabProvider} used for accessing the tab. * @param shareDelegateSupplier The supplier to get a handle on the share delegate. + * @param trackerSupplier Supplier for the current profile tracker. * @param shareUtils The share utility functions used by this class. * @param activityLifecycleDispatcher Dispatcher for activity lifecycle events, e.g. * configuration changes. @@ -76,8 +87,10 @@ * does not actually handle sharing, but can provide supplemental * functionality when the share button is pressed. */ - public ShareButtonController(Context context, ActivityTabProvider tabProvider, - ObservableSupplier<ShareDelegate> shareDelegateSupplier, ShareUtils shareUtils, + public ShareButtonController(Context context, Drawable buttonDrawable, + ActivityTabProvider tabProvider, + ObservableSupplier<ShareDelegate> shareDelegateSupplier, + Supplier<Tracker> trackerSupplier, ShareUtils shareUtils, ActivityLifecycleDispatcher activityLifecycleDispatcher, ModalDialogManager modalDialogManager, Runnable onShareRunnable) { mContext = context; @@ -88,6 +101,7 @@ mShareUtils = shareUtils; mShareDelegateSupplier = shareDelegateSupplier; + mTrackerSupplier = trackerSupplier; mOnClickListener = ((view) -> { ShareDelegate shareDelegate = mShareDelegateSupplier.get(); assert shareDelegate @@ -99,6 +113,11 @@ if (onShareRunnable != null) onShareRunnable.run(); RecordUserAction.record("MobileTopToolbarShareButton"); shareDelegate.share(tab, /*shareDirectly=*/false, ShareOrigin.TOP_TOOLBAR); + + if (mTrackerSupplier.hasValue()) { + mTrackerSupplier.get().notifyEvent( + EventConstants.ADAPTIVE_TOOLBAR_CUSTOMIZATION_SHARE_OPENED); + } }); mModalDialogManagerObserver = new ModalDialogManagerObserver() { @@ -117,9 +136,8 @@ mModalDialogManager = modalDialogManager; mModalDialogManager.addObserver(mModalDialogManagerObserver); - mButtonData = new ButtonDataImpl(/*canShow=*/false, - AppCompatResources.getDrawable(mContext, R.drawable.ic_toolbar_share_offset_24dp), - mOnClickListener, R.string.share, /*supportsTinting=*/true, + mButtonData = new ButtonDataImpl(/*canShow=*/false, buttonDrawable, mOnClickListener, + R.string.share, /*supportsTinting=*/true, /*iphCommandBuilder=*/null, /*isEnabled=*/true, AdaptiveToolbarButtonVariant.SHARE); mScreenWidthDp = mContext.getResources().getConfiguration().screenWidthDp; @@ -161,6 +179,7 @@ @Override public ButtonData get(Tab tab) { updateButtonVisibility(tab); + maybeSetIphCommandBuilder(tab); return mButtonData; } @@ -200,4 +219,33 @@ observer.buttonDataChanged(hint); } } + + /** + * Since Features are not yet initialized when ButtonData is created, use the + * fist available opportunity to create and set IPHCommandBuilder. Once set it's + * never updated. + */ + private void maybeSetIphCommandBuilder(Tab tab) { + if (mButtonData.getButtonSpec().getIPHCommandBuilder() != null || tab == null + || !FeatureList.isInitialized() + || !AdaptiveToolbarFeatures.isCustomizationEnabled()) { + return; + } + + HighlightParams params = new HighlightParams(HighlightShape.CIRCLE); + params.setBoundsRespectPadding(true); + IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(tab.getContext().getResources(), + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_SHARE_FEATURE, + /* stringId = */ R.string.adaptive_toolbar_button_share_iph, + /* accessibilityStringId = */ R.string.adaptive_toolbar_button_share_iph) + .setHighlightParams(params); + + ButtonData.ButtonSpec currentSpec = mButtonData.getButtonSpec(); + ButtonData.ButtonSpec newSpec = new ButtonData.ButtonSpec(currentSpec.getDrawable(), + currentSpec.getOnClickListener(), currentSpec.getContentDescriptionResId(), + currentSpec.getSupportsTinting(), iphCommandBuilder, + currentSpec.getButtonVariant()); + + mButtonData.setButtonSpec(newSpec); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java index ed509729..08a3d4c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
@@ -175,7 +175,7 @@ configureSignOutSwitch(); configureChildAccountPreferences(); - AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(this::updateAccountsList); + AccountManagerFacadeProvider.getInstance().getAccounts().then(this::updateAccountsList); } private boolean canAddAccounts() { @@ -368,7 +368,7 @@ // ProfileDataCache.Observer implementation: @Override public void onProfileDataUpdated(String accountEmail) { - AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(this::updateAccountsList); + AccountManagerFacadeProvider.getInstance().getAccounts().then(this::updateAccountsList); } // SignOutDialogListener implementation:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index e5f933f..a610339 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.ui; -import android.app.DirectAction; import android.app.Fragment; import android.os.Build; import android.os.Bundle; @@ -102,6 +101,7 @@ import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController; import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.messages.DismissReason; import org.chromium.components.messages.ManagedMessageDispatcher; import org.chromium.components.messages.MessageContainer; @@ -628,8 +628,7 @@ * @param cancellationSignal Signal used to cancel a direct action from the caller. * @param callback Callback to run when the action is done. */ - public void onGetDirectActions( - CancellationSignal cancellationSignal, Consumer<List<DirectAction>> callback) { + public void onGetDirectActions(CancellationSignal cancellationSignal, Consumer<List> callback) { if (mDirectActionInitializer == null) return; mDirectActionInitializer.onGetDirectActions(cancellationSignal, callback); } @@ -675,10 +674,17 @@ mOmniboxFocusStateSupplier.set(hasFocus); }; + Supplier<Tracker> trackerSupplier = () -> { + Profile profile = mProfileSupplier.get(); + return profile == null ? null : TrackerFactory.getTrackerForProfile(profile); + }; + mIdentityDiscController = new IdentityDiscController( mActivity, mActivity.getLifecycleDispatcher(), mProfileSupplier); ShareButtonController shareButtonController = new ShareButtonController(mActivity, - mActivityTabProvider, mShareDelegateSupplier, new ShareUtils(), + AppCompatResources.getDrawable( + mActivity, R.drawable.ic_toolbar_share_offset_24dp), + mActivityTabProvider, mShareDelegateSupplier, trackerSupplier, new ShareUtils(), mActivity.getLifecycleDispatcher(), mActivity.getModalDialogManager(), () -> mToolbarManager.setUrlBarFocus(false, OmniboxFocusReason.UNFOCUS)); VoiceToolbarButtonController.VoiceSearchDelegate voiceSearchDelegate = @@ -703,15 +709,17 @@ VoiceToolbarButtonController voiceToolbarButtonController = new VoiceToolbarButtonController(mActivity, AppCompatResources.getDrawable(mActivity, R.drawable.btn_mic), - mActivityTabProvider, mActivity.getLifecycleDispatcher(), - mActivity.getModalDialogManager(), voiceSearchDelegate); + mActivityTabProvider, trackerSupplier, + mActivity.getLifecycleDispatcher(), mActivity.getModalDialogManager(), + voiceSearchDelegate); // TODO(shaktisahu): Add async mechanism for handling segmentation. if (AdaptiveToolbarFeatures.isSingleVariantModeEnabled()) { OptionalNewTabButtonController newTabButtonController = new OptionalNewTabButtonController(mActivity, + AppCompatResources.getDrawable(mActivity, R.drawable.new_tab_icon), mActivity.getLifecycleDispatcher(), - mActivity.getTabCreatorManagerSupplier(), - mTabModelSelectorSupplier); + mActivity.getTabCreatorManagerSupplier(), mTabModelSelectorSupplier, + trackerSupplier); AdaptiveToolbarButtonController adaptiveToolbarButtonController = new AdaptiveToolbarButtonController(); adaptiveToolbarButtonController.addButtonVariant(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java index 563e762c1..3ada08f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/login/ChromeHttpAuthHandlerTest.java
@@ -20,6 +20,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -102,6 +103,7 @@ @Test @MediumTest @Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) + @DisabledTest(message = "https://crbug.com/1218039") public void authDialogSuppressedOnBackgroundTab() throws Exception { Tab firstTab = mActivityTestRule.getActivity().getActivityTab(); ChromeTabUtils.newTabFromMenu(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java index 7b4e00c..b3419e63 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/PictureInPictureControllerTest.java
@@ -231,18 +231,9 @@ } private void testExitOn(Runnable runnable) throws Throwable { - // Before entering fullscreen, get the (nonzero) size of the video element. - final int inline_width = DOMUtils.getNodeBounds(getWebContents(), VIDEO_ID).width(); enterFullscreen(); triggerAutoPiPAndWait(); - // Wait for layout to finish. We assume this means that the video element is now smaller - // than its initial size. If we don't wait, and if the runnable beats layout, then the - // result is hard to predict. Since we primarily care about exiting pixture-in-picture from - // steady-state, make sure we're in steady-state. - CriteriaHelper.pollInstrumentationThread( - () -> DOMUtils.getNodeBounds(getWebContents(), VIDEO_ID).width() < inline_width); - runnable.run(); CriteriaHelper.pollUiThread(() -> !mActivity.getLastPictureInPictureModeForTesting());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java index aa268dd..efabfae 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -118,7 +118,7 @@ @Rule public RenderTestRule mRenderTestRule = - RenderTestRule.Builder.withPublicCorpus().setRevision(5).build(); + RenderTestRule.Builder.withPublicCorpus().setRevision(6).build(); private boolean mIsSystemLocationSettingEnabled = true;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java index 7b06896..4d97345 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestRetryTest.java
@@ -47,7 +47,8 @@ new PaymentRequestTestRule("payment_request_retry.html", this); @Rule - public RenderTestRule mRenderTestRule = RenderTestRule.Builder.withPublicCorpus().build(); + public RenderTestRule mRenderTestRule = + RenderTestRule.Builder.withPublicCorpus().setRevision(1).build(); @Override public void onMainActivityStarted() throws TimeoutException {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java index 50cadaf2..18cdac89 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java
@@ -152,6 +152,8 @@ private WebFeedBridge.Natives mWebFeedBridgeJniMock; @Mock private FeedSurfaceScopeDependencyProvider.Natives mSurfaceScopeJniMock; + @Mock + private FeedReliabilityLoggingBridge.Natives mFeedReliabilityLoggingBridgeJniMock; // Mocked xSurface setup. @Mock @@ -201,6 +203,8 @@ mocker.mock(FeedServiceBridgeJni.TEST_HOOKS, mFeedServiceBridgeJniMock); mocker.mock(WebFeedBridge.getTestHooksForTesting(), mWebFeedBridgeJniMock); mocker.mock(FeedSurfaceScopeDependencyProviderJni.TEST_HOOKS, mSurfaceScopeJniMock); + mocker.mock(FeedReliabilityLoggingBridge.getTestHooksForTesting(), + mFeedReliabilityLoggingBridgeJniMock); when(mFeedServiceBridgeJniMock.getLoadMoreTriggerLookahead()).thenReturn(5);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedStreamTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedStreamTest.java index 3d76933..027a310c 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedStreamTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedStreamTest.java
@@ -48,6 +48,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.base.test.util.MetricsUtils; +import org.chromium.chrome.browser.feed.FeedReliabilityLoggingBridge; import org.chromium.chrome.browser.feed.FeedServiceBridge; import org.chromium.chrome.browser.feed.NtpListContentManager; import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl; @@ -95,6 +96,8 @@ private FeedStream.Natives mFeedStreamJniMock; @Mock private FeedServiceBridge.Natives mFeedServiceBridgeJniMock; + @Mock + private FeedReliabilityLoggingBridge.Natives mFeedReliabilityLoggingBridgeJniMock; @Mock private SnackbarManager mSnackbarManager; @@ -140,6 +143,8 @@ mocker.mock(FeedStreamJni.TEST_HOOKS, mFeedStreamJniMock); mocker.mock(FeedServiceBridge.getTestHooksForTesting(), mFeedServiceBridgeJniMock); + mocker.mock(FeedReliabilityLoggingBridge.getTestHooksForTesting(), + mFeedReliabilityLoggingBridgeJniMock); Profile.setLastUsedProfileForTesting(mProfileMock); when(mFeedServiceBridgeJniMock.getLoadMoreTriggerLookahead())
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index c321234..8e324fe 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
@@ -58,7 +58,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.build.BuildConfig; -import org.chromium.chrome.browser.download.DownloadUtils; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.gsa.GSAState; import org.chromium.chrome.browser.lens.LensController; @@ -69,7 +68,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinator; import org.chromium.chrome.browser.omnibox.voice.AssistantVoiceSearchService; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; -import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManagerImpl; +import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileJni; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; @@ -97,8 +96,7 @@ @Config(shadows = {LocationBarMediatorTest.ShadowUrlUtilities.class, LocationBarMediatorTest.ShadowGeolocationHeader.class, LocationBarMediatorTest.ObjectAnimatorShadow.class, - LocationBarMediatorTest.GSAStateShadow.class, - LocationBarMediatorTest.DownloadUtilsShadow.class}) + LocationBarMediatorTest.GSAStateShadow.class}) @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ASSISTANT_VOICE_SEARCH) @Features.DisableFeatures(ChromeFeatureList.VOICE_BUTTON_IN_TOP_TOOLBAR) public class LocationBarMediatorTest { @@ -149,14 +147,6 @@ } } - @Implements(DownloadUtils.class) - static class DownloadUtilsShadow { - @Implementation - public static boolean isAllowedToDownloadPage(Tab tab) { - return true; - } - } - private static final String TEST_URL = "http://www.example.org"; private static int sGeoHeaderPrimeCount; @@ -193,7 +183,7 @@ @Mock private StatusCoordinator mStatusCoordinator; @Mock - private PrivacyPreferencesManagerImpl mPrivacyPreferencesManager; + private PrivacyPreferencesManager mPrivacyPreferencesManager; @Mock private OmniboxPrerender.Natives mPrerenderJni; @Mock
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java new file mode 100644 index 0000000..f4004a8 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java
@@ -0,0 +1,133 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.share; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.view.View; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.base.supplier.ObservableSupplier; +import org.chromium.chrome.browser.ActivityTabProvider; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures; +import org.chromium.chrome.browser.user_education.IPHCommandBuilder; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; +import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.chromium.ui.modaldialog.ModalDialogManager; + +/** Unit tests for {@link ShareButtonController}. */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public final class ShareButtonControllerUnitTest { + private static final int WIDTH_DELTA = 50; + + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + + @Mock + private Context mContext; + @Mock + private Resources mResources; + @Mock + private Tab mTab; + @Mock + private Drawable mDrawable; + @Mock + private ActivityTabProvider mTabProvider; + @Mock + private ObservableSupplier<ShareDelegate> mShareDelegateSupplier; + @Mock + private ShareDelegate mShareDelegate; + @Mock + private ShareUtils mShareUtils; + @Mock + private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; + @Mock + private ModalDialogManager mModalDialogManager; + @Mock + private Tracker mTracker; + + private Configuration mConfiguration = new Configuration(); + private ShareButtonController mShareButtonController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + doReturn(mContext).when(mTab).getContext(); + doReturn(mResources).when(mContext).getResources(); + + mConfiguration.screenWidthDp = ShareButtonController.MIN_WIDTH_DP + WIDTH_DELTA; + doReturn(mConfiguration).when(mResources).getConfiguration(); + + doReturn(mTab).when(mTabProvider).get(); + doReturn(mShareDelegate).when(mShareDelegateSupplier).get(); + + AdaptiveToolbarFeatures.clearParsedParamsForTesting(); + + mShareButtonController = + new ShareButtonController(mContext, mDrawable, mTabProvider, mShareDelegateSupplier, + () + -> mTracker, + mShareUtils, mActivityLifecycleDispatcher, mModalDialogManager, () -> {}); + + TrackerFactory.setTrackerForTests(mTracker); + } + + @EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) + @Test + public void testIPHCommandHelper() { + assertNull(mShareButtonController.get(/*tab*/ null).getButtonSpec().getIPHCommandBuilder()); + + // Verify that IPHCommandBuilder is set just once; + IPHCommandBuilder builder = + mShareButtonController.get(mTab).getButtonSpec().getIPHCommandBuilder(); + + assertNotNull(mShareButtonController.get(mTab).getButtonSpec().getIPHCommandBuilder()); + + // Verify that IPHCommandBuilder is same as before, get(Tab) did not create a new one. + assertEquals( + builder, mShareButtonController.get(mTab).getButtonSpec().getIPHCommandBuilder()); + } + + @Test + @EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) + public void testIPHEvent() { + doReturn(true).when(mTracker).shouldTriggerHelpUI( + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_SHARE_FEATURE); + + View view = Mockito.mock(View.class); + mShareButtonController.get(mTab).getButtonSpec().getOnClickListener().onClick(view); + + verify(mTracker, times(1)) + .notifyEvent(EventConstants.ADAPTIVE_TOOLBAR_CUSTOMIZATION_SHARE_OPENED); + } +}
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index 3b0cbf7..c56b4c5 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -139,7 +139,7 @@ <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium பீட்டா</translation> <translation id="5479196819031988440">Chromium OS ஆல் இந்தப் பக்கத்தைத் திறக்க முடியாது.</translation> <translation id="5480860683791598150">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர Chromiumமுக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை</translation> -<translation id="5481338274774984070">இந்தக் கோப்பினைப் பதிவிறக்கவோ திறக்கவோ வேண்டாம் என Chromium பரிந்துரைக்கிறது.</translation> +<translation id="5481338274774984070">இந்த ஃபைலைப் பதிவிறக்கவோ திறக்கவோ வேண்டாம் என Chromium பரிந்துரைக்கிறது.</translation> <translation id="549669000822060376">சமீபத்திய முறைமை புதுப்பிப்புகளை Chromium நிறுவும் வரை காத்திருக்கவும்.</translation> <translation id="5496810170689441661">Chromium கடவுச்சொற்களைத் திருத்த முயல்கிறது. இதை அனுமதிக்க உங்கள் Windows கடவுச்சொல்லை உள்ளிடவும்.</translation> <translation id="5527463683072221100">PDFகளை Chromiumமில் திற</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 0001b7d..afeab10 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388"><ph name="BEGIN_LINK" />Besoek sinkroniseringinstellings<ph name="END_LINK" /> om blaaierdata van al jou toestelle en jou Google-rekening af uit te vee.</translation> <translation id="1175364870820465910">Druk uit …</translation> <translation id="1176471985365269981">Mag nie lêers of vouers op jou toestel wysig nie</translation> -<translation id="1177138678118607465">Google sal dalk jou blaaigeskiedenis gebruik om Search, advertensies en ander Google-dienste te personaliseer. Jy kan dit enige tyd verander by myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Gepasmaak</translation> <translation id="1178581264944972037">Laat wag</translation> <translation id="117916940443676133">Jou sekuriteitsleutel word nie met 'n PIN beskerm nie. Om aanmelddata te bestuur, skep eers 'n PIN.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Begin tans die virtuele masjien</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Kon nie druk nie. Gaan drukker na en probeer weer.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Wagwoordsinkronisering werk nie</translation> <translation id="1607139524282324606">Vee inskrywing uit</translation> <translation id="1607499585984539560">Gebruik word nie met domein geaffilieer nie</translation> <translation id="1608626060424371292">Verwyder hierdie gebruiker</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Maak skakel oop met …</translation> <translation id="2891922230654533301">Gebruik jou toestel om by <ph name="APP_NAME" /> aan te meld?</translation> <translation id="2893168226686371498">Verstekblaaier</translation> +<translation id="2893180576842394309">Google kan jou geskiedenis gebruik om Search en ander Google-dienste te personaliseer</translation> <translation id="2894757982205307093">Nuwe oortjie in groep</translation> <translation id="289695669188700754">Sleutel-ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Hierdie gepasmaakte instelling sal verwyder word wanneer jy al jou Incognito-vensters toemaak</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Bevestig dat dit 'n geldige verskaffer is of probeer later weer</translation> <translation id="3856800405688283469">Kies tydsone</translation> <translation id="3857807444929313943">Lig en raak dan weer</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Sinkronisering is onderbreek</translation> <translation id="3861638017150647085">Gebruikernaam "<ph name="USERNAME" />" is nie beskikbaar nie</translation> <translation id="3861977424605124250">Wys met afskop</translation> <translation id="3862788408946266506">Program met "net_kiosk"-manifeseienskap moet in Chrome-bedryfstelsel se kioskmodus geïnstalleer word</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Moenie my volgende keer herinner nie</translation> <translation id="4881695831933465202">Maak oop</translation> <translation id="4882312758060467256">Het toegang tot hierdie werf</translation> -<translation id="4882831918239250449">Beheer hoe jou blaaigeskiedenis gebruik word om Search, advertensies en meer te personaliseer</translation> <translation id="4882919381756638075">Werwe gebruik gewoonlik jou mikrofoon vir kommunikasiekenmerke soos videoklets</translation> <translation id="4883436287898674711">Alle <ph name="WEBSITE_1" />-werwe</translation> <translation id="48838266408104654">Taakbestuurder</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">Altyd oop met die stelselkyker</translation> <translation id="5794700615121138172">Linux- gedeelde lêers</translation> <translation id="5794786537412027208">Beëindig alle Chrome-programme</translation> -<translation id="5797070761912323120">Google kan jou geskiedenis gebruik om Search, advertensies en ander Google-dienste te personaliseer</translation> <translation id="5798079537501238810">Werwe kan betalinghanteerders installeer</translation> <translation id="579907812742603813">beskermde inhoud</translation> <translation id="579915268381781820">Jou sekuriteitsleutel is verwyder.</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">Mobiele data word tans geaktiveer</translation> <translation id="6209838773933913227">Komponentopdatering</translation> <translation id="6209908325007204267">Jou toestel sluit 'n Chrome Enterprise-opgradering in, maar jou gebruikernaam word nie met 'n ondernemingrekening geassosieer nie. Skep asseblief 'n ondernemingrekening deur g.co/ChromeEnterpriseAccount op 'n sekondêre toestel te besoek.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Sinkronisering werk tans nie</translation> <translation id="6212039847102026977">Wys gevorderde netwerkeienskappe</translation> <translation id="6212168817037875041">Skakel skerm af</translation> <translation id="6212752530110374741">E-posskakel</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090">Agtergrondbladsy: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Oproep vanaf <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Geen HID-toestelle gekry nie</translation> +<translation id="7431991332293347422">Beheer hoe jou blaaigeskiedenis gebruik word om Search en meer te personaliseer</translation> <translation id="7433708794692032816">Sit slimkaart in om aan te hou om jou <ph name="DEVICE_TYPE" /> te gebruik</translation> <translation id="7433957986129316853">Hou dit</translation> <translation id="7434509671034404296">Ontwikkelaar</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 1eecbfd..ed9a3a6 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">ከሁሉም የእርስዎ የተመሳሰሉ መሣሪያዎች እና የእርስዎ የGoogle መለያ ላይ የአሰሳ ውሂብን ለማጽዳት፣ <ph name="BEGIN_LINK" />የአስምር ቅንብሮችን ይጎብኙ<ph name="END_LINK" />።</translation> <translation id="1175364870820465910">&አትም…</translation> <translation id="1176471985365269981">በመሳሪያዎ ላይ ፋይሎችን ውይም አቃፊዎችን ለማርትዕ አልተፈቀደም</translation> -<translation id="1177138678118607465">Google ፍለጋን፣ ማስታወቂያን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ሲባል የእርስዎን የአሰሳ ታሪክ ሊጠቀም ይችል ይሆናል። ይህንን በማናቸውም ጊዜ በmyaccount.google.com/activitycontrols/search ላይ መለወጥ ይችላሉ።</translation> <translation id="1177863135347784049">ብጁ</translation> <translation id="1178581264944972037">ለአፍታ አቁም</translation> <translation id="117916940443676133">የእርስዎ ደህንነት ቁልፍ በፒን ጥበቃ እየተደረገለት አይደለም ያለው። በመለያ መግቢያ ውሂብን ለማስተዳደር፣ በመጀመሪያ ፒን ይፍጠሩ።</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">ምናባዊ ማሽኑን በማስጀመር ላይ</translation> <translation id="1603914832182249871">(ስውር)</translation> <translation id="1604432177629086300">ማተም አልተቻለም። ማተሚያን ይፈትሹ እና እንደገና ይሞክሩ።</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />፦ የይለፍ ቃል ስምረት እየሠራ አይደለም</translation> <translation id="1607139524282324606">ግቤትን አጽዳ</translation> <translation id="1607499585984539560">ተጠቃሚው ከጎራ ጋር አጋር አልሆነም</translation> <translation id="1608626060424371292">ይህን ተጠቃሚ አስወግድ</translation> @@ -1766,6 +1764,7 @@ <translation id="2889064240420137087">አገናኝ ክፈት በ...</translation> <translation id="2891922230654533301">ወደ <ph name="APP_NAME" /> ለመግባት መሣሪያዎን ይጠቀሙበት?</translation> <translation id="2893168226686371498">ነባሪ አሳሽ</translation> +<translation id="2893180576842394309">Google ፍለጋን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ሲል ታሪክዎን ሊጠቀም ይችላል።</translation> <translation id="2894757982205307093">በቡድን ውስጥ አዲስ ትር</translation> <translation id="289695669188700754">ቁልፍ መታወቂያ፦ <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ሁሉንም ማንነት የማያሳውቁ መስኮቶችዎን ሲዘጉ ይህ ብጁ ቅንብር ይወገዳል</translation> @@ -2646,7 +2645,6 @@ <translation id="3856096718352044181">ይህ ልክ የሆነ አገልግሎት አቅራቢ መሆኑን እባክዎ ያረጋግጡ ወይም ቆይተው እንደገና ይሞክሩ</translation> <translation id="3856800405688283469">የሰዓት ሰቅ ይምረጡ</translation> <translation id="3857807444929313943">ያንሱ፣ ከዚያ እንደገና ይንኩ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />፦ ማሳመር ባለበት ቆሟል</translation> <translation id="3861638017150647085">የተጠቃሚ ስም «<ph name="USERNAME" />» አይገኝም</translation> <translation id="3861977424605124250">ጅምር ላይ አሳይ</translation> <translation id="3862788408946266506">የ«kiosk_only» ዝርዝር ሰነድ አይነታ ያለው መተግበሪያ በChrome OS ኪዮስክ ሁኔታ ላይ መጫን አለበት።</translation> @@ -3535,7 +3533,6 @@ <translation id="4881685975363383806">በሚቀጥለው ጊዜ አታስታውሰኝ</translation> <translation id="4881695831933465202">ክፈት</translation> <translation id="4882312758060467256">የዚህ ጣቢያ መዳረሻ አላቸው</translation> -<translation id="4882831918239250449">ፍለጋን፣ ማስታወቂያዎችን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> <translation id="4882919381756638075">ጣቢያዎች አብዛኛው ጊዜ ማይክሮፎንዎን እንደ የቪዲዮ ውይይት ላሉ የመገናኛ ባህሪዎች ይጠቀሙበታል</translation> <translation id="4883436287898674711">ሁሉም የ<ph name="WEBSITE_1" /> ጣቢያዎች</translation> <translation id="48838266408104654">&ተግባር አስተዳዳሪ</translation> @@ -4334,7 +4331,6 @@ <translation id="5794414402486823030">ሁልጊዜ ከስርዓት ተመልካች ጋር ይክፈቱ</translation> <translation id="5794700615121138172">የተጋሩ የLinux አቃፊዎች</translation> <translation id="5794786537412027208">ከሁሉም የChrome መተግበሪያዎች ውጣ</translation> -<translation id="5797070761912323120">Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ የእርስዎን ታሪክ ሊጠቀም ይችላል</translation> <translation id="5798079537501238810">ጣቢያዎች የክፍያ ተቆጣጣሪዎችን መጫን ይችላሉ</translation> <translation id="579907812742603813">ጥበቃ የሚደረግለት ይዘት</translation> <translation id="579915268381781820">የእርስዎ የደህንነት ቁልፍ ተወግዷል።</translation> @@ -4695,7 +4691,6 @@ <translation id="6208521041562685716">የሞባይል ውሂብን በማግበር ላይ</translation> <translation id="6209838773933913227">የክፍለ-አካል ዝማኔ</translation> <translation id="6209908325007204267">የእርስዎ መሣሪያ የChrome Enterprise ያካትታል፣ ነገር ግን የእርስዎ ተጠቃሚ ስም ከድርጅት መለያ ጋር የተጎዳኘ አይደለም። እባክዎ በሁለተኛ መሣሪያ ላይ g.co/ChromeEnterpriseAccountን በመጎብኘት የድርጅት መለያ ይክፈቱ።</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />፦ ስምረት እየሠራ አይደለም</translation> <translation id="6212039847102026977">የላቁ የአውታረ መረብ ባህሪያትን አሳይ</translation> <translation id="6212168817037875041">ማሳያን አጥፋ</translation> <translation id="6212752530110374741">የኢሜይል አገናኝ</translation> @@ -5784,6 +5779,7 @@ <translation id="7427348830195639090">የጀርባው ገጽ፦ <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">ጥሪ ከ<ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">ምንም HID መሣሪያዎች አልተገኙም</translation> +<translation id="7431991332293347422">ፍለጋን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> <translation id="7433708794692032816">የእርስዎን <ph name="DEVICE_TYPE" /> እየተጠቀሙ ለመቀጠል ዘመናዊ ካርድ ያስገቡ</translation> <translation id="7433957986129316853">ይቀጥል</translation> <translation id="7434509671034404296">ገንቢ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 61e9c6c..b8cad52a 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">لمحو بيانات التصفُّح من جميع أجهزتك التي تمت مزامنتها ومن حسابك على Google، يُرجى <ph name="BEGIN_LINK" />الانتقال إلى إعدادات المزامنة<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">ط&باعة...</translation> <translation id="1176471985365269981">المواقع الإلكترونية التي لا يُسمح لها بتعديل الملفات أو المجلدات على جهازك</translation> -<translation id="1177138678118607465">قد تستخدم Google سجلّ التصفح لتخصيص البحث والإعلانات وخدمات Google الأخرى. يمكنك تغيير ذلك في أي وقت على myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">مخصص</translation> <translation id="1178581264944972037">الإيقاف مؤقتًا</translation> <translation id="117916940443676133">مفتاح الأمان غير محمي برقم تعريف شخصي. لإدارة بيانات تسجيل الدخول، عليك أولاً إنشاء رقم تعريف شخصي.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">جارٍ بدء تشغيل الآلة الافتراضية</translation> <translation id="1603914832182249871">(التصفح المتخفي)</translation> <translation id="1604432177629086300">تعذّرت الطباعة. يُرجى التحقق من الطابعة وإعادة المحاولة.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: مزامنة كلمات المرور لا تعمل</translation> <translation id="1607139524282324606">محو الإدخال</translation> <translation id="1607499585984539560">هذا المستخدم ليس تابعًا لنطاقك.</translation> <translation id="1608626060424371292">إزالة هذا المستخدم</translation> @@ -1762,6 +1760,7 @@ <translation id="2889064240420137087">فتح الرابط باستخدام...</translation> <translation id="2891922230654533301">هل تريد استخدام جهازك لتسجيل الدخول إلى <ph name="APP_NAME" />؟</translation> <translation id="2893168226686371498">المتصفح التلقائي</translation> +<translation id="2893180576842394309">قد تستخدم Google سجلّك لتخصيص البحث وخدمات Google الأخرى.</translation> <translation id="2894757982205307093">علامة تبويب جديدة في مجموعة</translation> <translation id="289695669188700754">معرّف المفتاح: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ستتم إزالة هذا الإعداد المخصّص عند إغلاق جميع نوافذ التصفّح المتخفي.</translation> @@ -2642,7 +2641,6 @@ <translation id="3856096718352044181">يُرجى إثبات صلاحية مقدّم الخدمة أو المحاولة مجددًا.</translation> <translation id="3856800405688283469">اختيار منطقة زمنية</translation> <translation id="3857807444929313943">رفع الإصبع، ثم اللمس مرة أخرى</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: تم إيقاف المزامنة مؤقتًا</translation> <translation id="3861638017150647085">اسم المستخدم "<ph name="USERNAME" />" غير متوفر.</translation> <translation id="3861977424605124250">إظهار عند بدء التشغيل</translation> <translation id="3862788408946266506">يجب تثبيت التطبيق الذي يحمل سمة البيان "kiosk_only" في وضع الكشك على نظام تشغيل Chrome.</translation> @@ -3530,7 +3528,6 @@ <translation id="4881685975363383806">عدم تذكيري المرة القادمة</translation> <translation id="4881695831933465202">فتح</translation> <translation id="4882312758060467256">يمكنها الوصول إلى الموقع الإلكتروني هذا</translation> -<translation id="4882831918239250449">التحكُّم في كيفية استخدامنا لسِجل التصفُّح الخاص بك لتخصيص البحث والإعلانات والمزيد</translation> <translation id="4882919381756638075">تستخدم المواقع الإلكترونية عادةً الميكروفون لتتيح ميزات التواصل، مثل محادثة الفيديو.</translation> <translation id="4883436287898674711">جميع مواقع <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&مدير المهام</translation> @@ -4328,7 +4325,6 @@ <translation id="5794414402486823030">افتح دائمًا باستخدام عرض النظام</translation> <translation id="5794700615121138172">مجلدات نظام التشغيل Linux التي تمت مشاركتها</translation> <translation id="5794786537412027208">إنهاء جميع تطبيقات Chrome</translation> -<translation id="5797070761912323120">قد تستخدم Google سجلّك لتخصيص البحث والإعلانات وخدمات Google الأخرى.</translation> <translation id="5798079537501238810">السماح للمواقع الإلكترونية بتثبيت معالجات الدفع</translation> <translation id="579907812742603813">المحتوى المحمي</translation> <translation id="579915268381781820">تمت إزالة مفتاح الأمان.</translation> @@ -4689,7 +4685,6 @@ <translation id="6208521041562685716">جارٍ تفعيل بيانات الجوّال</translation> <translation id="6209838773933913227">جارٍ تعديل المكوِّن</translation> <translation id="6209908325007204267">يتضمّن جهازك "ترقية Chrome Enterprise"، ولكن اسم المستخدم الخاص بك غير مرتبط بحساب مؤسسة. يُرجى إنشاء حساب مؤسسة من خلال الانتقال إلى g.co/ChromeEnterpriseAccount على جهاز ثانوي.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: المزامنة لا تعمل</translation> <translation id="6212039847102026977">عرض خصائص الشبكة المتقدمة</translation> <translation id="6212168817037875041">إيقاف الشاشة</translation> <translation id="6212752530110374741">إرسال الرابط عبر البريد الإلكتروني</translation> @@ -5777,6 +5772,7 @@ <translation id="7427348830195639090">صفحة الخلفية: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">الاتصال من <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">لم يتم العثور على أجهزة HID</translation> +<translation id="7431991332293347422">التحكُّم في كيفية استخدامنا لسِجل التصفُّح لتخصيص البحث والمزيد</translation> <translation id="7433708794692032816">أدخِل بطاقة ذكية للاستمرار في استخدام الجهاز <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">تجاهل</translation> <translation id="7434509671034404296">المطوِّر</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index ceaded8b..9664bd3a 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">আপুনি ছিংক কৰি ৰখা সকলো ডিভাইচ আৰু Google একাউণ্টৰ পৰা ব্ৰাউজিঙৰ ডেটা মচিবলৈ <ph name="BEGIN_LINK" />ছিংক ছেটিংসমূহলৈ যাওক<ph name="END_LINK" />।</translation> <translation id="1175364870820465910">&প্ৰিণ্ট কৰক...</translation> <translation id="1176471985365269981">আপোনাৰ ডিভাইচত ফাইল অথবা ফ’ল্ডাৰ সম্পাদনা কৰাৰ অনুমতি নাই</translation> -<translation id="1177138678118607465">Googleএ সন্ধান, বিজ্ঞাপন আৰু অন্য Google সেৱাসমূহ ব্যক্তিগতকৰণ কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস ব্যৱহাৰ কৰিব পাৰে। আপুনি myaccount.google.com/activitycontrols/searchলৈ গৈ যিকোনো সময়তে ইয়াক সলনি কৰিব পাৰে</translation> <translation id="1177863135347784049">কাষ্টম</translation> <translation id="1178581264944972037">পজ কৰক</translation> <translation id="117916940443676133">আপোনাৰ সুৰক্ষাৰ চাবিটো এটা পিনৰ দ্বাৰা সুৰক্ষিত নহয়। ছাইন ইন ডেটা পৰিচালনা কৰিবলৈ, প্ৰথমে এটা পিন সৃষ্টি কৰক।</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">ভাৰ্ছুৱেল মেচিনটো আৰম্ভ কৰি থকা হৈছে</translation> <translation id="1603914832182249871">(ইনক’গনিট’)</translation> <translation id="1604432177629086300">প্ৰিণ্ট কৰিব পৰা নগ'ল। প্ৰিণ্টাৰটো পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক।</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: পাছৱৰ্ড ছিংক কৰা সুবিধাটোৱে কাম কৰা নাই</translation> <translation id="1607139524282324606">প্ৰৱিষ্টি মচক</translation> <translation id="1607499585984539560">ব্যৱহাৰকাৰী ড’মেইনৰ সভ্য নহয়</translation> <translation id="1608626060424371292">ব্যৱহাৰকাৰীক আঁতৰাওক</translation> @@ -1769,6 +1767,7 @@ <translation id="2889064240420137087">ইয়াৰ এটাৰ জৰিয়তে লিংকটো খোলক...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" />ত ছাইন ইন কৰিবলৈ আপোনাৰ ডিভাইচটো ব্যৱহাৰ কৰিবনে?</translation> <translation id="2893168226686371498">ডিফ’ল্ট ব্ৰাউজাৰ</translation> +<translation id="2893180576842394309">Googleএ Search আৰু অন্য Google সেৱাসমূহ ব্যক্তিগতকৰণ কৰিবলৈ আপোনাৰ ইতিহাস ব্যৱহাৰ কৰিব পাৰে</translation> <translation id="2894757982205307093">গোটটোত নতুন টেব</translation> <translation id="289695669188700754">চাবিৰ আইডি: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">আপুনি আটাইবোৰ ইনক'গনিট' ৱিণ্ড' বন্ধ কৰিলে এইটো কাষ্টম ছেটিং আঁতৰোৱা হ'ব</translation> @@ -2648,7 +2647,6 @@ <translation id="3856096718352044181">অনুগ্ৰহ কৰি এইটো কোনো মান্য প্ৰদানকাৰীৰ বুলি সত্যাপন কৰক অথবা পাছত আকৌ চেষ্টা কৰক</translation> <translation id="3856800405688283469">সময় মণ্ডল বাছনি কৰক</translation> <translation id="3857807444929313943">ওপৰলৈ উঠাওক, তাৰ পিছত পুনৰ স্পৰ্শ কৰক</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: ছিংক পজ হ'ল</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" ব্যৱহাৰকাৰীৰ নামটো উপলব্ধ নহয়</translation> <translation id="3861977424605124250">আৰম্ভ হওঁতে দেখুৱাওক</translation> <translation id="3862788408946266506">’kiosk_only’ মেনিফেষ্ট বৈশিষ্ট থকা এপক Chrome OS কিঅ’স্ক ম’ডতেই ইনষ্টল কৰিব লাগিব</translation> @@ -3536,7 +3534,6 @@ <translation id="4881685975363383806">ইয়াৰ পাছত মোক সোঁৱৰাই নিদিব</translation> <translation id="4881695831933465202">খোলক</translation> <translation id="4882312758060467256">এই ছাইটটো এক্সেছ কৰিব পাৰে</translation> -<translation id="4882831918239250449">Search, বিজ্ঞাপন আৰু অন্য সুবিধাসমূহ ব্যক্তিগতকৰণ কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস কেনেদৰে ব্যৱহাৰ কৰা হয় সেয়া নিয়ন্ত্ৰণ কৰক</translation> <translation id="4882919381756638075">ছাইটসমূহে সচৰাচৰ ভিডিঅ' চাটৰ দৰে সুবিধাসমূহৰ বাবে আপোনাৰ মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰে</translation> <translation id="4883436287898674711">সকলো <ph name="WEBSITE_1" /> ছাইট</translation> <translation id="48838266408104654">&কাৰ্য পৰিচালক</translation> @@ -4333,7 +4330,6 @@ <translation id="5794414402486823030">সদায় ছিষ্টেম ভিউৱাৰৰ জৰিয়তে খোলক</translation> <translation id="5794700615121138172">Linuxৰ শ্বেয়াৰ কৰা ফ’ল্ডাৰসমূহ</translation> <translation id="5794786537412027208">সকলো Chrome এপৰ পৰা বাহিৰ হওঁক</translation> -<translation id="5797070761912323120">Googleএ Search, বিজ্ঞাপন আৰু অন্য Google সেৱা ব্যক্তিকৃত কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস ব্যৱহাৰ কৰিব পাৰে</translation> <translation id="5798079537501238810">ছাইটে পৰিশোধ নিয়ন্ত্ৰক ইনষ্টল কৰিব পাৰে</translation> <translation id="579907812742603813">সুৰক্ষিত সমল</translation> <translation id="579915268381781820">আপোনাৰ সুৰক্ষাৰ চাবিটো আঁতৰোৱা হৈছিল।</translation> @@ -4693,7 +4689,6 @@ <translation id="6208521041562685716">ম’বাইল ডেটা সক্রিয় কৰি থকা হৈছে</translation> <translation id="6209838773933913227">উপাদান আপডে’ট কৰা</translation> <translation id="6209908325007204267">আপোনাৰ ডিভাইচটোত এটা Chrome Enterpriseৰ আপগ্ৰে’ড অন্তৰ্ভুক্ত আছে, কিন্তু আপোনাৰ ব্যৱহাৰকাৰীৰ নামটো কোনো এণ্টাৰপ্ৰাইজ একাউণ্টৰ সৈতে জড়িত নহয়। অনুগ্ৰহ কৰি এটা গৌণ ডিভাইচত g.co/ChromeEnterpriseAccountলৈ গৈ এটা এণ্টাৰপ্ৰাইজ একাউণ্ট সৃষ্টি কৰক।</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ছিংক কৰা সুবিধাটোৱে কাম কৰা নাই</translation> <translation id="6212039847102026977">নেটৱৰ্কৰ উচ্চখাপৰ বৈশিষ্ট্যসমূহ দেখুৱাওক</translation> <translation id="6212168817037875041">ডিছপ্লে’ অফ কৰক</translation> <translation id="6212752530110374741">লিংক ইমেইল কৰক</translation> @@ -5777,6 +5772,7 @@ <translation id="7427348830195639090">নেপথ্যৰ পৃষ্ঠা: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" />ৰ পৰা অহা কল</translation> <translation id="7431719494109538750">কোনো HID ডিভাইচ বিচাৰি পোৱা নগ’ল</translation> +<translation id="7431991332293347422">আপোনাক Search আৰু অন্য সেৱাসমূহত ব্যক্তিগতকৰণ কৰা অভিজ্ঞতা প্ৰদান কৰিবলৈ কেনেকৈ আপোনাৰ ব্ৰাউজিংৰ ইতিহাস ব্যৱহাৰ কৰা হয় সেয়া নিয়ন্ত্ৰণ কৰক</translation> <translation id="7433708794692032816">আপোনাৰ <ph name="DEVICE_TYPE" /> ব্যৱহাৰ কৰি থাকিবলৈ স্মাৰ্ট কাৰ্ড ভৰাওক</translation> <translation id="7433957986129316853">এয়া ৰাখক</translation> <translation id="7434509671034404296">বিকাশকৰ্তা</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 83da139..60c25b6 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -165,7 +165,6 @@ <translation id="117445914942805388">Axtarış tarixçəsini bütün sinxronizasiya olunmuş cihazlardan və Google Hesabınızdan silmək üçün <ph name="BEGIN_LINK" />sinxronizasiya ayarlarına daxil olun<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Çap edin...</translation> <translation id="1176471985365269981">Cihazınızdakı faylları və ya qovluqları redaktə etmək icazəsi verilməyib</translation> -<translation id="1177138678118607465">Google Axtarış, reklamlar və digər Google xidmətlərində axtarış tarixçəsini istifadə edə bilər. Bunu istənilən zaman myaccount.google.com/activitycontrols/search ünvanında dəyişə bilərsiniz</translation> <translation id="1177863135347784049">İxtiyari</translation> <translation id="1178581264944972037">Durdurun</translation> <translation id="117916940443676133">Təhlükəsizlik açarınız PIN ilə qorunmur. Giriş datasını idarə etmək üçün əvvəlcə PIN yaradın.</translation> @@ -548,7 +547,6 @@ <translation id="1602085790802918092">Virtual cihaz başladılır</translation> <translation id="1603914832182249871">(İnkoqnito)</translation> <translation id="1604432177629086300">Çap edilmədi. Printeri yoxlayıb yenidən sınayın.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Parol sinxronizasiyası işləmir</translation> <translation id="1607139524282324606">Girişi silin</translation> <translation id="1607499585984539560">İstifadəçi domen ilə əlaqəli deyil</translation> <translation id="1608626060424371292">Bu istifadəçini silin</translation> @@ -1755,6 +1753,7 @@ <translation id="2889064240420137087">Linki bununla açın:</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> tətbiqinə daxil olmaq üçün cihazınız istifadə edilsin?</translation> <translation id="2893168226686371498">Defolt brauzer</translation> +<translation id="2893180576842394309">Axtarış və digər Google xidmətlərini fərdiləşdirmək üçün Google tarixçədən istifadə edə bilər</translation> <translation id="2894757982205307093">Qrupa yeni tab</translation> <translation id="289695669188700754">Əsas ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Bu fərdi ayar bütün Anonim pəncərələri bağladığınızda silinəcəkdir</translation> @@ -1891,6 +1890,7 @@ <translation id="3027296729579831126">Yaxındakılarla Paylaşmanı aktiv edin</translation> <translation id="3029466929721441205">Rəfdə stilus alətlərini göstərin</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> bu gün güncəlləməni endirmənizi tələb edir. İnternetə qoşulduqda güncəlləmə avtomatik endiriləcək.}other{<ph name="MANAGER" /> son tarixdən öncə güncəlləməni endirmənizi tələb edir. İnternetə qoşulduqda güncəlləmə avtomatik endiriləcək.}}</translation> +<translation id="3030967311408872958">Qürubdan şəfəq vaxtına kimi</translation> <translation id="3031417829280473749">Agent X</translation> <translation id="3031557471081358569">İmport etmək üçün element seçin:</translation> <translation id="3036327949511794916">Bu <ph name="DEVICE_TYPE" /> cihazını qaytarmaq üçün son tarix keçib.</translation> @@ -2634,7 +2634,6 @@ <translation id="3856096718352044181">Bunun etibarlı təminatçı olduğunu doğrulayın, ya da daha sonra təkrar cəhd edin</translation> <translation id="3856800405688283469">Vaxt zonası seçin</translation> <translation id="3857807444929313943">Qaldırın və təkrar toxunun</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Sinxronizasiya dayandırıldı</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" istifadəçi adı əlçatan deyil</translation> <translation id="3861977424605124250">Başlanğıcda göstərin</translation> <translation id="3862788408946266506">"Yalnız_kiosk" funksiyası olan tətbiqlər Chrome OS kiosk rejimində quraşdırılmalıdır</translation> @@ -3523,7 +3522,6 @@ <translation id="4881685975363383806">Növbəti dəfə xatırlatmayın</translation> <translation id="4881695831933465202">Açın</translation> <translation id="4882312758060467256">Bu sayta girişi var</translation> -<translation id="4882831918239250449">Axtarış tarixçəsinin Axtarış, reklam və sairəni necə fərdiləşdirdiyinə nəzarət edin</translation> <translation id="4882919381756638075">Saytlar adətən video çat kimi ünsiyyət xüsusiyyətləri üçün mikrofondan istifadə edir</translation> <translation id="4883436287898674711">Bütün <ph name="WEBSITE_1" /> saytları</translation> <translation id="48838266408104654">&Tapşırıq Meneceri</translation> @@ -4070,6 +4068,7 @@ <translation id="5502500733115278303">Firefox'dan import edilib</translation> <translation id="5502915260472117187">Uşaq</translation> <translation id="5503982651688210506"><ph name="HOST" /> hostuna kameranızı istifadə etmək və hərəkət etdirmək və mikrofonunuzu istifadə etmək icazəsi verməyə davam edin</translation> +<translation id="5504909642107847870">Məxfilik və təhlükəsizliyin nəzərdən keçirilməsi</translation> <translation id="5505264765875738116">Saytlar bildiriş göndərilməsini tələb edə bilməz</translation> <translation id="5505307013568720083">Mürəkkəb bitdi</translation> <translation id="5505794066310932198">Dəyişdirmə Komandanı</translation> @@ -4321,7 +4320,6 @@ <translation id="5794414402486823030">Həmişə sistem izləyici ilə açın</translation> <translation id="5794700615121138172">Linux'un paylaşılan qovluqları</translation> <translation id="5794786537412027208">Bütün Chrome Tətbiqlərindən çıxın</translation> -<translation id="5797070761912323120">Axtarış, reklam və digər Google xidmətlərini fərdiləşdirmək üçün Google tarixçədən istifadə edə bilər</translation> <translation id="5798079537501238810">Saytlar ödəniş emalçılarını quraşdıra bilər</translation> <translation id="579907812742603813">qorunan məzmun</translation> <translation id="579915268381781820">Təhlükəsizlik açarınız silindi.</translation> @@ -4680,7 +4678,6 @@ <translation id="6208521041562685716">Mobil data aktiv edilir</translation> <translation id="6209838773933913227">Komponent güncəllənir</translation> <translation id="6209908325007204267">Cihazınıza Chrome Enterprise Güncəlləməsi daxildir, lakin istifadəçi adınız təşkilat hesabı ilə əlaqələndirilməyib. İkinci cihazda g.co/ChromeEnterpriseAccount ünvanına keçərək təşkilat hesabı yaradın.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Sinxronizasiya işləmir</translation> <translation id="6212039847102026977">Qabaqcıl şəbəkə xüsusiyyətlərini göstərin</translation> <translation id="6212168817037875041">Ekranı deaktiv edin</translation> <translation id="6212752530110374741">E-poçt Linki</translation> @@ -4897,6 +4894,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> - Bluetooth skanlanması aktivdir</translation> <translation id="6445450263907939268">Bu dəyişiklikləri istəmirdinizsə, öncəki ayarlarınızı bərpa edə bilərsiniz.</translation> <translation id="6446213738085045933">Masaüstü qısayol yaradın</translation> +<translation id="6447210166804596538">Ən vacib məxfilik və təhlükəsizlik nizamlayıcılarını bir yerdə nəzərdən keçirin</translation> <translation id="6447842834002726250">Kukilər</translation> <translation id="6450876761651513209">Gizliliklə bağlı ayarlarınızı dəyişin</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> və daha 1 tab}other{<ph name="PAGE_TITLE" /> və daha # tab}}</translation> @@ -5768,6 +5766,7 @@ <translation id="7427348830195639090">Arxa Fon Səhifəsi: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> cihazından zəng</translation> <translation id="7431719494109538750">HID cihazları tapılmadı</translation> +<translation id="7431991332293347422">Axtarış tarixçəsinin Axtarış və sairəni necə fərdiləşdirdiyinə nəzarət edin</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> cihazınızdan istifadəyə davam etmək üçün smart kart taxın</translation> <translation id="7433957986129316853">Saxlayın</translation> <translation id="7434509671034404296">Developer</translation> @@ -6876,6 +6875,7 @@ <translation id="8655972064210167941">Sign-sizin parol təsdiq edilə bilməz, çünki uğursuz oldu. Sizin administratoru ilə əlaqə və ya yenidən cəhd edin.</translation> <translation id="8657393004602556571">Rəydən imtina etmək istəyirsiniz?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> ekran və audionu <ph name="TAB_NAME" /> ilə paylaşır.</translation> +<translation id="8660073998956001352">Axtarış sistemləriniz</translation> <translation id="8661290697478713397">Linki gizli pəncərədə açın</translation> <translation id="8662671328352114214"><ph name="TYPE" /> şəbəkəsinə qoşulun</translation> <translation id="8662795692588422978">Camaat</translation> @@ -7060,6 +7060,7 @@ <translation id="8845001906332463065">Yardım alın</translation> <translation id="8846132060409673887">Bu kompüterin istehsalçı və modelini oxuyun</translation> <translation id="8846163936679269230">eSIM profillərini sıfırlayın</translation> +<translation id="8846746259444262774">Quraşdırma alınmadı</translation> <translation id="8847523528195140327">Qapaq bağlandıqda hesabdan çıxsın</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Gizli</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 380bfce..b3a78cfb 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Каб ачысціць даныя прагляду з усіх сінхранізаваных прылад і Уліковага запісу Google, <ph name="BEGIN_LINK" />перайдзіце ў налады сінхранізацыі<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Друк...</translation> <translation id="1176471985365269981">Не маюць дазволу змяняць файлы або папкі на прыладзе</translation> -<translation id="1177138678118607465">Google можа выкарыстоўваць вашу гісторыю прагляду сайтаў, каб персаналізаваць Пошук, паказ рэкламы і іншыя сэрвісы Google. Вы можаце змяніць гэта ў любы час тут: myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Карыстальніцкая</translation> <translation id="1178581264944972037">Прыпыніць</translation> <translation id="117916940443676133">Ключ бяспекі не абаронены PIN-кодам. Каб кіраваць данымі для ўваходу, спачатку стварыце PIN-код.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Ідзе запуск віртуальнай машыны</translation> <translation id="1603914832182249871">(інкогніта)</translation> <translation id="1604432177629086300">Не ўдалося надрукаваць. Праверце прынтар і паўтарыце спробу.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: сінхранізацыя пароляў не працуе</translation> <translation id="1607139524282324606">Выдаліць запіс</translation> <translation id="1607499585984539560">Карыстальнік не звязаны з даменам</translation> <translation id="1608626060424371292">Выдаліць карыстальніка</translation> @@ -1759,6 +1757,7 @@ <translation id="2889064240420137087">Адкрыць спасылку з дапамогай...</translation> <translation id="2891922230654533301">Выкарыстоўваць гэту прыладу для ўваходу на вэб-сайт <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Стандартны браўзер</translation> +<translation id="2893180576842394309">Google можа выкарыстоўваць вашу гісторыю, каб персаналізаваць пошук і іншыя сэрвісы Google</translation> <translation id="2894757982205307093">Стварыць у групе новую ўкладку</translation> <translation id="289695669188700754">Ідэнтыфікатар ключа: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Гэта карыстальніцкая налада будзе выдалена, калі вы закрыеце ўсе вокны, адкрытыя ў рэжыме інкогніта</translation> @@ -2639,7 +2638,6 @@ <translation id="3856096718352044181">Праверце, ці сапраўдны гэта аператар, або паўтарыце спробу</translation> <translation id="3856800405688283469">Выберыце часавы пояс</translation> <translation id="3857807444929313943">Адніміце палец і дакраніцеся зноў</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: сінхранізацыя прыпынена</translation> <translation id="3861638017150647085">Імя карыстальніка "<ph name="USERNAME" />" недаступнае</translation> <translation id="3861977424605124250">Паказваць пры запуску</translation> <translation id="3862788408946266506">Праграма з атрыбутам маніфеста "kiosk_only" павінна ўсталёўвацца ў рэжыме кіёска Chrome OS</translation> @@ -3530,7 +3528,6 @@ <translation id="4881685975363383806">У наступны раз не напамінаць</translation> <translation id="4881695831933465202">Адкрыць</translation> <translation id="4882312758060467256">Мае доступ да гэтага сайта</translation> -<translation id="4882831918239250449">Кіраванне тым, як гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку, рэкламы і інш.</translation> <translation id="4882919381756638075">Сайты звычайна выкарыстоўваюць мікрафон для функцый сувязі (напрыклад, для відэачата)</translation> <translation id="4883436287898674711">Усе сайты <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Менеджар заданняў</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">Заўсёды адкрываць з дапамогай стандартнага сродку прагляду</translation> <translation id="5794700615121138172">Абагуленыя папкі Linux</translation> <translation id="5794786537412027208">Выйсці з усіх праграм Chrome</translation> -<translation id="5797070761912323120">Google можа выкарыстоўваць вашу гісторыю, каб персаналізаваць пошук, паказ рэкламы і іншыя сэрвісы Google</translation> <translation id="5798079537501238810">Сайты могуць усталёўваць апрацоўшчыкі плацяжоў</translation> <translation id="579907812742603813">абароненае змесціва</translation> <translation id="579915268381781820">Ключ бяспекі адключаны.</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">Ідзе актывацыя мабільнай перадачы даных</translation> <translation id="6209838773933913227">Абнаўленне кампанента</translation> <translation id="6209908325007204267">Прылада ўключае ў сябе ліцэнзію Chrome Enterprise, але ваша імя карыстальніка не звязана з карпаратыўным уліковым запісам. Стварыце карпаратыўны ўліковы запіс, наведаўшы старонку g.co/ChromeEnterpriseAccount з іншай прылады.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: сінхранізацыя не працуе</translation> <translation id="6212039847102026977">Паказаць пашыраныя параметры сеткі</translation> <translation id="6212168817037875041">Выключыць дысплэй</translation> <translation id="6212752530110374741">Адправіць спасылку па пошце</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">Фонавая старонка: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Выклік з прылады <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Прылады HID не знойдзены</translation> +<translation id="7431991332293347422">Кіраванне тым, як ваша гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку і ў іншых мэтах</translation> <translation id="7433708794692032816">Каб працягваць карыстацца прыладай <ph name="DEVICE_TYPE" />, устаўце разумную картку</translation> <translation id="7433957986129316853">Пакінуць</translation> <translation id="7434509671034404296">Для распрацоўшчыкаў</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 5c7a2ce..c8548cd4 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">За да изчистите данните за сърфирането от всичките си синхронизирани устройства и от профила си в Google, <ph name="BEGIN_LINK" />посетете настройките за синхронизиране<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Печат...</translation> <translation id="1176471985365269981">Сайтове без разрешение за редактиране на файловете и папките на устройството</translation> -<translation id="1177138678118607465">Може да използваме историята ви на сърфиране, за да персонализираме търсенето, рекламите и други услуги на Google. В състояние сте да промените това по всяко време на адрес myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">По избор</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="117916940443676133">Ключът ви за сигурност не е защитен с ПИН. За да управлявате данни за вход, първо създайте ПИН.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Виртуалната машина стартира</translation> <translation id="1603914832182249871">(„Инкогнито“)</translation> <translation id="1604432177629086300">Отпечатването не бе успешно. Проверете принтера и опитайте отново.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Синхронизирането на паролите не работи</translation> <translation id="1607139524282324606">Изчистване на записа</translation> <translation id="1607499585984539560">Потребителят не е свързан с домейна</translation> <translation id="1608626060424371292">Премахване на този потребител</translation> @@ -1768,6 +1766,7 @@ <translation id="2889064240420137087">Отваряне на връзката със...</translation> <translation id="2891922230654533301">Искате ли устройството ви да се използва за влизане в профила ви в(ъв) <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Браузър по подразбиране</translation> +<translation id="2893180576842394309">Възможно е да използваме историята ви, за да персонализираме търсенето и други услуги на Google</translation> <translation id="2894757982205307093">Нов раздел в групата</translation> <translation id="289695669188700754">Идентификатор (ИД) на ключ: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Тази персонализирана настройка ще бъде премахната, когато затворите всички прозорци в режим „инкогнито“</translation> @@ -2649,7 +2648,6 @@ <translation id="3856096718352044181">Моля, проверете дали този доставчик е валиден или опитайте отново по-късно</translation> <translation id="3856800405688283469">Изберете часова зона</translation> <translation id="3857807444929313943">Вдигнете пръст и докоснете отново</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: синхронизирането е на пауза</translation> <translation id="3861638017150647085">Потребителското име „<ph name="USERNAME" />“ е заето</translation> <translation id="3861977424605124250">Показване при стартиране</translation> <translation id="3862788408946266506">Приложенията с атрибут „kiosk_only“ в манифеста трябва да бъдат инсталирани в павилионния режим на Chrome OS</translation> @@ -3541,7 +3539,6 @@ <translation id="4881685975363383806">Без повторно напомняне следващия път</translation> <translation id="4881695831933465202">Отваряне</translation> <translation id="4882312758060467256">Има достъп до този сайт</translation> -<translation id="4882831918239250449">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето, рекламите и др.</translation> <translation id="4882919381756638075">Сайтовете обикновено използват микрофона, за да осигуряват функции за комуникация, като например видеочат</translation> <translation id="4883436287898674711">Всички <ph name="WEBSITE_1" /> сайта</translation> <translation id="48838266408104654">&Диспечер на задачите</translation> @@ -4341,7 +4338,6 @@ <translation id="5794414402486823030">Отваряне винаги със системния визуализатор</translation> <translation id="5794700615121138172">Споделяне на папки в Linux</translation> <translation id="5794786537412027208">Затваряне на всички приложения в Chrome</translation> -<translation id="5797070761912323120">Възможно е да използваме историята ви, за да персонализираме търсенето, рекламите и други услуги на Google</translation> <translation id="5798079537501238810">Сайтовете могат да инсталират инструменти за обработване на плащания</translation> <translation id="579907812742603813">защитено съдържание</translation> <translation id="579915268381781820">Ключът за сигурност бе премахнат.</translation> @@ -4702,7 +4698,6 @@ <translation id="6208521041562685716">Мобилните данни се активират</translation> <translation id="6209838773933913227">Компонентът се актуализира</translation> <translation id="6209908325007204267">Устройството ви включва надстройка за Chrome Enterprise, но потребителското ви име не е свързано с корпоративен профил. Моля, създайте си такъв, като посетите g.co/ChromeEnterpriseAccount на алтернативно устройство.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: синхронизирането не работи</translation> <translation id="6212039847102026977">Показване на разширените свойства на мрежата</translation> <translation id="6212168817037875041">Изключване на екрана</translation> <translation id="6212752530110374741">Изпращане на връзката по имейл</translation> @@ -5791,6 +5786,7 @@ <translation id="7427348830195639090">Фонова страница: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Обаждане от <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Няма намерени HID устройства</translation> +<translation id="7431991332293347422">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето и др.</translation> <translation id="7433708794692032816">Поставете смарткарта, за да продължите да използвате своя <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Запазване</translation> <translation id="7434509671034404296">Програмист</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 4f20ebe..d1a43b4 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">আপনার সিঙ্ক করা সমস্ত ডিভাইস এবং Google অ্যাকাউন্ট থেকে ব্রাউজিং ডেটা খালি করার জন্য <ph name="BEGIN_LINK" />সিঙ্ক সেটিংস দেখুন<ph name="END_LINK" />।</translation> <translation id="1175364870820465910">&প্রিন্ট...</translation> <translation id="1176471985365269981">আপনার ডিভাইসে ফাইল অথবা ফোল্ডার এডিট করার অনুমতি নেই</translation> -<translation id="1177138678118607465">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাগুলি আপনার মতো করে সাজানোর জন্য Google আপনার ব্রাউজিং ইতিহাস ব্যবহার করতে পারে। আপনি এটি যেকোনও সময়ে myaccount.google.com/activitycontrols/search থেকে পরিবর্তন করতে পারেন</translation> <translation id="1177863135347784049">কাস্টম</translation> <translation id="1178581264944972037">বিরতি</translation> <translation id="117916940443676133">আপনার নিরাপত্তা কী কোনও পিন দ্বারা সুরক্ষিত নেই। সাইন-ইন ডেটা ম্যানেজ করতে, প্রথমে পিন তৈরি করুন।</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">ভার্চুয়াল মেশিন শুরু করা হচ্ছে</translation> <translation id="1603914832182249871">(ছদ্মবেশী)</translation> <translation id="1604432177629086300">প্রিন্ট করা যায়নি। প্রিন্টার চেক করে নিয়ে আবার চেষ্টা করুন।</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: পাসওয়ার্ড সিঙ্ক ফিচার কাজ করছে না</translation> <translation id="1607139524282324606">এন্ট্রি মুছে দিন</translation> <translation id="1607499585984539560">ডোমেনে ব্যবহারকারীর অনুমোদন নেই</translation> <translation id="1608626060424371292">এই ব্যবহারকারীকে সরান</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">এর সাথে লিঙ্ক খুলুন...</translation> <translation id="2891922230654533301">আপনি কি <ph name="APP_NAME" />-এ সাইন-ইন করার জন্য আপনার ডিভাইস ব্যবহার করতে চান?</translation> <translation id="2893168226686371498">ডিফল্ট ব্রাউজার</translation> +<translation id="2893180576842394309">সার্চ এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে</translation> <translation id="2894757982205307093">গ্রুপে নতুন ট্যাব যোগ করুন</translation> <translation id="289695669188700754">কী ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">আপনি সমস্ত 'ছদ্মবেশী' উইন্ডো বন্ধ করলে এই কাস্টম সেটিং মুছে ফেলা হবে</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">এটি সঠিক প্রদানকারী কিনা যাচাই করুন অথবা পরে আবার চেষ্টা করুন</translation> <translation id="3856800405688283469">সময় অঞ্চল বেছে নিন</translation> <translation id="3857807444929313943">আঙ্গুল লিফ্ট করে আবার টাচ করুন</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: সিঙ্ক থামানো হয়েছে</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" ইউজারনেমটি পাওয়া যাচ্ছে না</translation> <translation id="3861977424605124250">স্টার্টআপে দেখুন</translation> <translation id="3862788408946266506">'Kiosk_only' ম্যানিফেস্ট অ্যাট্রিবিউটের সাথে অ্যাপকে অবশ্যই Chrome OS কিয়স্ক মোডে ইনস্টল করতে হবে</translation> @@ -3542,7 +3540,6 @@ <translation id="4881685975363383806">পরের বার আমাকে মনে করানোর দরকার নেই</translation> <translation id="4881695831933465202">খুলুন</translation> <translation id="4882312758060467256">এই সাইটে অ্যাক্সেস আছে</translation> -<translation id="4882831918239250449">সার্চ, বিজ্ঞাপনসহ আরও অনেক কিছু ব্যক্তিগতকৃত করার জন্য আপনার ব্রাউজিং ইতিহাস কীভাবে ব্যবহার হবে তা নিয়ন্ত্রণ করুন</translation> <translation id="4882919381756638075">ভিডিও চ্যাটের মতো যোগাযোগ করার ফিচারের জন্য সাইট সাধারণত আপনার মাইক্রোফোন ব্যবহার করে</translation> <translation id="4883436287898674711">সব <ph name="WEBSITE_1" /> সাইট</translation> <translation id="48838266408104654">&কার্য পরিচালক</translation> @@ -4341,7 +4338,6 @@ <translation id="5794414402486823030">সর্বদা সিস্টেম নিরীক্ষকের সাথে খুলুন</translation> <translation id="5794700615121138172">Linux-এর শেয়ার করা ফোল্ডার</translation> <translation id="5794786537412027208">সব Chrome অ্যাপ বন্ধ করুন</translation> -<translation id="5797070761912323120">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে</translation> <translation id="5798079537501238810">সাইট, পেমেন্ট হ্যান্ডলার ইনস্টল করতে পারে</translation> <translation id="579907812742603813">সুরক্ষিত কন্টেন্ট</translation> <translation id="579915268381781820">আপনার নিরাপত্তা কী খুলে নেওয়া হয়েছে।</translation> @@ -4702,7 +4698,6 @@ <translation id="6208521041562685716">মোবাইল ডেটা অ্যাক্টিভেট করা হচ্ছে</translation> <translation id="6209838773933913227">কম্পোনেন্ট আপডেট করা হচ্ছে</translation> <translation id="6209908325007204267">আপনার ডিভাইসে Chrome Enterprise আপগ্রেড অন্তর্ভুক্ত রয়েছে, কিন্তু আপনার ইউজারনেমটি কোনও এন্টারপ্রাইজ অ্যাকাউন্টের সাথে যুক্ত নয়। অন্য একটি ডিভাইস থেকে g.co/ChromeEnterpriseAccount লিঙ্কে ক্লিক করে একটি এন্টারপ্রাইজ অ্যাকাউন্ট তৈরি করুন।</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: সিঙ্ক কাজ করছে না</translation> <translation id="6212039847102026977">উন্নত নেটওয়ার্ক বৈশিষ্ট্যগুলি দেখুন</translation> <translation id="6212168817037875041">ডিসপ্লে বন্ধ করুন</translation> <translation id="6212752530110374741">ইমেল লিঙ্ক</translation> @@ -5790,6 +5785,7 @@ <translation id="7427348830195639090">ব্যাকগ্রাউন্ড পৃষ্ঠা:<ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> থেকে কল করুন</translation> <translation id="7431719494109538750">কোনও HID ডিভাইস খুঁজে পাওয়া যায়নি</translation> +<translation id="7431991332293347422">সার্চ এবং আরও অনেক কিছু নিজের মত করে সাজিয়ে নেওয়ার জন্য আপনার ব্রাউজিং ইতিহাস কীভাবে ব্যবহার হবে তা নিয়ন্ত্রণ করুন</translation> <translation id="7433708794692032816">আপনার <ph name="DEVICE_TYPE" /> ব্যবহার করা চালিয়ে যেতে স্মার্ট কার্ড প্রবেশ করান</translation> <translation id="7433957986129316853">এটি রাখতে চাই</translation> <translation id="7434509671034404296">ডেভেলপার</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 57d126e..d811b43 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388"><ph name="BEGIN_LINK" />Posjetite postavke sinhronizacije<ph name="END_LINK" /> da obrišete podatke pregledanja sa svih sinhroniziranih uređaja i Google računa.</translation> <translation id="1175364870820465910">Štam&panje...</translation> <translation id="1176471985365269981">Nije dozvoljeno uređivanje fajlova ili foldera na vašem uređaju</translation> -<translation id="1177138678118607465">Google može koristiti vašu historiju pregledanja za personalizaciju Pretraživanja, oglasa i drugih Googleovih usluga. Ovo uvijek možete promijeniti na myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Prilagođeno</translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="117916940443676133">Vaš sigurnosni ključ nije zaštićen PIN-om. Za upravljanje podacima za prijavu, najprije kreirajte PIN.</translation> @@ -557,7 +556,6 @@ <translation id="1602085790802918092">Pokretanje virtuelnog računara</translation> <translation id="1603914832182249871">(Anonimno)</translation> <translation id="1604432177629086300">Štampanje nije uspjelo. Provjerite štampač i pokušajte ponovo.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Sinhronizacija lozinki ne funkcionira</translation> <translation id="1607139524282324606">Brisanje unosa</translation> <translation id="1607499585984539560">Korisnik nije povezan s domenom</translation> <translation id="1608626060424371292">Ukloni tog korisnika</translation> @@ -1770,6 +1768,7 @@ <translation id="2889064240420137087">Otvori link koristeći…</translation> <translation id="2891922230654533301">Želite li se svojim uređajem prijaviti u aplikaciju <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Zadani preglednik</translation> +<translation id="2893180576842394309">Google može koristiti vašu historiju za personalizaciju Pretraživanja i drugih Googleovih usluga</translation> <translation id="2894757982205307093">Nova kartica u grupi</translation> <translation id="289695669188700754">ID ključa: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ova prilagođena postavka će se ukloniti kada zatvorite sve anonimne prozore.</translation> @@ -2650,7 +2649,6 @@ <translation id="3856096718352044181">Potvrdite da je ovo važeći pružalac usluga ili pokušajte ponovo kasnije</translation> <translation id="3856800405688283469">Izbor vremenske zone</translation> <translation id="3857807444929313943">Podignite i ponovo dodirnite</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Sinhroniziranje je pauzirano</translation> <translation id="3861638017150647085">Korisničko ime "<ph name="USERNAME" />" nije dostupno</translation> <translation id="3861977424605124250">Prikaži prilikom pokretanja</translation> <translation id="3862788408946266506">Aplikacija s atributom deklaracije "kiosk_only" se mora instalirati u načinu rada kioska Chrome OS-a</translation> @@ -3542,7 +3540,6 @@ <translation id="4881685975363383806">Ne podsjećaj me sljedeći put</translation> <translation id="4881695831933465202">Otvori</translation> <translation id="4882312758060467256">Ima pristup ovoj web lokaciji</translation> -<translation id="4882831918239250449">Kontrolirajte kako se koristi vaša historija pregledanja za personalizaciju Pretraživanja i još mnogo toga</translation> <translation id="4882919381756638075">Web lokacije obično koriste mikrofon za funkcije komuniciranja kao što je video chat</translation> <translation id="4883436287898674711">Sve web-lokacije <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Upravitelj zadataka</translation> @@ -4341,7 +4338,6 @@ <translation id="5794414402486823030">Uvijek otvori u prikazivaču sistema</translation> <translation id="5794700615121138172">Dijeljeni folderi na Linuxu</translation> <translation id="5794786537412027208">Napusti sve Chromeove aplikacije</translation> -<translation id="5797070761912323120">Google može koristiti vašu historiju za personalizaciju Pretraživanja, oglasa i drugih Googleovih usluga</translation> <translation id="5798079537501238810">Web lokacije mogu instalirati obrađivače plaćanja</translation> <translation id="579907812742603813">zaštićeni sadržaj</translation> <translation id="579915268381781820">Vaš sigurnosni ključ je uklonjen.</translation> @@ -4702,7 +4698,6 @@ <translation id="6208521041562685716">Aktiviranje prijenosa podataka na mobilnoj mreži</translation> <translation id="6209838773933913227">Ažuriranje komponenti</translation> <translation id="6209908325007204267">Vaš uređaj uključuje nadogradnju na poslovnu verziju Chromea, ali vaše korisničko ime nije povezano s računom preduzeća. Kreirajte račun preduzeća putem web lokacije g.co/ChromeEnterpriseAccount na sekundarnom uređaju.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinhronizacija ne funkcionira</translation> <translation id="6212039847102026977">Prikaži napredna svojstva mreže</translation> <translation id="6212168817037875041">Isključi ekran</translation> <translation id="6212752530110374741">Pošalji link e-poštom</translation> @@ -5791,6 +5786,7 @@ <translation id="7427348830195639090">Pozadinska stranica: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Poziv s uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nije pronađen nijedan HID uređaj</translation> +<translation id="7431991332293347422">Kontrolirajte kako se koristi vaša historija pregledanja za personalizaciju Pretraživanja i još mnogo toga</translation> <translation id="7433708794692032816">Umetnite pametnu karticu da nastavite koristiti uređaj <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Zadrži</translation> <translation id="7434509671034404296">Programer</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 0ee1817..1d1e20e 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Per esborrar les dades de navegació de tots els dispositius sincronitzats i del Compte de Google, <ph name="BEGIN_LINK" />ves a la configuració de sincronització<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Imprimeix...</translation> <translation id="1176471985365269981">Sense permís per editar els fitxers o les carpetes del dispositiu</translation> -<translation id="1177138678118607465">És possible que Google utilitzi el teu historial de navegació per personalitzar la Cerca, els anuncis i altres serveis de Google. Pots canviar aquesta opció sempre que vulguis des de myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Personalitzat</translation> <translation id="1178581264944972037">Posa en pausa</translation> <translation id="117916940443676133">La clau de seguretat no està protegida amb un PIN. Per gestionar les dades d'inici de sessió, primer crea un PIN.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">S'està iniciant la màquina virtual</translation> <translation id="1603914832182249871">(Incògnit)</translation> <translation id="1604432177629086300">No s'ha pogut imprimir. Comprova la impressora i torna-ho a provar.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: la sincronització de contrasenyes no funciona</translation> <translation id="1607139524282324606">Esborra l'entrada</translation> <translation id="1607499585984539560">L'usuari no està afiliat al domini</translation> <translation id="1608626060424371292">Suprimeix aquest usuari</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">Obre l'enllaç amb...</translation> <translation id="2891922230654533301">Vols utilitzar el teu dispositiu per iniciar la sessió a <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador predeterminat</translation> +<translation id="2893180576842394309">És possible que Google utilitzi el teu historial per personalitzar la Cerca i altres serveis de Google</translation> <translation id="2894757982205307093">Pestanya nova al grup</translation> <translation id="289695669188700754">Identificador de clau: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Aquesta configuració personalitzada se suprimirà quan tanquis totes les finestres d'incògnit</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">Verifica que aquest és un proveïdor vàlid o torna-ho a provar més tard</translation> <translation id="3856800405688283469">Selecciona la zona horària</translation> <translation id="3857807444929313943">Aixeca el dit i toca de nou</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: la sincronització s'ha posat en pausa</translation> <translation id="3861638017150647085">El nom d'usuari "<ph name="USERNAME" />" no està disponible</translation> <translation id="3861977424605124250">Mostra a l'inici</translation> <translation id="3862788408946266506">L'aplicació amb l'atribut del fitxer de manifest "kiosk_only" s'ha d'instal·lar en mode quiosc a Chrome OS</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">No m'ho recordis la pròxima vegada</translation> <translation id="4881695831933465202">Obre</translation> <translation id="4882312758060467256">Té accés a aquest lloc web</translation> -<translation id="4882831918239250449">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca, els anuncis i molt més</translation> <translation id="4882919381756638075">Els llocs web solen utilitzar el micròfon per a funcions de comunicació com ara el xat de vídeo</translation> <translation id="4883436287898674711">Tots els llocs web de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Gestor de tasques</translation> @@ -4328,7 +4325,6 @@ <translation id="5794414402486823030">Obre sempre amb el visualitzador del sistema</translation> <translation id="5794700615121138172">Carpetes compartides de Linux</translation> <translation id="5794786537412027208">Surt de totes les aplicacions de Chrome</translation> -<translation id="5797070761912323120">És possible que Google utilitzi el teu historial per personalitzar la Cerca, els anuncis i altres serveis de Google</translation> <translation id="5798079537501238810">Els llocs web poden instal·lar gestors de pagament</translation> <translation id="579907812742603813">contingut protegit</translation> <translation id="579915268381781820">La clau de seguretat s'ha tret.</translation> @@ -4689,7 +4685,6 @@ <translation id="6208521041562685716">S'estan activant les dades mòbils</translation> <translation id="6209838773933913227">S'està actualitzant el component</translation> <translation id="6209908325007204267">El teu dispositiu inclou una Actualització de Chrome Enterprise, però el teu nom d'usuari no està associat a un compte d'empresa. En un altre dispositiu, visita g.co/ChromeEnterpriseAccount i crea un compte d'empresa.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: la sincronització no funciona</translation> <translation id="6212039847102026977">Mostra les propietats de xarxa avançades</translation> <translation id="6212168817037875041">Desactiva la pantalla</translation> <translation id="6212752530110374741">Envia l'enllaç per correu electrònic</translation> @@ -5778,6 +5773,7 @@ <translation id="7427348830195639090">Pàgina en segon pla: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Truca des de: <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">No s'ha trobat cap dispositiu d'interfície humana</translation> +<translation id="7431991332293347422">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca i més</translation> <translation id="7433708794692032816">Insereix la targeta intel·ligent per continuar utilitzant el teu <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Mantén els canvis</translation> <translation id="7434509671034404296">Desenvolupador</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 34d31be..f90de08 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Chcete-li vymazat údaje o prohlížení ze všech synchronizovaných zařízení i z účtu Google, přejděte na <ph name="BEGIN_LINK" />nastavení synchronizace<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Tisk...</translation> <translation id="1176471985365269981">Zákaz upravovat soubory a složky v zařízení</translation> -<translation id="1177138678118607465">Google vaši historii procházení může používat k personalizaci Vyhledávání, reklam a dalších služeb Google. Toto chování můžete kdykoliv změnit na stránce myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Vlastní</translation> <translation id="1178581264944972037">Pozastavit</translation> <translation id="117916940443676133">Váš bezpečnostní klíč není chráněn kódem PIN. Chcete-li spravovat přihlašovací údaje, nejdříve nastavte PIN.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Probíhá spouštění virtuálního počítače</translation> <translation id="1603914832182249871">(Anonymní režim)</translation> <translation id="1604432177629086300">Tisk se nezdařil. Zkontrolujte tiskárnu a zkuste to znovu.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: synchronizace hesel nefunguje</translation> <translation id="1607139524282324606">Vymazat položku</translation> <translation id="1607499585984539560">Uživatel není přidružen k doméně</translation> <translation id="1608626060424371292">Odebrat tohoto uživatele</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">Otevřít odkaz pomocí...</translation> <translation id="2891922230654533301">Přihlásit se pomocí zařízení do aplikace <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Výchozí prohlížeč</translation> +<translation id="2893180576842394309">Google vaši historii může používat k personalizaci Vyhledávání a dalších služeb Google</translation> <translation id="2894757982205307093">Nová karta ve skupině</translation> <translation id="289695669188700754">ID klíče: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Po zavření všech anonymních oken bude toto vlastní nastavení odstraněno</translation> @@ -2636,7 +2635,6 @@ <translation id="3856096718352044181">Zkontrolujte, zda se jedná o platného poskytovatele, nebo to zkuste znovu později</translation> <translation id="3856800405688283469">Vybrat časové pásmo</translation> <translation id="3857807444929313943">Zvedněte prst a dotkněte se znovu</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Synchronizace pozastavena</translation> <translation id="3861638017150647085">Uživatelské jméno „<ph name="USERNAME" />“ není dostupné</translation> <translation id="3861977424605124250">Zobrazit při spuštění</translation> <translation id="3862788408946266506">Aplikace s atributem manifestu kiosk_only je třeba nainstalovat v režimu veřejného terminálu systému Chrome OS</translation> @@ -3526,7 +3524,6 @@ <translation id="4881685975363383806">Příště nepřipomínat</translation> <translation id="4881695831933465202">Otevřít</translation> <translation id="4882312758060467256">Má přístup k tomuto webu</translation> -<translation id="4882831918239250449">Nastavte, jak se má vaše historie procházení používat k personalizaci Vyhledávání, reklam a dalších služeb</translation> <translation id="4882919381756638075">Weby obvykle používají mikrofon ke komunikačním funkcím, jako je videochat</translation> <translation id="4883436287898674711">Všechny weby <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Správce úloh</translation> @@ -4325,7 +4322,6 @@ <translation id="5794414402486823030">Vždy otevřít pomocí systémového prohlížeče</translation> <translation id="5794700615121138172">Sdílené složky Linuxu</translation> <translation id="5794786537412027208">Ukončit všechny aplikace Chrome</translation> -<translation id="5797070761912323120">Google vaši historii může používat k personalizaci Vyhledávání, reklam a dalších služeb Google</translation> <translation id="5798079537501238810">Weby mohou instalovat obslužné nástroje plateb</translation> <translation id="579907812742603813">chráněný obsah</translation> <translation id="579915268381781820">Bezpečnostní klíč byl odpojen.</translation> @@ -4685,7 +4681,6 @@ <translation id="6208521041562685716">Probíhá aktivace mobilních dat</translation> <translation id="6209838773933913227">Aktualizace komponent</translation> <translation id="6209908325007204267">Vaše zařízení obsahuje upgrade Chrome Enterprise, ale vaše uživatelské jméno není přidruženo k podnikovému účtu. V sekundárním zařízení přejděte na adresu g.co/ChromeEnterpriseAccount a vytvořte si podnikový účet.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Synchronizace nefunguje</translation> <translation id="6212039847102026977">Zobrazit rozšířené vlastnosti sítě</translation> <translation id="6212168817037875041">Vypnout displej</translation> <translation id="6212752530110374741">Odeslat odkaz e-mailem</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">Stránka na pozadí: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Zavolat ze zařízení <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nebyla nalezena žádná zařízení HID</translation> +<translation id="7431991332293347422">Nastavte, jak se má vaše historie prohlížení používat k personalizaci Vyhledávání a dalších služeb</translation> <translation id="7433708794692032816">Pokud chcete pokračovat v používání zařízení <ph name="DEVICE_TYPE" />, vložte čipovou kartu</translation> <translation id="7433957986129316853">Zachovat</translation> <translation id="7434509671034404296">Vývojář</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index ed5aedb4..f8cd7ecd 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388"><ph name="BEGIN_LINK" />Gå til indstillingerne for synkronisering<ph name="END_LINK" /> for at rydde browserdata fra alle dine synkroniserede enheder og din Google-konto.</translation> <translation id="1175364870820465910">&Udskriv...</translation> <translation id="1176471985365269981">Har ikke tilladelse til at redigere filer og mapper på din enhed</translation> -<translation id="1177138678118607465">Google kan bruge din browserhistorik til at tilpasse Søgning, annoncer og andre Google-tjenester. Du kan til enhver tid ændre dette på myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Tilpasset</translation> <translation id="1178581264944972037">Pause</translation> <translation id="117916940443676133">Din sikkerhedsnøgle er ikke beskyttet med en pinkode. Opret en pinkode for at administrere logindata.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">Starter den virtuelle maskine</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Kunne ikke udskrive. Tjek printeren, og prøv igen.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Synkronisering af adgangskoder fungerer ikke</translation> <translation id="1607139524282324606">Ryd indtastning</translation> <translation id="1607499585984539560">Brugeren er ikke tilknyttet domænet</translation> <translation id="1608626060424371292">Fjern denne bruger</translation> @@ -1773,6 +1771,7 @@ <translation id="2889064240420137087">Åbn link med...</translation> <translation id="2891922230654533301">Vil du logge ind på <ph name="APP_NAME" /> med din enhed?</translation> <translation id="2893168226686371498">Standardbrowser</translation> +<translation id="2893180576842394309">Google kan bruge din historik til at tilpasse Søgning og andre Google-tjenester</translation> <translation id="2894757982205307093">Ny fane i gruppe</translation> <translation id="289695669188700754">Nøgle-id: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Denne tilpassede indstilling fjernes, når du lukker alle inkognitovinduer</translation> @@ -2653,7 +2652,6 @@ <translation id="3856096718352044181">Bekræft, at dette er en gyldig udbyder, eller prøv igen senere</translation> <translation id="3856800405688283469">Vælg tidszone</translation> <translation id="3857807444929313943">Løft, og tryk igen</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Synkronisering er sat på pause</translation> <translation id="3861638017150647085">Brugernavnet "<ph name="USERNAME" />" er ikke tilgængeligt</translation> <translation id="3861977424605124250">Vis ved opstart</translation> <translation id="3862788408946266506">Appen med manifestattributten "kiosk_only" skal installeres i ChromeOS-terminaltilstand</translation> @@ -3545,7 +3543,6 @@ <translation id="4881685975363383806">Påmind mig ikke næste gang</translation> <translation id="4881695831933465202">Åbn</translation> <translation id="4882312758060467256">Udvidelsen har adgang til dette website.</translation> -<translation id="4882831918239250449">Styr, hvordan din browserhistorik anvendes til at tilpasse søgeresultater, annoncer og meget mere</translation> <translation id="4882919381756638075">Websites bruger normalt din mikrofon til kommunikationsformål såsom videochat</translation> <translation id="4883436287898674711">Alle websites på <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Jobliste</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">Åbn altid med systemets visningsprogram</translation> <translation id="5794700615121138172">Delte mapper i Linux</translation> <translation id="5794786537412027208">Afslut alle Chrome-apps</translation> -<translation id="5797070761912323120">Google kan bruge din historik til at tilpasse Søgning, annoncer og andre Google-tjenester</translation> <translation id="5798079537501238810">Websites kan installere betalingshandlere</translation> <translation id="579907812742603813">beskyttet indhold</translation> <translation id="579915268381781820">Din sikkerhedsnøgle blev fjernet.</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">Mobildata aktiveres</translation> <translation id="6209838773933913227">Komponenten opdateres</translation> <translation id="6209908325007204267">Din enhed inkluderer en Chrome Enterprise-opgradering, men dit brugernavn er ikke tilknyttet en virksomhedskonto. Du skal oprette en virksomhedskonto på g.co/ChromeEnterpriseAccount på en sekundær enhed.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Synkronisering fungerer ikke</translation> <translation id="6212039847102026977">Vis avancerede netværksegenskaber</translation> <translation id="6212168817037875041">Sluk skærmen</translation> <translation id="6212752530110374741">Send link via mail</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090">Baggrundsside: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Ring fra <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Der blev ikke fundet nogen HID-enheder</translation> +<translation id="7431991332293347422">Bestem selv, hvordan din browserhistorik skal bruges til at tilpasse søgeresultater m.m.</translation> <translation id="7433708794692032816">Indsæt chipkortet for at blive ved med at bruge din <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Behold den</translation> <translation id="7434509671034404296">Udvikler</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index c252eb5..ee12a99 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Wenn Sie Browserdaten von all Ihren synchronisierten Geräten und aus Ihrem Google-Konto löschen möchten, <ph name="BEGIN_LINK" />rufen Sie die Synchronisierungseinstellungen auf<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Drucken...</translation> <translation id="1176471985365269981">Dürfen keine Dateien oder Ordner auf meinem Gerät bearbeiten</translation> -<translation id="1177138678118607465">Google kann die Google Suche, Werbung und andere Google-Dienste anhand Ihres Browserverlaufs für Sie personalisieren. Dies lässt sich jederzeit unter myaccount.google.com/activitycontrols/search ändern.</translation> <translation id="1177863135347784049">Benutzerdefiniert</translation> <translation id="1178581264944972037">Pause</translation> <translation id="117916940443676133">Ihr Sicherheitsschlüssel ist nicht durch eine PIN geschützt. Erstellen Sie zuerst eine PIN, um die Anmeldedaten zu verwalten.</translation> @@ -549,7 +548,6 @@ <translation id="1602085790802918092">Virtuelle Maschine wird gestartet</translation> <translation id="1603914832182249871">(Anonym)</translation> <translation id="1604432177629086300">Drucken nicht möglich. Überprüfen Sie den Drucker und versuchen Sie es noch einmal.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Passwortsynchronisierung funktioniert nicht</translation> <translation id="1607139524282324606">Eintrag löschen</translation> <translation id="1607499585984539560">Nutzer ist nicht mit Domain verbunden</translation> <translation id="1608626060424371292">Diesen Nutzer entfernen</translation> @@ -1754,6 +1752,7 @@ <translation id="2889064240420137087">Link öffnen mit...</translation> <translation id="2891922230654533301">Möchten Sie sich mit Ihrem Gerät auf <ph name="APP_NAME" /> anmelden?</translation> <translation id="2893168226686371498">Standardbrowser</translation> +<translation id="2893180576842394309">Anhand Ihres Verlaufs kann Google die Google Suche und andere Google-Dienste personalisieren</translation> <translation id="2894757982205307093">Neuer Tab in Gruppe</translation> <translation id="289695669188700754">Schlüssel-ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Diese benutzerdefinierte Einstellung wird entfernt, wenn Sie alle Ihre Inkognitofenster schließen</translation> @@ -2634,7 +2633,6 @@ <translation id="3856096718352044181">Vergewissern Sie sich, dass dies ein gültiger Provider ist, oder versuchen Sie es später noch einmal</translation> <translation id="3856800405688283469">Zeitzone auswählen</translation> <translation id="3857807444929313943">Anheben und erneut berühren</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Synchronisierung pausiert</translation> <translation id="3861638017150647085">Der Nutzername "<ph name="USERNAME" />" ist nicht verfügbar</translation> <translation id="3861977424605124250">Beim Start anzeigen</translation> <translation id="3862788408946266506">App mit Manifest-Attribut "kiosk_only" muss im Chrome OS-Kioskmodus installiert werden</translation> @@ -3525,7 +3523,6 @@ <translation id="4881685975363383806">Nicht mehr erinnern</translation> <translation id="4881695831933465202">Öffnen</translation> <translation id="4882312758060467256">Hat Zugriff auf diese Website</translation> -<translation id="4882831918239250449">Legen Sie fest, wie Ihr Browserverlauf zur Personalisierung verwendet wird, z. B. bei der Suche und bei Werbung</translation> <translation id="4882919381756638075">Websites verwenden normalerweise Ihr Mikrofon für Kommunikationsfunktionen wie Videochats</translation> <translation id="4883436287898674711">Alle <ph name="WEBSITE_1" />-Websites</translation> <translation id="48838266408104654">&Taskmanager</translation> @@ -4322,7 +4319,6 @@ <translation id="5794414402486823030">Immer mit System Viewer öffnen</translation> <translation id="5794700615121138172">Freigegebene Linux-Ordner</translation> <translation id="5794786537412027208">Alle Chrome-Apps beenden</translation> -<translation id="5797070761912323120">Anhand Ihres Verlaufs kann Google die Google Suche, Werbung und andere Google-Dienste personalisieren</translation> <translation id="5798079537501238810">Websites dürfen Zahlungs-Handler installieren</translation> <translation id="579907812742603813">Geschützte Inhalte</translation> <translation id="579915268381781820">Ihr Sicherheitsschlüssel wurde entfernt.</translation> @@ -4683,7 +4679,6 @@ <translation id="6208521041562685716">Mobile Daten werden aktiviert</translation> <translation id="6209838773933913227">Komponente wird aktualisiert</translation> <translation id="6209908325007204267">Ihr Gerät beinhaltet ein Chrome Enterprise-Upgrade, aber Ihr Nutzername ist nicht mit einem Unternehmenskonto verknüpft. Rufen Sie g.co/ChromeEnterpriseAccount auf einem Zweitgerät auf und erstellen Sie ein Unternehmenskonto.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Synchronisierung funktioniert nicht</translation> <translation id="6212039847102026977">Erweiterte Netzwerkeigenschaften anzeigen</translation> <translation id="6212168817037875041">Display deaktivieren</translation> <translation id="6212752530110374741">Link per E-Mail versenden</translation> @@ -5769,6 +5764,7 @@ <translation id="7427348830195639090">Hintergrundseite: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Mit <ph name="DEVICE_NAME" /> anrufen</translation> <translation id="7431719494109538750">Keine HID-Geräte gefunden</translation> +<translation id="7431991332293347422">Legen Sie fest, wie Ihr Browserverlauf zur Personalisierung der Google Suche verwendet wird</translation> <translation id="7433708794692032816">Smartcard einstecken, um <ph name="DEVICE_TYPE" /> weiterhin zu verwenden</translation> <translation id="7433957986129316853">Beibehalten</translation> <translation id="7434509671034404296">Entwickler</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 1faa801..9489d70 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Για να διαγράψετε τα δεδομένα περιήγησης από όλες τις συγχρονισμένες συσκευές σας και τον Λογαριασμό σας Google, <ph name="BEGIN_LINK" />μεταβείτε στις ρυθμίσεις συγχρονισμού<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Εκτύπωση...</translation> <translation id="1176471985365269981">Δεν επιτρέπεται να επεξεργάζονται αρχεία ή φακέλους στη συσκευή σας</translation> -<translation id="1177138678118607465">Η Google μπορεί να χρησιμοποιεί το ιστορικό περιήγησής σας για να εξατομικεύει την Αναζήτηση, τις διαφημίσεις και άλλες υπηρεσίες Google. Μπορείτε να αλλάξετε αυτήν τη ρύθμιση ανά πάσα στιγμή στο myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Προσαρμοσμένη</translation> <translation id="1178581264944972037">Παύση</translation> <translation id="117916940443676133">Το κλειδί ασφαλείας σας δεν προστατεύεται από PIN. Για να διαχειριστείτε τα δεδομένα σύνδεσης, δημιουργήστε ένα PIN.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Εκκίνηση της εικονικής μηχανής.</translation> <translation id="1603914832182249871">(Ανώνυμη περιήγηση)</translation> <translation id="1604432177629086300">Δεν ήταν δυνατή η εκτύπωση. Ελέγξτε τον εκτυπωτή και δοκιμάστε ξανά.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Ο συγχρονισμός κωδικών πρόσβασης δεν λειτουργεί</translation> <translation id="1607139524282324606">Διαγραφή καταχώρισης</translation> <translation id="1607499585984539560">Ο χρήστης δεν συσχετίζεται με τον τομέα</translation> <translation id="1608626060424371292">Κατάργηση αυτού του χρήστη</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Άνοιγμα συνδέσμου με...</translation> <translation id="2891922230654533301">Χρήση της συσκευής σας για σύνδεση στην εφαρμογή <ph name="APP_NAME" />;</translation> <translation id="2893168226686371498">Προεπιλεγμένο πρόγραμμα περιήγησης</translation> +<translation id="2893180576842394309">Η Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης και άλλων υπηρεσιών Google</translation> <translation id="2894757982205307093">Νέα καρτέλα στην ομάδα</translation> <translation id="289695669188700754">Αναγνωριστικό κλειδιού: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Αυτή η προσαρμοσμένη ρύθμιση θα καταργηθεί όταν κλείσετε όλα τα παράθυρα ανώνυμης περιήγησης</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Βεβαιωθείτε ότι πρόκειται για έγκυρο πάροχο ή δοκιμάστε ξανά αργότερα</translation> <translation id="3856800405688283469">Επιλογή ζώνης ώρας</translation> <translation id="3857807444929313943">Ανασηκώστε και αγγίξτε ξανά</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Ο συγχρονισμός τέθηκε σε παύση</translation> <translation id="3861638017150647085">Δεν είναι διαθέσιμο το όνομα χρήστη "<ph name="USERNAME" />".</translation> <translation id="3861977424605124250">Εμφάνιση κατά την εκκίνηση</translation> <translation id="3862788408946266506">Θα πρέπει να εγκατασταθεί μια εφαρμογή με χαρακτηριστικό μανιφέστου "kiosk_only" στη λειτουργία kiosk του Chrome OS</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Να μην μου ξαναγίνει υπενθύμιση</translation> <translation id="4881695831933465202">Άνοιγμα</translation> <translation id="4882312758060467256">Έχει πρόσβαση σε αυτόν τον ιστότοπο</translation> -<translation id="4882831918239250449">Ελέγξτε τον τρόπο με τον οποίο το ιστορικό περιήγησής σας χρησιμοποιείται για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων στοιχείων</translation> <translation id="4882919381756638075">Οι ιστότοποι χρησιμοποιούν συνήθως το μικρόφωνό σας για λειτουργίες επικοινωνίας, όπως η συνομιλία μέσω βίντεο.</translation> <translation id="4883436287898674711">Όλοι οι ιστότοποι <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Διαχείριση Εργασιών</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">Άνοιγμα πάντα με πρόγραμμα προβολής συστήματος</translation> <translation id="5794700615121138172">Κοινόχρηστοι φάκελοι Linux</translation> <translation id="5794786537412027208">Τερματισμός όλων των εφαρμογών του Chrome</translation> -<translation id="5797070761912323120">Η Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google</translation> <translation id="5798079537501238810">Οι ιστότοποι μπορούν να εγκαθιστούν δείκτες χειρισμού πληρωμής</translation> <translation id="579907812742603813">προστατευμένο περιεχόμενο</translation> <translation id="579915268381781820">Το κλειδί ασφαλείας καταργήθηκε.</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">Γίνεται ενεργοποίηση των δεδομένων κινητής τηλεφωνίας</translation> <translation id="6209838773933913227">Ενημέρωση στοιχείου</translation> <translation id="6209908325007204267">Η συσκευή σας περιλαμβάνει Αναβάθμιση του Chrome για επιχειρήσεις, αλλά το όνομα χρήστη σας δεν συσχετίζεται με έναν εταιρικό λογαριασμό. Δημιουργήστε έναν εταιρικό λογαριασμό μεταβαίνοντας στη διεύθυνση g.co/ChromeEnterpriseAccount σε μια δευτερεύουσα συσκευή.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Ο συγχρονισμός δεν λειτουργεί</translation> <translation id="6212039847102026977">Προβολή σύνθετων ιδιοτήτων δικτύου</translation> <translation id="6212168817037875041">Απενεργοποίηση οθόνης</translation> <translation id="6212752530110374741">Σύνδεσμος ηλεκτρονικού ταχυδρομείου</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090"> σελίδα: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Κλήση από <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Δεν βρέθηκαν συσκευές HID</translation> +<translation id="7431991332293347422">Ελέγξτε τον τρόπο με τον οποίο χρησιμοποιείται το ιστορικό περιήγησής σας για την εξατομίκευση της Αναζήτησης και άλλων λειτουργιών</translation> <translation id="7433708794692032816">Εισαγάγετε την έξυπνη κάρτα για να συνεχίσετε τη χρήση της συσκευής <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Διατήρηση</translation> <translation id="7434509671034404296">Για Προγραμματιστές</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index ceb2d8bf..8a182f2c 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">To clear browsing data from all of your synced devices and your Google Account, <ph name="BEGIN_LINK" />visit sync settings<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Print...</translation> <translation id="1176471985365269981">Not allowed to edit files or folders on your device</translation> -<translation id="1177138678118607465">Google may use your browsing history to personalise Search, ads and other Google services. You can change this at any time at myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Customised</translation> <translation id="1178581264944972037">Pause</translation> <translation id="117916940443676133">Your security key is not protected with a PIN. To manage sign-in data, first create a PIN.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Starting the virtual machine</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Couldn't print. Check printer and try again.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Password sync isn't working</translation> <translation id="1607139524282324606">Clear entry</translation> <translation id="1607499585984539560">User is not affiliated with domain</translation> <translation id="1608626060424371292">Remove this user</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Open link with...</translation> <translation id="2891922230654533301">Use your device to sign in to <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Default browser</translation> +<translation id="2893180576842394309">Google may use your history to personalise Search and other Google services</translation> <translation id="2894757982205307093">New tab in group</translation> <translation id="289695669188700754">Key ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">This custom setting will be removed when you close all your incognito windows</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Please verify that this is a valid provider or try again later</translation> <translation id="3856800405688283469">Select Time Zone</translation> <translation id="3857807444929313943">Lift, then touch again</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Sync paused</translation> <translation id="3861638017150647085">Username '<ph name="USERNAME" />' is not available</translation> <translation id="3861977424605124250">Show on startup</translation> <translation id="3862788408946266506">App with 'kiosk_only' manifest attribute must be installed in Chrome OS kiosk mode</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Don't remind me next time</translation> <translation id="4881695831933465202">Open</translation> <translation id="4882312758060467256">Has access to this site</translation> -<translation id="4882831918239250449">Control how your browsing history is used to personalise Search, ads and more</translation> <translation id="4882919381756638075">Sites usually use your microphone for communication features like video chatting</translation> <translation id="4883436287898674711">All <ph name="WEBSITE_1" /> sites</translation> <translation id="48838266408104654">&Task Manager</translation> @@ -4343,7 +4340,6 @@ <translation id="5794414402486823030">Always open with system viewer</translation> <translation id="5794700615121138172">Linux shared folders</translation> <translation id="5794786537412027208">Quit all Chrome Apps</translation> -<translation id="5797070761912323120">Google may use your history to personalise Search, ads and other Google services</translation> <translation id="5798079537501238810">Sites can install payment handlers</translation> <translation id="579907812742603813">protected content</translation> <translation id="579915268381781820">Your security key was removed.</translation> @@ -4704,7 +4700,6 @@ <translation id="6208521041562685716">Mobile data being activated</translation> <translation id="6209838773933913227">Component updating</translation> <translation id="6209908325007204267">Your device includes a Chrome Enterprise Upgrade, but your username is not associated with an enterprise account. Please create an enterprise account by visiting g.co/ChromeEnterpriseAccount on a secondary device.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Sync isn't working</translation> <translation id="6212039847102026977">Show advanced network properties</translation> <translation id="6212168817037875041">Turn off display</translation> <translation id="6212752530110374741">Email Link</translation> @@ -5793,6 +5788,7 @@ <translation id="7427348830195639090">Background Page: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Call from <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">No HID devices found</translation> +<translation id="7431991332293347422">Control how your browsing history is used to personalise Search and more</translation> <translation id="7433708794692032816">Insert smart card to keep using your <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Keep it</translation> <translation id="7434509671034404296">Developer</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 2b28902..541775e6 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Para borrar los datos de navegación de todos los dispositivos sincronizados y de tu Cuenta de Google, <ph name="BEGIN_LINK" />revisa la configuración de sincronización<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Im&primir...</translation> <translation id="1176471985365269981">No pueden editar archivos ni carpetas del dispositivo</translation> -<translation id="1177138678118607465">Es posible que Google use tu historial de navegación para personalizar Búsqueda, los anuncios y otros servicios de Google. Puedes cambiar esta configuración en cualquier momento en myaccount.google.com.</translation> <translation id="1177863135347784049">Personalizado</translation> <translation id="1178581264944972037">Detener</translation> <translation id="117916940443676133">Tu llave de seguridad no está protegida con un PIN. Para administrar los datos de acceso, crea uno.</translation> @@ -549,7 +548,6 @@ <translation id="1602085790802918092">Iniciando la máquina virtual</translation> <translation id="1603914832182249871">(Incógnito)</translation> <translation id="1604432177629086300">No se pudo completar la impresión. Revisa la impresora y vuelve a intentarlo.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: No funciona la sincronización de contraseñas</translation> <translation id="1607139524282324606">Borrar entrada</translation> <translation id="1607499585984539560">El usuario no está afiliado al dominio</translation> <translation id="1608626060424371292">Quitar este usuario</translation> @@ -1754,6 +1752,7 @@ <translation id="2889064240420137087">Abrir el vínculo con...</translation> <translation id="2891922230654533301">¿Quieres usar tu dispositivo para acceder a <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador predeterminado</translation> +<translation id="2893180576842394309">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="2894757982205307093">Nueva pestaña en el grupo</translation> <translation id="289695669188700754">ID de clave: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Se quitará esta configuración personalizada cuando cierres todas las ventanas de incógnito</translation> @@ -2634,7 +2633,6 @@ <translation id="3856096718352044181">Verifica que sea un proveedor válido o vuelve a intentarlo más tarde</translation> <translation id="3856800405688283469">Seleccionar zona horaria</translation> <translation id="3857807444929313943">Levanta el dedo y vuelve a tocar</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Se pausó la sincronización</translation> <translation id="3861638017150647085">El nombre de usuario "<ph name="USERNAME" />" no está disponible</translation> <translation id="3861977424605124250">Mostrar al inicio</translation> <translation id="3862788408946266506">Se debe instalar la app con el atributo del manifiesto "kiosk_only" en el modo kiosco del Sistema operativo Chrome</translation> @@ -3525,7 +3523,6 @@ <translation id="4881685975363383806">No recordármelo la próxima vez</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="4882312758060467256">Tiene acceso a este sitio</translation> -<translation id="4882831918239250449">Controlar cómo se usa tu historial de navegación para personalizar la Búsqueda, los anuncios y mucho más</translation> <translation id="4882919381756638075">Por lo general, los sitios utilizan el micrófono para habilitar funciones de comunicación, como videochat.</translation> <translation id="4883436287898674711">Todos los sitios de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Adminis&trador de tareas</translation> @@ -4324,7 +4321,6 @@ <translation id="5794414402486823030">Abrir siempre con el visualizador del sistema</translation> <translation id="5794700615121138172">Carpetas compartidas de Linux</translation> <translation id="5794786537412027208">Salir de todas las aplicaciones de Chrome</translation> -<translation id="5797070761912323120">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="5798079537501238810">Los sitios pueden instalar controladores de pago.</translation> <translation id="579907812742603813">contenido protegido</translation> <translation id="579915268381781820">Se quitó la llave de seguridad.</translation> @@ -4685,7 +4681,6 @@ <translation id="6208521041562685716">Se están activando los datos móviles</translation> <translation id="6209838773933913227">Se está actualizando el componente</translation> <translation id="6209908325007204267">El dispositivo incluye una actualización de Chrome Enterprise, pero tu nombre de usuario no está asociado a una cuenta empresarial. Para crear una cuenta de este tipo, visita g.co/ChromeEnterpriseAccount en otro dispositivo.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: La sincronización no funciona</translation> <translation id="6212039847102026977">Mostrar las propiedades de red avanzadas</translation> <translation id="6212168817037875041">Apagar la pantalla</translation> <translation id="6212752530110374741">Compartir vínculo por correo electrónico</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">Página de fondo: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Llamada de <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">No se encontraron dispositivos HID</translation> +<translation id="7431991332293347422">Controla cómo se usa tu historial de navegación para personalizar la Búsqueda y mucho más</translation> <translation id="7433708794692032816">Inserta la tarjeta inteligente para seguir usando tu <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Conservar el cambio</translation> <translation id="7434509671034404296">Opciones para desarrolladores</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 921e8025c..50b5a131 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Para borrar los datos de navegación de todos los dispositivos sincronizados y de tu cuenta de Google, ve a la <ph name="BEGIN_LINK" />configuración de sincronización<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Im&primir...</translation> <translation id="1176471985365269981">No pueden editar archivos ni carpetas en tu dispositivo</translation> -<translation id="1177138678118607465">Es posible que Google use tu historial de navegación para personalizar los anuncios de búsqueda y otros servicios de Google. Puedes cambiar esta opción en cualquier momento en la página myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personalizado</translation> <translation id="1178581264944972037">Pausar</translation> <translation id="117916940443676133">Tu llave de seguridad no está protegida mediante un PIN. Para gestionar los datos de inicio de sesión, primero debes crear un PIN.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Iniciando la máquina virtual</translation> <translation id="1603914832182249871">(Incógnito)</translation> <translation id="1604432177629086300">No se ha podido imprimir. Comprueba la impresora y vuelve a intentarlo.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: la sincronización de contraseñas no funciona</translation> <translation id="1607139524282324606">Borrar entrada</translation> <translation id="1607499585984539560">El usuario no está asociado a un dominio</translation> <translation id="1608626060424371292">Eliminar este usuario</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">Abrir enlace con...</translation> <translation id="2891922230654533301">¿Usar tu dispositivo para iniciar sesión en <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador predeterminado</translation> +<translation id="2893180576842394309">Es posible que Google utilice tu historial para personalizar la Búsqueda y otros servicios de Google</translation> <translation id="2894757982205307093">Nueva pestaña en grupo</translation> <translation id="289695669188700754">ID de clave: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Este ajuste personalizado se quitará cuando cierres todas tus ventanas de incógnito</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">Verifica que este sea un proveedor válido o inténtalo de nuevo más tarde.</translation> <translation id="3856800405688283469">Seleccionar zona horaria</translation> <translation id="3857807444929313943">Levanta el dedo y toca de nuevo</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sincronización en pausa</translation> <translation id="3861638017150647085">El nombre de usuario "<ph name="USERNAME" />" no está disponible</translation> <translation id="3861977424605124250">Mostrar al iniciar</translation> <translation id="3862788408946266506">La aplicación con el atributo del archivo de manifiesto "kiosk_only" se debe instalar en el modo kiosco de Chrome OS</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">No me lo recuerdes la próxima vez</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="4882312758060467256">Tiene acceso a este sitio web</translation> -<translation id="4882831918239250449">Controla cómo se usa el historial de navegación para personalizar la Búsqueda, los anuncios y más</translation> <translation id="4882919381756638075">Los sitios suelen acceder al micrófono para utilizarlo en funciones relacionadas con la comunicación, como el chat de vídeo.</translation> <translation id="4883436287898674711">Todos los sitios de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Administrador de tareas</translation> @@ -4326,7 +4323,6 @@ <translation id="5794414402486823030">Abrir siempre con el visor del sistema</translation> <translation id="5794700615121138172">Carpetas compartidas de Linux</translation> <translation id="5794786537412027208">Salir de todas las aplicaciones de Chrome</translation> -<translation id="5797070761912323120">Es posible que Google utilice tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="5798079537501238810">Los sitios pueden instalar controladores de pago</translation> <translation id="579907812742603813">contenido protegido</translation> <translation id="579915268381781820">Se ha desconectado la llave de seguridad.</translation> @@ -4687,7 +4683,6 @@ <translation id="6208521041562685716">Se están activando los datos móviles</translation> <translation id="6209838773933913227">Actualización del componente</translation> <translation id="6209908325007204267">Tu dispositivo incluye una Licencia de Chrome Enterprise, pero tu nombre de usuario no está asociado a ninguna cuenta de empresa. Accede a g.co/ChromeEnterpriseAccount desde otro dispositivo para crear una cuenta de empresa.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: la sincronización no funciona</translation> <translation id="6212039847102026977">Mostrar propiedades de red avanzadas</translation> <translation id="6212168817037875041">Apagar la pantalla</translation> <translation id="6212752530110374741">Enviar enlace por correo electrónico</translation> @@ -5776,6 +5771,7 @@ <translation id="7427348830195639090">Página en segundo plano: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Llamar desde <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">No se ha encontrado ningún dispositivo HID</translation> +<translation id="7431991332293347422">Controla cómo se usa el historial de navegación para personalizar la Búsqueda y más</translation> <translation id="7433708794692032816">Introduce la tarjeta inteligente para seguir usando tu <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Conservar</translation> <translation id="7434509671034404296">Opciones para desarrolladores</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 8b11c5a..b599f45 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Sirvimisandmete kustutamiseks kõigist sünkroonitud seadmetest ja oma Google'i kontolt <ph name="BEGIN_LINK" />avage sünkroonimisseaded<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Prindi...</translation> <translation id="1176471985365269981">Pole lubatud muuta teie seadmes olevaid faile ega kaustu</translation> -<translation id="1177138678118607465">Google võib kasutada teie sirvimisajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks. Seda saab alati muuta saidil myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Kohandatud</translation> <translation id="1178581264944972037">Peata</translation> <translation id="117916940443676133">Teie turvavõti pole PIN-koodiga kaitstud. Sisselogimisandmete haldamiseks looge esmalt PIN-kood.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Virtuaalmasina käivitamine</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Ei õnnestunud printida. Kontrollige printerit ja proovige uuesti.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: paroolide sünkroonimine ei tööta</translation> <translation id="1607139524282324606">Kustuta sisestus</translation> <translation id="1607499585984539560">Kasutaja ei ole domeeniga seotud</translation> <translation id="1608626060424371292">Eemalda see kasutaja</translation> @@ -1763,6 +1761,7 @@ <translation id="2889064240420137087">Lingi avamine rakendusega ...</translation> <translation id="2891922230654533301">Kas soovite rakendusse <ph name="APP_NAME" /> sisselogimiseks kasutada oma seadet?</translation> <translation id="2893168226686371498">Vaikebrauser</translation> +<translation id="2893180576842394309">Google võib kasutada teie ajalugu otsingu ja muude Google'i teenuste isikupärastamiseks</translation> <translation id="2894757982205307093">Uus vaheleht grupis</translation> <translation id="289695669188700754">Võtme ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">See kohandatud seade eemaldatakse, kui sulgete kõik oma inkognito aknad</translation> @@ -2643,7 +2642,6 @@ <translation id="3856096718352044181">Veenduge, et tegemist oleks kehtiva teenusepakkujaga, või proovige hiljem uuesti</translation> <translation id="3856800405688283469">Ajavööndi valimine</translation> <translation id="3857807444929313943">Tõstke sõrm andurilt ja seejärel puudutage uuesti</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sünkroonimine on peatatud</translation> <translation id="3861638017150647085">Kasutajanime „<ph name="USERNAME" />” pole saadaval</translation> <translation id="3861977424605124250">Kuva käivitamisel</translation> <translation id="3862788408946266506">Rakendus manifesti atribuudiga „kiosk_only” tuleb installida Chrome OS-i kioskirežiimis</translation> @@ -3534,7 +3532,6 @@ <translation id="4881685975363383806">Ära järgmisel korral meelde tuleta</translation> <translation id="4881695831933465202">Ava</translation> <translation id="4882312758060467256">Laiendusel on juurdepääs sellele saidile</translation> -<translation id="4882831918239250449">Juhtige, kuidas teie sirvimisajalugu kasutatakse otsingu, reklaamide ja muu isikupärastamiseks</translation> <translation id="4882919381756638075">Saidid kasutavad teie mikrofoni tavaliselt suhtlusfunktsioonide jaoks, näiteks videovestluseks</translation> <translation id="4883436287898674711">Kõik domeeni <ph name="WEBSITE_1" /> saidid</translation> <translation id="48838266408104654">Tegumihal&dur</translation> @@ -4333,7 +4330,6 @@ <translation id="5794414402486823030">Ava alati süsteemivaaturiga</translation> <translation id="5794700615121138172">Linuxi jagatud kaustad</translation> <translation id="5794786537412027208">Sule kõik Chrome'i rakendused</translation> -<translation id="5797070761912323120">Google võib kasutada teie ajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks</translation> <translation id="5798079537501238810">Saidid saavad installida maksete töötlejaid</translation> <translation id="579907812742603813">kaitstud sisu</translation> <translation id="579915268381781820">Teie turvavõti eemaldati.</translation> @@ -4694,7 +4690,6 @@ <translation id="6208521041562685716">Mobiilne andmeside aktiveeritakse</translation> <translation id="6209838773933913227">Komponenti värskendatakse</translation> <translation id="6209908325007204267">Teie seadmel on Chrome Enterprise'i täiendus, kuid teie kasutajanimi pole ettevõtte kontoga seotud. Looge ettevõtte konto, külastades teises seadmes saiti g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sünkroonimine ei tööta</translation> <translation id="6212039847102026977">Kuva täpsemad võrguatribuudid</translation> <translation id="6212168817037875041">Lülita ekraan välja</translation> <translation id="6212752530110374741">Saada link meiliga</translation> @@ -5783,6 +5778,7 @@ <translation id="7427348830195639090">Taustleht: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Kõne seadmest <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">HID-seadmeid ei leitud</translation> +<translation id="7431991332293347422">Juhtige, kuidas kasutatakse teie sirvimisajalugu otsingu ja muu isikupärastamiseks</translation> <translation id="7433708794692032816">Sisestage kiipkaart, et jätkata seadme <ph name="DEVICE_TYPE" /> kasutamist</translation> <translation id="7433957986129316853">Säilita</translation> <translation id="7434509671034404296">Arendaja</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 9a0284f..6f24bc16 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Sinkronizatutako gailu guztietako eta zure Google-ko kontuko arakatze-datuak garbitzeko, <ph name="BEGIN_LINK" />joan sinkronizazio-ezarpenetara<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">In&primatu…</translation> <translation id="1176471985365269981">Ezin dituzte editatu gailuko fitxategiak edo karpetak</translation> -<translation id="1177138678118607465">Baliteke Google-k arakatze-historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko. Hori aldatzeko, joan myaccount.google.com/activitycontrols/search helbidera.</translation> <translation id="1177863135347784049">Pertsonalizatua</translation> <translation id="1178581264944972037">Pausatu</translation> <translation id="117916940443676133">Segurtasun-giltza ez daukazu PIN kodearekin babestuta. Saioa hasteko datuak kudeatzeko, sortu PIN bat.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Makina birtuala abiarazten</translation> <translation id="1603914832182249871">(Ezkutuko modua)</translation> <translation id="1604432177629086300">Ezin izan da inprimatu. Begiratu inprimagailua eta saiatu berriro.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: pasahitzen sinkronizazioa ez dabil</translation> <translation id="1607139524282324606">Garbitu sarrera</translation> <translation id="1607499585984539560">Erabiltzailea ez dago kidetuta domeinuarekin</translation> <translation id="1608626060424371292">Kendu erabiltzailea</translation> @@ -1756,6 +1754,7 @@ <translation id="2889064240420137087">Ireki esteka honekin…</translation> <translation id="2891922230654533301">Gailua erabili nahi duzu <ph name="APP_NAME" /> webgunean saioa hasteko?</translation> <translation id="2893168226686371498">Arakatzaile lehenetsia</translation> +<translation id="2893180576842394309">Baliteke Google-k historia erabiltzea Bilaketa eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="2894757982205307093">Gehitu fitxa bat taldean</translation> <translation id="289695669188700754">Gakoaren IDa: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ezarpen pertsonalizatu hau kendu egingo da ezkutuko moduko leiho guztiak ixten dituzunean</translation> @@ -2636,7 +2635,6 @@ <translation id="3856096718352044181">Egiaztatu hornitzaile horrek balio duela edo saiatu berriro geroago</translation> <translation id="3856800405688283469">Hautatu ordu-zona</translation> <translation id="3857807444929313943">Jaso hatza eta ukitu berriro</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinkronizazioa pausatu egin da</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" erabiltzaile-izena ez dago erabilgarri</translation> <translation id="3861977424605124250">Erakutsi abioan</translation> <translation id="3862788408946266506">"kiosk_only" manifestu-atributua duen aplikazio bat instalatu behar da Chrome OS-en modu espezializatuan</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">Ez gogorarazi hurrengoan</translation> <translation id="4881695831933465202">Ireki</translation> <translation id="4882312758060467256">Webgunerako sarbidea du</translation> -<translation id="4882831918239250449">Kontrolatu arakatze-historia nola erabiltzen den Bilaketa, iragarkiak eta beste pertsonalizatzeko</translation> <translation id="4882919381756638075">Webguneek mikrofonoa erabili ohi dute bideo-deiak eta antzeko komunikazio-eginbideak eskaintzeko</translation> <translation id="4883436287898674711"><ph name="WEBSITE_1" /> webguneak</translation> <translation id="48838266408104654">&Zereginen kudeatzailea</translation> @@ -4326,7 +4323,6 @@ <translation id="5794414402486823030">Ireki beti sistema-ikustailearekin</translation> <translation id="5794700615121138172">Linux-eko karpeta partekatuak</translation> <translation id="5794786537412027208">Irten Chrome-ren aplikazio guztietatik</translation> -<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="5798079537501238810">Webguneek ordainketa-kudeatzaileak instala ditzakete</translation> <translation id="579907812742603813">eduki babestua</translation> <translation id="579915268381781820">Kendu egin da segurtasun-giltza.</translation> @@ -4687,7 +4683,6 @@ <translation id="6208521041562685716">Datu-konexioa aktibatzen</translation> <translation id="6209838773933913227">Osagaiaren eguneratzea</translation> <translation id="6209908325007204267">Gailuak Chrome Enterprise Upgrade erabiltzeko lizentzia bat dakar, baina zure izena ez dago erlazionatuta ezein enpresako konturekin. Joan g.co/ChromeEnterpriseAccount helbidera beste gailu batean, eta sortu enpresako kontu bat.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinkronizazioa ez dabil behar bezala</translation> <translation id="6212039847102026977">Erakutsi sarearen propietate aurreratuak</translation> <translation id="6212168817037875041">Itzali pantaila</translation> <translation id="6212752530110374741">Bidali esteka posta elektronikoz</translation> @@ -5776,6 +5771,7 @@ <translation id="7427348830195639090">Atzeko planoko orria: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Deitu <ph name="DEVICE_NAME" /> gailutik</translation> <translation id="7431719494109538750">Ez da aurkitu HID gailurik</translation> +<translation id="7431991332293347422">Kontrolatu arakatze-historia nola erabiltzen den Bilaketa eta beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="7433708794692032816">Sartu txartel adimenduna <ph name="DEVICE_TYPE" /> erabiltzen jarraitzeko</translation> <translation id="7433957986129316853">Mantendu</translation> <translation id="7434509671034404296">Garatzailea</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index f6d3bcad..53c54ad7 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">برای اینکه دادههای محصول مرور را از همه دستگاههای همگامسازیشده و حساب Google خود پاک کنید، <ph name="BEGIN_LINK" />به تنظیمات همگامسازی بروید<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&چاپ...</translation> <translation id="1176471985365269981">اجازه ندارد فایلها یا پوشههای درون دستگاه را ویرایش کند</translation> -<translation id="1177138678118607465">ممکن است Google از سابقه مرور شما برای شخصیسازی «جستجو»، آگهی و سایر خدمات استفاده کند. هرزمان خواستید میتوانید این مورد را در myaccount.google.com/activitycontrols/search تغییر دهید</translation> <translation id="1177863135347784049">سفارشی</translation> <translation id="1178581264944972037">مکث</translation> <translation id="117916940443676133">کلید امنیتیتان پین ندارد و محافظتشده نیست. برای مدیریت دادههای ورود به سیستم، ابتدا پین ایجاد کنید.</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">درحال شروع دستگاه مجازی</translation> <translation id="1603914832182249871">(ناشناس)</translation> <translation id="1604432177629086300">چاپ نشد چاپگر را بررسی کنید و دوباره امتحان کنید.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: همگامسازی گذرواژه کار نمیکند</translation> <translation id="1607139524282324606">پاک کردن ورودی</translation> <translation id="1607499585984539560">کاربر به دامنه وابسته نیست</translation> <translation id="1608626060424371292">حذف این کاربر</translation> @@ -1769,6 +1767,7 @@ <translation id="2889064240420137087">بازکردن پیوند با...</translation> <translation id="2891922230654533301">برای وارد شدن به سیستم <ph name="APP_NAME" /> از دستگاهتان استفاده شود؟</translation> <translation id="2893168226686371498">مرورگر پیشفرض</translation> +<translation id="2893180576842394309">Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو و سایر سرویسهای Google استفاده کند</translation> <translation id="2894757982205307093">برگه جدید در گروه</translation> <translation id="289695669188700754">شناسه کلید: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">وقتی همه پنجرههای ناشناس را ببندید، این تنظیم سفارشی برداشته خواهد شد</translation> @@ -2649,7 +2648,6 @@ <translation id="3856096718352044181">لطفاً تأیید کنید این ارائهدهندهْ معتبر است یا بعداً دوباره امتحان کنید</translation> <translation id="3856800405688283469">انتخاب منطقه زمانی</translation> <translation id="3857807444929313943">بردارید و سپس دوباره لمس کنید</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: همگامسازی موقتاً متوقف شد</translation> <translation id="3861638017150647085">نام کاربری «<ph name="USERNAME" />» در دسترس نیست</translation> <translation id="3861977424605124250">نمایش هنگام راهاندازی</translation> <translation id="3862788408946266506">برنامهای با ویژگی مانیفست «kiosk_only» باید در حالت کیوسک Chrome OS نصب شود</translation> @@ -3541,7 +3539,6 @@ <translation id="4881685975363383806">دفعه بعد به من یادآوری نشود</translation> <translation id="4881695831933465202">باز کردن</translation> <translation id="4882312758060467256">به این سایت دسترسی دارد</translation> -<translation id="4882831918239250449">کنترل نحوه استفاده از سابقه مرور برای شخصیسازی «جستجو»، آگهیها و موارد دیگر</translation> <translation id="4882919381756638075">سایتها معمولاً از میکروفون برای ارائه ویژگیهای ارتباطی، مانند گپ ویدیویی، استفاده میکنند</translation> <translation id="4883436287898674711">همه سایتهای <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">مدیر &فعالیت ها</translation> @@ -4340,7 +4337,6 @@ <translation id="5794414402486823030">همیشه با نظارهگر سیستم باز شود</translation> <translation id="5794700615121138172">پوشههای همرسانیشده Linux</translation> <translation id="5794786537412027208">خروج از همه برنامههای Chrome</translation> -<translation id="5797070761912323120">Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو، آگهیها و سایر سرویسهای Google استفاده کند</translation> <translation id="5798079537501238810">سایتها میتوانند کنترلکننده پرداخت نصب کنند</translation> <translation id="579907812742603813">محتوای محافظتشده</translation> <translation id="579915268381781820">کلید امنیتیتان برداشته شد.</translation> @@ -4701,7 +4697,6 @@ <translation id="6208521041562685716">داده تلفن همراه درحال فعال شدن است</translation> <translation id="6209838773933913227">درحال بهروزرسانی مؤلفه</translation> <translation id="6209908325007204267">دستگاهتان ارتقای Chrome Enterprise دارد، اما نام کاربریتان با حساب سازمانی مرتبط نیست. لطفاً با مراجعه به g.co/ChromeEnterpriseAccount در دستگاهی دیگر، حساب سازمانی ایجاد کنید.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: همگامسازی کار نمیکند</translation> <translation id="6212039847102026977">نمایش ویژگیهای پیشرفته شبکه</translation> <translation id="6212168817037875041">خاموش کردن نمایشگر</translation> <translation id="6212752530110374741">پیوند ایمیل</translation> @@ -5790,6 +5785,7 @@ <translation id="7427348830195639090">صفحه پسزمینه: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">تماس از <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">هیچ دستگاه HID پیدا نشد</translation> +<translation id="7431991332293347422">کنترل نحوه استفاده از سابقه مرور برای شخصیسازی «جستجو» و موارد دیگر</translation> <translation id="7433708794692032816">برای ادامه استفاده از <ph name="DEVICE_TYPE" />، کارت هوشمند را وارد کنید</translation> <translation id="7433957986129316853">حفظ شود</translation> <translation id="7434509671034404296">برنامهنویس</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index fa9d3c9..5ae18f6 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Jos haluat poistaa selailutiedot kaikilta synkronoiduilta laitteiltasi ja Google-tililtäsi, <ph name="BEGIN_LINK" />siirry synronointiasetuksiin<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Tulo&sta...</translation> <translation id="1176471985365269981">Laitteen tiedostojen tai kansioiden muokkaaminen kielletty</translation> -<translation id="1177138678118607465">Google voi käyttää selaushistoriaasi Haun, mainosten ja muiden Googlen palveluiden muokkaamiseen. Voit muuttaa asetuksiasi koska tahansa osoitteessa myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Muokattu</translation> <translation id="1178581264944972037">Tauko</translation> <translation id="117916940443676133">Suojausavaintasi ei ole suojattu PIN-koodilla. Luo PIN-koodi, jotta voit ylläpitää kirjautumisdataa.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Käynnistetään virtuaalikonetta</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Tulostus epäonnistui. Tarkista tulostin ja yritä uudelleen.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Salasanojen synkronointi ei toimi</translation> <translation id="1607139524282324606">Tyhjennä merkintä</translation> <translation id="1607499585984539560">Käyttäjä ei liity verkkotunnukseen</translation> <translation id="1608626060424371292">Poista tämä käyttäjä</translation> @@ -1771,6 +1769,7 @@ <translation id="2889064240420137087">Avaa linkki sovelluksessa...</translation> <translation id="2891922230654533301">Haluatko käyttää laitetta kirjautumiseen: <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Oletusselain</translation> +<translation id="2893180576842394309">Google voi muokata Hakua ja muita Googlen palveluita historiasi perusteella</translation> <translation id="2894757982205307093">Uusi välilehti ryhmässä</translation> <translation id="289695669188700754">Avaimen tunnus: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Tämä oma asetus poistetaan, kun suljet kaikki incognito-ikkunat</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">Varmista, että tämä on kelvollinen palveluntarjoaja, tai yritä myöhemmin uudelleen</translation> <translation id="3856800405688283469">Valitse aikavyöhyke</translation> <translation id="3857807444929313943">Nosta sormi ja kosketa uudelleen</translation> -<translation id="3860104611854310167">Synkronointi keskeytetty: <ph name="PROFILE_NAME" /></translation> <translation id="3861638017150647085">Käyttäjänimi <ph name="USERNAME" /> ei ole käytettävissä</translation> <translation id="3861977424605124250">Näytä käynnistettäessä</translation> <translation id="3862788408946266506">Sovellukset, joilla on luetteloattribuutti kiosk_only, täytyy asentaa Chrome-käyttöjärjestelmän kioskitilassa.</translation> @@ -3540,7 +3538,6 @@ <translation id="4881685975363383806">Älä muistuta seuraavalla kerralla</translation> <translation id="4881695831933465202">Avaa</translation> <translation id="4882312758060467256">Saa toimia tällä sivustolla</translation> -<translation id="4882831918239250449">Määritä, miten selaushistoria personoi hakua, mainoksia ja muita</translation> <translation id="4882919381756638075">Sivustot käyttävät mikrofonia yleensä kommunikaatio-ominaisuuksiin, kuten videopuheluihin</translation> <translation id="4883436287898674711">Kaikki verkkotunnuksen <ph name="WEBSITE_1" /> sivustot</translation> <translation id="48838266408104654">&Tehtävänhallinta</translation> @@ -4339,7 +4336,6 @@ <translation id="5794414402486823030">Avaa aina järjestelmän katselusovelluksella</translation> <translation id="5794700615121138172">Linuxin jaetut kansiot</translation> <translation id="5794786537412027208">Sulje kaikki Chrome-sovellukset</translation> -<translation id="5797070761912323120">Google voi muokata Hakua, mainoksia ja muita Googlen palveluita historiasi perusteella</translation> <translation id="5798079537501238810">Sivustot voivat asentaa maksunkäsittelijöitä</translation> <translation id="579907812742603813">suojattu sisältö</translation> <translation id="579915268381781820">Suojausavain poistettiin.</translation> @@ -4700,7 +4696,6 @@ <translation id="6208521041562685716">Mobiilidataa aktivoidaan</translation> <translation id="6209838773933913227">Päivitetään osaa</translation> <translation id="6209908325007204267">Laitteesi sisältää Chrome Enterprise ‑päivityksen, mutta käyttäjänimelläsi ei löydy Enterprise-tiliä. Luo Enterprise-tili siirtymällä osoitteeseen g.co/ChromeEnterpriseAccount toisella laitteella.</translation> -<translation id="6211495400987308581">Synkronointi ei toimi: <ph name="PROFILE_NAME" /></translation> <translation id="6212039847102026977">Näytä verkkoyhteyksien lisäasetukset</translation> <translation id="6212168817037875041">Sulje näyttö</translation> <translation id="6212752530110374741">Lähetä linkki sähköpostitse</translation> @@ -5789,6 +5784,7 @@ <translation id="7427348830195639090">Taustasivu: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Puhelu laitteesta <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">HID-laitteita ei löytynyt</translation> +<translation id="7431991332293347422">Määritä, miten selaushistoria personoi Hakua ja muita</translation> <translation id="7433708794692032816">Aseta älykortti, niin <ph name="DEVICE_TYPE" /> on taas käytettävissä</translation> <translation id="7433957986129316853">Säilytä</translation> <translation id="7434509671034404296">Kehittäjille</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 7118216..8364d43 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Para i-clear ang data sa pag-browse sa lahat ng iyong naka-sync na device at sa Google Account mo, <ph name="BEGIN_LINK" />bisitahin ang mga setting ng pag-sync<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&I-print...</translation> <translation id="1176471985365269981">Hindi pinapayagang mag-edit ng mga file o folder sa iyong device</translation> -<translation id="1177138678118607465">Maaaring gamitin ng Google ang iyong history ng pag-browse para i-personalize ang Paghahanap, mga ad, at iba pang serbisyo ng Google. Maaari mo itong baguhin anumang oras sa myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Custom</translation> <translation id="1178581264944972037">I-pause</translation> <translation id="117916940443676133">Hindi pinoprotektahan ng PIN ang iyong security key. Para pamahalaan ang data sa pag-sign in, gumawa muna ng PIN.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">Sinisimulan ang virtual machine</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Hindi ma-print. Suriin ang printer at subukan ulit.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Hindi gumagana ang pag-sync ng password</translation> <translation id="1607139524282324606">I-clear ang entry</translation> <translation id="1607499585984539560">Hindi affiliated ang user sa domain</translation> <translation id="1608626060424371292">Alisin ang user na ito</translation> @@ -1773,6 +1771,7 @@ <translation id="2889064240420137087">Buksan ang link gamit ang...</translation> <translation id="2891922230654533301">Gamitin ang iyong device para mag-sign in sa <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Default na browser</translation> +<translation id="2893180576842394309">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search at iba pang serbisyo ng Google</translation> <translation id="2894757982205307093">Bagong tab sa grupo</translation> <translation id="289695669188700754">Key ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Maaalis ang custom na setting na ito kapag isinara mo ang lahat ng iyong Incognito window</translation> @@ -2653,7 +2652,6 @@ <translation id="3856096718352044181">Paki-verify na valid na provider ito o subukan ulit sa ibang pagkakataon</translation> <translation id="3856800405688283469">Pumili ng timezone</translation> <translation id="3857807444929313943">Iangat, pagkatapos ay pindutin muli</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Na-pause ang pag-sync</translation> <translation id="3861638017150647085">Hindi available ang username na "<ph name="USERNAME" />"</translation> <translation id="3861977424605124250">Ipakita sa startup</translation> <translation id="3862788408946266506">Naka-install dapat sa kiosk mode ng Chrome OS ang app na may 'kiosk_only' na manifest attribute</translation> @@ -3545,7 +3543,6 @@ <translation id="4881685975363383806">Huwag nang ipaalala sa akin sa susunod</translation> <translation id="4881695831933465202">Buksan</translation> <translation id="4882312758060467256">May access sa site na ito</translation> -<translation id="4882831918239250449">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap, mga ad, at iba pa</translation> <translation id="4882919381756638075">Karaniwang ginagamit ng mga site ang iyong mikropono para sa mga feature sa pakikipag-ugnayan gaya ng pakikipag-video chat</translation> <translation id="4883436287898674711">Lahat ng site ng <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Task Manager</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">Palaging buksan gamit ang system viewer</translation> <translation id="5794700615121138172">Mga nakabahaging folder ng Linux</translation> <translation id="5794786537412027208">Umalis sa lahat ng Chrome Apps</translation> -<translation id="5797070761912323120">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation> <translation id="5798079537501238810">Puwedeng mag-install ang mga site ng mga tagapangasiwa ng pagbabayad</translation> <translation id="579907812742603813">pinoprotektahang content</translation> <translation id="579915268381781820">Inalis ang iyong security key.</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">Ina-activate ang mobile data</translation> <translation id="6209838773933913227">Ina-update ang bahagi</translation> <translation id="6209908325007204267">Kabilang sa iyong device ang isang Chrome Enterprise Upgrade, pero hindi nauugnay ang username mo sa isang enterprise account. Gumawa ng enterprise account sa pamamagitan ng pagbisita sa g.co/ChromeEnterpriseAccount sa pangalawang device.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Hindi gumagana ang pag-sync</translation> <translation id="6212039847102026977">Ipakita ang mga advanced na property ng network</translation> <translation id="6212168817037875041">I-off ang display</translation> <translation id="6212752530110374741">I-email ang Link</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090">Pahina ng Background: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Tawag mula sa <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Walang nakitang HID device</translation> +<translation id="7431991332293347422">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap at higit pa</translation> <translation id="7433708794692032816">Maglagay ng smart card para mapanatili ang iyong <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Panatilihin ito</translation> <translation id="7434509671034404296">Bumubuo</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 52bbb18..dcdc011 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Pour effacer les données de navigation de tous vos appareils synchronisés et de votre compte Google, <ph name="BEGIN_LINK" />accédez aux paramètres de synchronisation<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Im&primer...</translation> <translation id="1176471985365269981">Non autorisés à modifier les fichiers ni les dossiers qui se trouvent sur votre appareil</translation> -<translation id="1177138678118607465">Google peut utiliser votre historique de navigation pour personnaliser la recherche, les annonces et d'autres services Google. Vous pouvez modifier ce paramètre à tout moment sur la page myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personnalisé</translation> <translation id="1178581264944972037">Interrompre</translation> <translation id="117916940443676133">Votre clé de sécurité n'est pas protégée par un NIP. Pour gérer les données de connexion, commencez par créer un NIP.</translation> @@ -197,7 +196,7 @@ <translation id="120368089816228251">Note de musique</translation> <translation id="1203942045716040624">Traitement partagé : <ph name="SCRIPT_URL" /></translation> <translation id="1211769675100312947">Vous organisez les raccourcis vous-même</translation> -<translation id="1213254615020057352">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer l'expérience Android de votre enfant en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Ce paramètre est appliqué par le propriétaire du compte. C'est à lui de choisir d'envoyer ou non à Google les données de diagnostic et d'utilisation de cet appareil. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> +<translation id="1213254615020057352">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer l'expérience Android de votre enfant en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Ce paramètre est appliqué par le propriétaire du compte. C'est à lui de choisir d'envoyer ou non à Google les données de diagnostic et d'utilisation de cet appareil. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> <translation id="121384500095351701">Ce fichier ne peut pas être téléchargé de manière sécuritaire</translation> <translation id="1215411991991485844">Nouvelle application en arrière-plan ajoutée</translation> <translation id="1216542092748365687">Supprimer l'empreinte digitale</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">Démarrage de la machine virtuelle en cours…</translation> <translation id="1603914832182249871">(Mode privé)</translation> <translation id="1604432177629086300">Impossible d'imprimer le fichier. Vérifiez l'imprimante, puis réessayez.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" /> : la synchronisation des mots de passe ne fonctionne pas</translation> <translation id="1607139524282324606">Effacer l'entrée</translation> <translation id="1607499585984539560">L'utilisateur n'est pas affilié au domaine</translation> <translation id="1608626060424371292">Supprimer cet utilisateur</translation> @@ -1759,6 +1757,7 @@ <translation id="2889064240420137087">Ouvrir le lien avec...</translation> <translation id="2891922230654533301">Utiliser cet appareil pour vous connecter à <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navigateur par défaut</translation> +<translation id="2893180576842394309">Google peut utiliser votre historique pour personnaliser la recherche et d'autres services Google</translation> <translation id="2894757982205307093">Nouvel onglet dans le groupe</translation> <translation id="289695669188700754">Identifiant de la clé : <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ce paramètre personnalisé sera retiré lorsque vous fermerez toutes vos fenêtres de navigation privée</translation> @@ -1895,6 +1894,7 @@ <translation id="3027296729579831126">Activer la fonctionnalité Partage à proximité</translation> <translation id="3029466929721441205">Afficher les outils de stylet sur l'étagère</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> exige que vous téléchargiez une mise à jour aujourd'hui. La mise à jour sera automatiquement téléchargée lorsque vous vous connecterez à Internet.}one{<ph name="MANAGER" /> exige que vous téléchargiez une mise à jour avant l'échéance. La mise à jour sera automatiquement téléchargée lorsque vous vous connecterez à Internet.}other{<ph name="MANAGER" /> exige que vous téléchargiez une mise à jour avant l'échéance. La mise à jour sera automatiquement téléchargée lorsque vous vous connecterez à Internet.}}</translation> +<translation id="3030967311408872958">Du coucher au lever du soleil</translation> <translation id="3031417829280473749">Agente X</translation> <translation id="3031557471081358569">Sélectionnez les éléments à importer :</translation> <translation id="3036327949511794916">L'échéance pour retourner cet appareil <ph name="DEVICE_TYPE" /> est dépassée.</translation> @@ -2638,7 +2638,6 @@ <translation id="3856096718352044181">Veuillez vérifier qu'il s'agit d'un fournisseur valide ou réessayer plus tard</translation> <translation id="3856800405688283469">Sélectionner un fuseau horaire</translation> <translation id="3857807444929313943">Relever le doigt et toucher le capteur de nouveau</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" /> : synchronisation interrompue</translation> <translation id="3861638017150647085">Le nom d'utilisateur « <ph name="USERNAME" /> » n'est pas disponible</translation> <translation id="3861977424605124250">Afficher au démarrage</translation> <translation id="3862788408946266506">L'application dont le fichier de configuration comporte un attribut « kiosk_only » doit être installée en mode Kiosque pour Chrome OS</translation> @@ -3529,7 +3528,6 @@ <translation id="4881685975363383806">Ne pas me le rappeler la prochaine fois</translation> <translation id="4881695831933465202">Ouvrir</translation> <translation id="4882312758060467256">A accès à ce site</translation> -<translation id="4882831918239250449">Gérez la façon dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces et plus encore</translation> <translation id="4882919381756638075">Les sites utilisent généralement votre micro pour proposer des fonctionnalités de communication, comme le clavardage vidéo</translation> <translation id="4883436287898674711">Tous les sites <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Gestionnaire de &tâches</translation> @@ -3581,7 +3579,7 @@ <translation id="4925542575807923399">L'administrateur pour ce compte l'a configuré de sorte qu'il doit être le premier compte à connecter lors de sessions de connexion multicompte.</translation> <translation id="4927753642311223124">Aucune notification.</translation> <translation id="4929386379796360314">Destinations d'impression</translation> -<translation id="4930447554870711875">Concepteurs</translation> +<translation id="4930447554870711875">Développeurs</translation> <translation id="4930714375720679147">Activer</translation> <translation id="4932733599132424254">Date</translation> <translation id="4933484234309072027">Intégré à <ph name="URL" /></translation> @@ -3650,7 +3648,7 @@ <translation id="5017643436812738274">Vous pouvez parcourir les pages à l'aide d'un curseur de texte. Pour désactiver ce mode, appuyez sur Ctrl+Recherche+7.</translation> <translation id="5017828934289857214">Me le rappeler plus tard</translation> <translation id="5018207570537526145">Ouvrir le site Web pour les extensions</translation> -<translation id="5018526990965779848">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer votre expérience Android en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> +<translation id="5018526990965779848">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer votre expérience Android en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> <translation id="5021750053540820849">Pas encore mis à jour</translation> <translation id="5026492829171796515">Connectez-vous pour ajouter un compte Google</translation> <translation id="5026806129670917316">Activer le Wi-Fi</translation> @@ -3803,7 +3801,7 @@ <translation id="5192062846343383368">Ouvrez l'application Family Link pour afficher vos paramètres de supervision</translation> <translation id="5193988420012215838">Copié dans votre presse-papier</translation> <translation id="5197255632782567636">Internet</translation> -<translation id="5198430103906431024">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> +<translation id="5198430103906431024">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> <translation id="5199729219167945352">Fonctionnalités expérimentales</translation> <translation id="5203920255089865054">{NUM_EXTENSIONS,plural, =1{Cliquer pour afficher l'extension}one{Cliquer pour afficher cette extension}other{Cliquer pour afficher ces extensions}}</translation> <translation id="5204673965307125349">Veuillez effectuer un Powerwash sur l'appareil et réessayer.</translation> @@ -4076,6 +4074,7 @@ <translation id="5502500733115278303">Importés de Firefox</translation> <translation id="5502915260472117187">Un enfant</translation> <translation id="5503982651688210506">Continuer d'autoriser <ph name="HOST" /> à utiliser et à déplacer votre caméra et à utiliser votre microphone</translation> +<translation id="5504909642107847870">Vérification de la confidentialité et de la sécurité</translation> <translation id="5505264765875738116">Les sites ne peuvent pas vous demander l'autorisation d'envoyer des notifications</translation> <translation id="5505307013568720083">À court d'encre</translation> <translation id="5505794066310932198">Activer ou désactiver Commander</translation> @@ -4327,7 +4326,6 @@ <translation id="5794414402486823030">Toujours ouvrir avec System Viewer</translation> <translation id="5794700615121138172">Dossiers partagés Linux</translation> <translation id="5794786537412027208">Quitter toutes les applications Chrome</translation> -<translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> <translation id="5798079537501238810">Les sites peuvent installer des modules de traitement de paiement</translation> <translation id="579907812742603813">Contenu protégé</translation> <translation id="579915268381781820">Votre clé de sécurité a été retirée.</translation> @@ -4688,7 +4686,6 @@ <translation id="6208521041562685716">Activation des données cellulaires en cours…</translation> <translation id="6209838773933913227">Mise à jour des composants en cours…</translation> <translation id="6209908325007204267">Votre appareil comprend une mise à niveau de Chrome Enterprise, mais votre nom d'utilisateur n'est pas associé à un compte d'entreprise. Veuillez créer un compte d'entreprise en visitant g.co/ChromeEnterpriseAccount sur un autre appareil.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" /> : la synchronisation ne fonctionne pas</translation> <translation id="6212039847102026977">Afficher les propriétés de réseau avancées</translation> <translation id="6212168817037875041">Désactiver l'écran</translation> <translation id="6212752530110374741">Envoyer le lien par courriel</translation> @@ -4905,6 +4902,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> : recherche d'appareils Bluetooth</translation> <translation id="6445450263907939268">Si vous ne souhaitiez pas effectuer ces modifications, vous pouvez restaurer vos paramètres précédents.</translation> <translation id="6446213738085045933">Créer un raccourci sur le bureau</translation> +<translation id="6447210166804596538">Passer en revue les plus importants contrôles de confidentialité et de sécurité, tous regroupés au même endroit</translation> <translation id="6447842834002726250">Témoins</translation> <translation id="6450876761651513209">Modifier vos paramètres de confidentialité</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> et 1 autre onglet}one{<ph name="PAGE_TITLE" /> et # autre onglet}other{<ph name="PAGE_TITLE" /> et # autres onglets}}</translation> @@ -5265,7 +5263,7 @@ <translation id="6847125920277401289">Libérez de l'espace pour continuer</translation> <translation id="6848388270925200958">Pour le moment, certaines de vos cartes peuvent être utilisées uniquement sur cet appareil</translation> <translation id="6850286078059909152">Couleur du texte</translation> -<translation id="6851181413209322061">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Ce paramètre est appliqué par le propriétaire du compte. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> +<translation id="6851181413209322061">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Ce paramètre est appliqué par le propriétaire du compte. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> <translation id="6851497530878285708">Application activée</translation> <translation id="6853142139292753691">Restaurer les applications et les pages ouvertes par défaut?</translation> <translation id="6853388645642883916">L'outil de mise à jour est en veille</translation> @@ -5579,7 +5577,7 @@ <translation id="7203150201908454328">Agrandi</translation> <translation id="7206693748120342859">Téléchargement de <ph name="PLUGIN_NAME" /> en cours...</translation> <translation id="720715819012336933">{NUM_PAGES,plural, =1{Quitter la page}one{Quitter la page}other{Quitter les pages}}</translation> -<translation id="7207457272187520234">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Ce paramètre est appliqué par le propriétaire du compte. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> +<translation id="7207457272187520234">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Ce paramètre est appliqué par le propriétaire du compte. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> <translation id="7207631048330366454">Rechercher dans les applications</translation> <translation id="7210499381659830293">Imprimantes d'extension</translation> <translation id="7211769023302873228">Appuyez de nouveau sur la touche « <ph name="CURRENTKEY" /> » pour confirmer l'attribution et quitter.</translation> @@ -5776,6 +5774,7 @@ <translation id="7427348830195639090">Page en arrière-plan : <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Appel de <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Aucun appareil HID trouvé</translation> +<translation id="7431991332293347422">Gérez la façon dont votre historique de navigation est utilisé pour personnaliser, entre autres, la recherche</translation> <translation id="7433708794692032816">Insérez votre carte à puce pour continuer à utiliser votre <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Conserver</translation> <translation id="7434509671034404296">Concepteur</translation> @@ -6862,7 +6861,7 @@ <translation id="8637542770513281060">Votre ordinateur contient un module de sécurité, qui est utilisé pour mettre en œuvre de nombreuses fonctionnalités de sécurité cruciales dans Chrome OS. Visitez le Centre d'aide Google Chromebook pour en apprendre davantage : https://support.google.com/chromebook/?p=sm</translation> <translation id="8637688295594795546">Mise à jour du système possible. Préparation du téléchargement…</translation> <translation id="8639047128869322042">Recherche de logiciels nuisibles en cours…</translation> -<translation id="8639635302972078117">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> +<translation id="8639635302972078117">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> <translation id="8642900771896232685">2 secondes</translation> <translation id="8642947597466641025">Augmenter la taille du texte</translation> <translation id="8643443571868262066">Le fichier <ph name="FILE_NAME" /> pourrait être dangereux. Voulez-vous l'envoyer à la protection avancée de Google afin de le faire analyser?</translation> @@ -6885,6 +6884,7 @@ <translation id="8655972064210167941">La connexion a échoué, car votre mot de passe n'a pas pu être vérifié. Veuillez communiquer avec votre administrateur ou réessayer.</translation> <translation id="8657393004602556571">Voulez-vous supprimer les commentaires?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> partage votre écran et le son avec <ph name="TAB_NAME" />.</translation> +<translation id="8660073998956001352">Vos moteurs de recherche</translation> <translation id="8661290697478713397">Ouvrir le lien dans une fenêtre de navi&gation privée</translation> <translation id="8662671328352114214">Se joindre au réseau <ph name="TYPE" /></translation> <translation id="8662795692588422978">Personnes</translation> @@ -6967,7 +6967,7 @@ <translation id="8737914367566358838">Choisissez la langue dans laquelle traduire la page</translation> <translation id="8740247629089392745">Vous pouvez remettre ce Chromebook à <ph name="SUPERVISED_USER_NAME" />. La configuration est presque terminée. Après cela, c'est l'heure d'explorer.</translation> <translation id="8741944563400125534">Guide de configuration de Switch Access</translation> -<translation id="8742998548129056176">Il s'agit de données générales concernant votre appareil et l'usage que vous en faites (comme le niveau de la pile, l'activité système, l'activité des applications et les erreurs). Ces données seront utilisées pour améliorer Android, et certaines données collectées contribueront aussi à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android, à améliorer leurs applications et leurs produits.</translation> +<translation id="8742998548129056176">Il s'agit de données générales concernant votre appareil et l'usage que vous en faites (comme le niveau de la pile, l'activité système, l'activité des applications et les erreurs). Ces données seront utilisées pour améliorer Android, et certaines données collectées contribueront aussi à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android, à améliorer leurs applications et leurs produits.</translation> <translation id="8746654918629346731">Vous avez déjà demandé « <ph name="EXTENSION_NAME" /> »</translation> <translation id="874689135111202667">{0,plural, =1{Téléverser un fichier sur ce site?}one{Téléverser # fichier sur ce site?}other{Téléverser # fichiers sur ce site?}}</translation> <translation id="8749805710397399240">Impossible de diffuser votre écran. Vérifiez l'autorisation Enregistrement de l'écran dans les Préférences Système.</translation> @@ -7072,6 +7072,7 @@ <translation id="8845001906332463065">Obtenir de l'aide</translation> <translation id="8846132060409673887">Trouvez le fabricant et le modèle de cet ordinateur</translation> <translation id="8846163936679269230">Réinitialiser les profils eSIM</translation> +<translation id="8846746259444262774">Échec de l'installation</translation> <translation id="8847523528195140327">Se déconnecter lorsque le couvercle est fermé</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Caché</translation> @@ -7152,7 +7153,7 @@ <translation id="8929696694736010839">Session de navigation privée active seulement</translation> <translation id="8930351635855238750">Les nouveaux paramètres des témoins seront appliqués après l'actualisation de la page</translation> <translation id="8930622219860340959">Sans fil</translation> -<translation id="8931076093143205651">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer votre expérience Android en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Ce paramètre est appliqué par le propriétaire du compte. C'est à lui de choisir d'envoyer ou non à Google les données de diagnostic et d'utilisation de cet appareil. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> +<translation id="8931076093143205651">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer votre expérience Android en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Ce paramètre est appliqué par le propriétaire du compte. C'est à lui de choisir d'envoyer ou non à Google les données de diagnostic et d'utilisation de cet appareil. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google.</translation> <translation id="8931475688782629595">Gérer les données que vous synchronisez</translation> <translation id="8932654652795262306">Renseignements sur le partage de connexion instantané</translation> <translation id="8932894639908691771">Options de Switch Access</translation> @@ -7379,7 +7380,7 @@ <translation id="9170848237812810038">Ann&uler</translation> <translation id="9170884462774788842">Un autre programme sur votre ordinateur a ajouté un thème qui risque de modifier le fonctionnement de Google Chrome.</translation> <translation id="917350715406657904">Tu as atteint la durée limite que ton parent a définie pour <ph name="APP_NAME" />. Tu pourras l'utiliser de nouveau demain pendant <ph name="TIME_LIMIT" />.</translation> -<translation id="9174401638287877180">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer l'expérience Android de votre enfant en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> +<translation id="9174401638287877180">Envoyer les données d'utilisation et de diagnostic. Aidez-nous à améliorer l'expérience Android de votre enfant en envoyant automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. L'envoi de ces données ne sera pas utilisé pour identifier votre enfant, mais pour assurer la stabilité du système et des applications, et pour apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les développeurs Android. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé pour votre enfant, ces données peuvent être enregistrées dans son compte Google.</translation> <translation id="917510707618656279">Demander une autorisation lorsqu'un site veut accéder à des appareils Bluetooth</translation> <translation id="9176476835295860688">Envoyer les données d'utilisation et de diagnostic. Actuellement, cet appareil envoie automatiquement à Google des données de diagnostic, de l'appareil et d'utilisation des applications. Cela nous permettra d'assurer la stabilité du système et des applications, et d'apporter d'autres améliorations. Certaines données collectées contribueront également à améliorer les applications Google et aideront nos partenaires, comme les concepteurs Android. Ce <ph name="BEGIN_LINK1" />paramètre<ph name="END_LINK1" /> est appliqué par le propriétaire du compte. Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google. <ph name="BEGIN_LINK2" />En savoir plus<ph name="END_LINK2" /></translation> <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Appareil Bluetooth connecté</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 6374fc0e..7ae34219 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Pour effacer les données de navigation sur tous vos appareils synchronisés et dans votre compte Google, <ph name="BEGIN_LINK" />accédez aux paramètres de synchronisation<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Im&primer...</translation> <translation id="1176471985365269981">Non autorisés à modifier les fichiers ni les dossiers sur votre appareil</translation> -<translation id="1177138678118607465">Google peut utiliser votre historique de navigation pour personnaliser la recherche, les annonces et d'autres services Google. Vous pouvez modifier ce paramètre à tout moment sur la page myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personnalisé</translation> <translation id="1178581264944972037">Suspendre</translation> <translation id="117916940443676133">Votre clé de sécurité n'est pas protégée par un code. Pour gérer vos données de connexion, commencez par créer un code.</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">Démarrage de la machine virtuelle…</translation> <translation id="1603914832182249871">(Navigation privée)</translation> <translation id="1604432177629086300">Impression impossible. Veuillez vérifier l'imprimante et réessayer.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" /> : la synchronisation du mot de passe ne fonctionne pas</translation> <translation id="1607139524282324606">Effacer l'entrée</translation> <translation id="1607499585984539560">Utilisateur non affilié au domaine</translation> <translation id="1608626060424371292">Supprimer cet utilisateur</translation> @@ -1758,6 +1756,7 @@ <translation id="2889064240420137087">Ouvrir le lien avec...</translation> <translation id="2891922230654533301">Utiliser cet appareil pour vous connecter à <ph name="APP_NAME" /> ?</translation> <translation id="2893168226686371498">Navigateur par défaut</translation> +<translation id="2893180576842394309">Google peut utiliser votre historique pour personnaliser la recherche et d'autres services Google</translation> <translation id="2894757982205307093">Nouvel onglet dans le groupe</translation> <translation id="289695669188700754">ID de clé : <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ce paramètre personnalisé sera supprimé lorsque vous fermerez toutes les fenêtres de navigation privée</translation> @@ -2638,7 +2637,6 @@ <translation id="3856096718352044181">Veuillez vérifier qu'il s'agit d'un fournisseur valide ou réessayer plus tard</translation> <translation id="3856800405688283469">Sélectionner un fuseau horaire</translation> <translation id="3857807444929313943">Levez le doigt, puis reposez-le</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" /> : synchronisation en pause</translation> <translation id="3861638017150647085">Nom d'utilisateur "<ph name="USERNAME" />" non disponible</translation> <translation id="3861977424605124250">Afficher au démarrage</translation> <translation id="3862788408946266506">L'application dont le fichier manifeste comporte un attribut "kiosk_only" doit être installée en mode Kiosque pour Chrome OS</translation> @@ -3529,7 +3527,6 @@ <translation id="4881685975363383806">Ne pas afficher de rappel la prochaine fois</translation> <translation id="4881695831933465202">Ouvrir</translation> <translation id="4882312758060467256">A accès à ce site</translation> -<translation id="4882831918239250449">Contrôler la manière dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces, etc.</translation> <translation id="4882919381756638075">Les sites utilisent généralement votre micro pour proposer des fonctionnalités de communication, comme le chat vidéo</translation> <translation id="4883436287898674711">Tous les sites <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Gestionnaire de tâches</translation> @@ -4329,7 +4326,6 @@ <translation id="5794414402486823030">Toujours ouvrir avec le lecteur système</translation> <translation id="5794700615121138172">Dossiers partagés par Linux</translation> <translation id="5794786537412027208">Quitter toutes les applications Chrome</translation> -<translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> <translation id="5798079537501238810">Les sites peuvent installer des gestionnaires de paiement</translation> <translation id="579907812742603813">contenu protégé</translation> <translation id="579915268381781820">Votre clé de sécurité a été retirée.</translation> @@ -4690,7 +4686,6 @@ <translation id="6208521041562685716">Activation des données mobiles…</translation> <translation id="6209838773933913227">Mise à jour des composants…</translation> <translation id="6209908325007204267">Votre appareil bénéficie d'une licence Chrome Enterprise Upgrade, mais votre nom d'utilisateur n'est associé à aucun compte d'entreprise. Veuillez en créer un en accédant à g.co/ChromeEnterpriseAccount sur un autre appareil.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" /> : la synchronisation ne fonctionne pas</translation> <translation id="6212039847102026977">Afficher les propriétés de réseau avancées</translation> <translation id="6212168817037875041">Désactiver l'écran</translation> <translation id="6212752530110374741">Envoyer le lien par e-mail</translation> @@ -5779,6 +5774,7 @@ <translation id="7427348830195639090">Page en arrière-plan : <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Passer un appel avec <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Aucun appareil HID trouvé</translation> +<translation id="7431991332293347422">Contrôler la manière dont votre historique de navigation est utilisé pour personnaliser la recherche et plus encore</translation> <translation id="7433708794692032816">Insérez votre carte à puce pour continuer à utiliser votre <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Conserver</translation> <translation id="7434509671034404296">Options pour les développeurs</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 6bcd8bb..dbfc106 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Para borrar os datos de navegación de todos os dispositivos sincronizados e da túa Conta de Google, tes que <ph name="BEGIN_LINK" />acceder á configuración de sincronización<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Imprimir...</translation> <translation id="1176471985365269981">Sitios que non poden editar ficheiros nin cartafoles do teu dispositivo</translation> -<translation id="1177138678118607465">Google pode usar o teu historial de navegación para personalizar a Busca, os anuncios e outros servizos de Google. Podes cambiar esta opción en calquera momento en myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personalizada</translation> <translation id="1178581264944972037">Pausar</translation> <translation id="117916940443676133">A túa chave de seguranza non está protexida cun PIN. Para xestionar os datos de inicio de sesión, primeiro crea un PIN.</translation> @@ -551,7 +550,6 @@ <translation id="1602085790802918092">Iniciando máquina virtual</translation> <translation id="1603914832182249871">(Incógnito)</translation> <translation id="1604432177629086300">Non se puido imprimir. Comproba a impresora e téntao de novo.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: a sincronización de contrasinais non funciona</translation> <translation id="1607139524282324606">Borrar entrada</translation> <translation id="1607499585984539560">O usuario non está vinculado ao dominio</translation> <translation id="1608626060424371292">Eliminar este usuario</translation> @@ -1755,6 +1753,7 @@ <translation id="2889064240420137087">Abrir ligazón con...</translation> <translation id="2891922230654533301">Queres utilizar o teu dispositivo para iniciar sesión en <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador predeterminado</translation> +<translation id="2893180576842394309">Google pode utilizar o teu historial para personalizar a Busca e outros servizos de Google</translation> <translation id="2894757982205307093">Nova pestana no grupo</translation> <translation id="289695669188700754">ID da clave: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Esta opción de configuración personalizada quitarase cando peches todas as ventás do modo de incógnito</translation> @@ -1891,6 +1890,7 @@ <translation id="3027296729579831126">Activar a función Compartir por Nearby</translation> <translation id="3029466929721441205">Mostrar ferramentas do lapis óptico no estante</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> require que descargues unha actualización hoxe. Esta descargarase automaticamente cando te conectes a Internet.}other{<ph name="MANAGER" /> require que descargues unha actualización antes de que acabe o prazo. Esta descargarase automaticamente cando te conectes a Internet.}}</translation> +<translation id="3030967311408872958">Do solpor ao amencer</translation> <translation id="3031417829280473749">Axente X</translation> <translation id="3031557471081358569">Seleccionar elementos para importar:</translation> <translation id="3036327949511794916">Expirou o prazo para devolver este <ph name="DEVICE_TYPE" />.</translation> @@ -2634,7 +2634,6 @@ <translation id="3856096718352044181">Verifica que se trate dun fornecedor válido ou téntao de novo máis tarde.</translation> <translation id="3856800405688283469">Selecciona un fuso horario</translation> <translation id="3857807444929313943">Levanta o dedo e volve tocar o sensor</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: a sincronización está en pausa</translation> <translation id="3861638017150647085">O nome de usuario "<ph name="USERNAME" />" non está dispoñible</translation> <translation id="3861977424605124250">Mostrar ao inicio</translation> <translation id="3862788408946266506">É necesario instalar a aplicación co atributo de manifesto "kiosk_only" no modo de quiosco de Chrome OS</translation> @@ -3525,7 +3524,6 @@ <translation id="4881685975363383806">Non lembrar a próxima vez</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="4882312758060467256">Ten acceso a este sitio</translation> -<translation id="4882831918239250449">Controla como se utiliza o historial de navegación para personalizar a Busca, os anuncios e moito máis</translation> <translation id="4882919381756638075">Os sitios adoitan usar o micrófono para ofrecerche determinadas funcións relacionadas coa comunicación (por exemplo, chat de vídeo)</translation> <translation id="4883436287898674711">Todos os sitios de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Xes&tor de tarefas</translation> @@ -4072,6 +4070,7 @@ <translation id="5502500733115278303">Importados desde Firefox</translation> <translation id="5502915260472117187">Un neno ou nena</translation> <translation id="5503982651688210506">Seguir permitindo que <ph name="HOST" /> use e mova a túa cámara, e que use o teu micrófono</translation> +<translation id="5504909642107847870">Revisión de privacidade e seguranza</translation> <translation id="5505264765875738116">Os sitios non poden pedir permiso para enviar notificacións</translation> <translation id="5505307013568720083">Non hai tinta</translation> <translation id="5505794066310932198">Activar/desactivar comandante</translation> @@ -4323,7 +4322,6 @@ <translation id="5794414402486823030">Abrir sempre co visualizador do sistema</translation> <translation id="5794700615121138172">Cartafoles compartidos de Linux</translation> <translation id="5794786537412027208">Saír de todas as aplicacións de Chrome</translation> -<translation id="5797070761912323120">Google pode utilizar o teu historial para personalizar a Busca, os anuncios e outros servizos seus.</translation> <translation id="5798079537501238810">Os sitios poden instalar controladores de pago</translation> <translation id="579907812742603813">contido protexido</translation> <translation id="579915268381781820">Quitouse a túa chave de seguranza.</translation> @@ -4684,7 +4682,6 @@ <translation id="6208521041562685716">Estanse activando os datos móbiles</translation> <translation id="6209838773933913227">Actualización de compoñentes</translation> <translation id="6209908325007204267">O teu dispositivo inclúe unha licenza de Chrome Enterprise, pero o teu nome de usuario non está asociado a unha conta de empresa. Crea unha conta de empresa visitando g.co/ChromeEnterpriseAccount desde un dispositivo secundario.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: a sincronización non funciona</translation> <translation id="6212039847102026977">Mostrar propiedades de rede avanzadas</translation> <translation id="6212168817037875041">Desactivar a pantalla</translation> <translation id="6212752530110374741">Ligazón de correo electrónico</translation> @@ -4901,6 +4898,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" />; busca de dispositivos Bluetooth activa</translation> <translation id="6445450263907939268">Se non querías realizar estes cambios, podes restaurar a túa configuración anterior.</translation> <translation id="6446213738085045933">Crear acceso directo do escritorio</translation> +<translation id="6447210166804596538">Revisa desde un único lugar os controis de privacidade e seguranza máis importantes</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6450876761651513209">Cambia a túa configuración relacionada coa privacidade</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> e 1 pestana máis}other{<ph name="PAGE_TITLE" /> e # pestanas máis}}</translation> @@ -5772,6 +5770,7 @@ <translation id="7427348830195639090">Páxina en segundo plano: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Chamada de <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Non se encontraron dispositivos de interface humana</translation> +<translation id="7431991332293347422">Controla como se utiliza o historial de navegación para personalizar a Busca e moito máis</translation> <translation id="7433708794692032816">Para seguir usando o teu dispositivo (<ph name="DEVICE_TYPE" />), insire a tarxeta intelixente</translation> <translation id="7433957986129316853">Conservar cambios</translation> <translation id="7434509671034404296">Programador</translation> @@ -6880,6 +6879,7 @@ <translation id="8655972064210167941">Produciuse un erro no inicio de sesión porque o teu contrasinal non se puido verificar. Contacta co administrador ou téntao de novo.</translation> <translation id="8657393004602556571">Queres descartar o comentario?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> está compartindo a túa pantalla e o teu audio con <ph name="TAB_NAME" />.</translation> +<translation id="8660073998956001352">Os teus motores de busca</translation> <translation id="8661290697478713397">Abrir ligazón na ventá de incó&gnito</translation> <translation id="8662671328352114214">Unirse á rede <ph name="TYPE" /></translation> <translation id="8662795692588422978">Persoas</translation> @@ -7066,6 +7066,7 @@ <translation id="8845001906332463065">Obter axuda</translation> <translation id="8846132060409673887">Consultar o fabricante e o modelo deste ordenador</translation> <translation id="8846163936679269230">Restablecer perfís de eSIM</translation> +<translation id="8846746259444262774">Produciuse un erro durante a instalación</translation> <translation id="8847523528195140327">Pechar sesión cando se peche a tapa</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Oculto</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index b6526b80..25862bb0 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">તમારા બધા સિંક કરેલા ડિવાઇસ અને તમારા Google એકાઉન્ટમાંથી બ્રાઉઝિંગ ડેટા સાફ કરવા માટે, <ph name="BEGIN_LINK" />સિંક સેટિંગની મુલાકાત લો<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&છાપો...</translation> <translation id="1176471985365269981">તમારા ડિવાઇસમાંની ફાઇલોમાં કે ફોલ્ડરોમાં ફેરફાર કરવાની મંજૂરી નથી</translation> -<translation id="1177138678118607465">શોધ અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે, Google તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરી શકે છે. તમે આને myaccount.google.com/activitycontrols/search પર બદલી શકો છો</translation> <translation id="1177863135347784049">કસ્ટમ</translation> <translation id="1178581264944972037">થોભો</translation> <translation id="117916940443676133">તમારી સુરક્ષા કી પિન વડે સુરક્ષિત નથી. સાઇન-ઇન ડેટા મેનેજ કરવા માટે, પહેલાં પિન બનાવો.</translation> @@ -549,7 +548,6 @@ <translation id="1602085790802918092">વર્ચ્યુઅલ મશીન શરૂ કરી રહ્યાં છીએ</translation> <translation id="1603914832182249871">(છૂપી)</translation> <translation id="1604432177629086300">પ્રિન્ટ કરી શક્યાં નથી. પ્રિન્ટર ચેક કરો અને ફરી પ્રયાસ કરો.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: પાસવર્ડ સિંક કાર્ય કરતું નથી</translation> <translation id="1607139524282324606">એન્ટ્રી સાફ કરો</translation> <translation id="1607499585984539560">વપરાશકર્તા આ ડોમેન સાથે સંકળાયેલા નથી</translation> <translation id="1608626060424371292">આ વપરાશકર્તાને દૂર કરો</translation> @@ -1755,6 +1753,7 @@ <translation id="2889064240420137087">આની સાથે લિંક ખોલો...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" />માં સાઇન ઇન કરવા માટે તમારા ડિવાઇસનો ઉપયોગ કરીએ?</translation> <translation id="2893168226686371498">ડિફૉલ્ટ બ્રાઉઝર</translation> +<translation id="2893180576842394309">Google, શોધ અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા ઇતિહાસનો ઉપયોગ કરી શકે છે</translation> <translation id="2894757982205307093">ગ્રૂપમાં નવું ટૅબ</translation> <translation id="289695669188700754">કી ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">જ્યારે તમે તમારી બધી છુપી વિન્ડો બંધ કરશો, ત્યારે આ કસ્ટમ સેટિંગ કાઢી નાખવામાં આવશે</translation> @@ -2634,7 +2633,6 @@ <translation id="3856096718352044181">કૃપા કરીને ચકાસણી કરો કે આ માન્ય પ્રદાતા છે અથવા પછીથી ફરી પ્રયાસ કરો</translation> <translation id="3856800405688283469">સમયઝોન પસંદ કરો</translation> <translation id="3857807444929313943">ઉપાડો, પછી ફરી સ્પર્શ કરો</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: સિંક થોભાવ્યું</translation> <translation id="3861638017150647085">વપરાશકર્તાનું "<ph name="USERNAME" />" નામ ઉપલબ્ધ નથી</translation> <translation id="3861977424605124250">સ્ટાર્ટઅપ કરતી વખતે બતાવો</translation> <translation id="3862788408946266506">'Kiosk_only' મેનિફેસ્ટ વિશેષતાવાળી ઍપ Chrome OS કિઓસ્ક મોડમાં ઇન્સ્ટૉલ કરેલી હોવી જરૂરી છે</translation> @@ -3525,7 +3523,6 @@ <translation id="4881685975363383806">આગલી વખતે મને યાદ કરાવશો નહીં</translation> <translation id="4881695831933465202">ખોલો</translation> <translation id="4882312758060467256">આ સાઇટનો ઍક્સેસ ધરાવે છે</translation> -<translation id="4882831918239250449">તમારા બ્રાઉઝિંગ ઇતિહાસને શોધ, જાહેરાતો અને વધુ સુવિધાને વ્યક્તિગત કરવા માટે કેવી રીતે ઉપયોગમાં લેવાય તેને નિયંત્રિત કરો</translation> <translation id="4882919381756638075">વીડિયો ચૅટ કરવા જેવી સંદેશાવ્યવહારની સુવિધા માટે, સાઇટ સામાન્ય રીતે તમારા માઇક્રોફોનનો ઉપયોગ કરે છે</translation> <translation id="4883436287898674711">તમામ <ph name="WEBSITE_1" /> સાઇટ્સ</translation> <translation id="48838266408104654">&કાર્ય વ્યવસ્થાપક</translation> @@ -4324,7 +4321,6 @@ <translation id="5794414402486823030">હંમેશા સિસ્ટમ દર્શક સાથે ખોલો</translation> <translation id="5794700615121138172">Linuxએ શેર કરેલા ફોલ્ડરો</translation> <translation id="5794786537412027208">બધી Chrome એપ્લિકેશન્સને છોડી દો</translation> -<translation id="5797070761912323120">Google, શોધ, જાહેરાતો અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા ઇતિહાસનો ઉપયોગ કરી શકે છે</translation> <translation id="5798079537501238810">સાઇટ ચુકવણી હૅન્ડલર ઇન્સ્ટૉલ કરી શકે છે</translation> <translation id="579907812742603813">સુરક્ષિત કન્ટેન્ટ</translation> <translation id="579915268381781820">તમારો સુરક્ષા કોડ કાઢી નાખવામાં આવ્યો હતો.</translation> @@ -4686,7 +4682,6 @@ <translation id="6208521041562685716">મોબાઇલ ડેટા સક્રિય કરવામાં આવી રહ્યો છે</translation> <translation id="6209838773933913227">ઘટકો અપડેટ થઈ રહ્યાં છે</translation> <translation id="6209908325007204267">તમારા ડિવાઇસ માટે Chrome એન્ટરપ્રાઇઝ અપગ્રેડ શામેલ છે, પરંતુ તમારું વપરાશકર્તાનું નામ કોઈ એન્ટરપ્રાઇઝ એકાઉન્ટ સાથે સંકળાયેલું નથી. કૃપા કરીને કોઈ ગૌણ ડિવાઇસ પર g.co/ChromeEnterpriseAccountની મુલાકાત લઈને એક એન્ટરપ્રાઇઝ એકાઉન્ટ બનાવો.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: સિંક કાર્ય કરી રહ્યું નથી</translation> <translation id="6212039847102026977">વિગતવાર નેટવર્ક ગુણધર્મો બતાવો</translation> <translation id="6212168817037875041">ડિસ્પ્લે બંધ કરો</translation> <translation id="6212752530110374741">લિંક ઇમેઇલ કરો</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">પૃષ્ઠભૂમિ પૃષ્ઠ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> તરફથી કૉલ</translation> <translation id="7431719494109538750">કોઈ HID ડિવાઇસ મળ્યું નથી</translation> +<translation id="7431991332293347422">શોધ અને અન્ય બાબતોને તમને મનગમતી બનાવવા માટે તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરવાની રીત નિયંત્રિત કરો</translation> <translation id="7433708794692032816">તમારા <ph name="DEVICE_TYPE" />નો ઉપયોગ ચાલુ રાખવા માટે સ્માર્ટ કાર્ડ દાખલ કરો</translation> <translation id="7433957986129316853">આ જ રાખો</translation> <translation id="7434509671034404296">વિકાસકર્તા</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index e3390b8..3256095 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">अपने सभी सिंक किए हुए डिवाइस और अपने 'Google खाते' से ब्राउज़िंग डेटा साफ़ करने के लिए, <ph name="BEGIN_LINK" />सिंक सेटिंग पर जाएं<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&प्रिंट करें...</translation> <translation id="1176471985365269981">आपके डिवाइस पर फ़ाइलों या फ़ोल्डर में बदलाव करने की अनुमति नहीं है</translation> -<translation id="1177138678118607465">खोज विज्ञापन और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए Google आपके ब्राउज़िंग इतिहास का इस्तेमाल कर सकता है. आप myaccount.google.com/activitycontrols/search में इसे कभी भी बदल सकते हैं</translation> <translation id="1177863135347784049">कस्टम</translation> <translation id="1178581264944972037">रोकें</translation> <translation id="117916940443676133">आपकी सुरक्षा कुंजी को पिन से सुरक्षित नहीं किया गया है. साइन इन करने के लिए डेटा प्रबंधित करने के लिए, पहले पिन बनाएं.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">वर्चुअल मशीन शुरू हो रही है</translation> <translation id="1603914832182249871">(गुप्त)</translation> <translation id="1604432177629086300">प्रिंट नहीं किया जा सका. प्रिंटर की जांच करें और फिर से कोशिश करें</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: पासवर्ड को सिंक करने की सुविधा काम नहीं कर रही</translation> <translation id="1607139524282324606">प्रविष्टि हटाएं</translation> <translation id="1607499585984539560">उपयोगकर्ता, एंटरप्राइज़ डोमेन के साथ जुड़ा हुआ नहीं है</translation> <translation id="1608626060424371292">इस उपयोगकर्ता को हटाएं</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">इनके साथ लिंक खोलें...</translation> <translation id="2891922230654533301">क्या आप <ph name="APP_NAME" /> में साइन इन करने के लिए अपना डिवाइस इस्तेमाल करना चाहते हैं?</translation> <translation id="2893168226686371498">सामान्य ब्राउज़र</translation> +<translation id="2893180576842394309">खोज और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता है</translation> <translation id="2894757982205307093">ग्रुप में नया टैब जोड़ें</translation> <translation id="289695669188700754">कुंजी ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">इस कस्टम सेटिंग को तब हटाया जाएगा, जब आप अपने सभी गुप्त विंडो बंद करेंगे</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">कृपया पुष्टि करें कि यह एक मान्य डीएनएस सेवा है या थोड़ी देर बाद कोशिश करें</translation> <translation id="3856800405688283469">समय क्षेत्र चुनें</translation> <translation id="3857807444929313943">उठाएं, फिर दोबारा छुएं</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: सिंक करना रोका गया</translation> <translation id="3861638017150647085">उपयोगकर्ता नाम "<ph name="USERNAME" />" उपलब्ध नहीं है</translation> <translation id="3861977424605124250">शुरुआती पेज पर दिखाएं</translation> <translation id="3862788408946266506">'kiosk_only' मेनिफ़ेस्ट विशेषता वाला ऐप्लिकेशन Chrome OS कियोस्क मोड में इंस्टॉल किया जाना चाहिए</translation> @@ -3543,7 +3541,6 @@ <translation id="4881685975363383806">मुझे फिर से याद न दिलाएं</translation> <translation id="4881695831933465202">खोलें</translation> <translation id="4882312758060467256">इस साइट का ऐक्सेस है</translation> -<translation id="4882831918239250449">यह नियंत्रित करें कि खोज, विज्ञापनों वगैरह को मनमुताबिक बनाने के लिए आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे किया जाए</translation> <translation id="4882919381756638075">आम तौर पर, साइटें, वीडियो चैटिंग जैसी कम्यूनिकेशन सुविधाओं के लिए, आपके माइक्रोफ़ोन का इस्तेमाल करती हैं</translation> <translation id="4883436287898674711">सभी <ph name="WEBSITE_1" /> साइटें</translation> <translation id="48838266408104654">&कार्य मैनेजर</translation> @@ -4342,7 +4339,6 @@ <translation id="5794414402486823030">हमेशा सिस्टम व्यूअर से खोलें</translation> <translation id="5794700615121138172">Linux से Chromebook के साथ शेयर किए गए फ़ोल्डर</translation> <translation id="5794786537412027208">सभी Chrome Apps से बाहर निकलें</translation> -<translation id="5797070761912323120">खोज, विज्ञापन, और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता है</translation> <translation id="5798079537501238810">साइटें पेमेंट हैंडलर इंस्टॉल कर सकती हैं</translation> <translation id="579907812742603813">सुरक्षित कॉन्टेंट</translation> <translation id="579915268381781820">आपकी सुरक्षा कुंजी हटा दी गई.</translation> @@ -4703,7 +4699,6 @@ <translation id="6208521041562685716">मोबाइल डेटा चालू किया जा रहा है</translation> <translation id="6209838773933913227">कॉम्पोनेंट अपडेट हो रहा है</translation> <translation id="6209908325007204267">आपके डिवाइस में Chrome Enterprise Upgrade शामिल है, लेकिन आपका उपयोगकर्ता नाम किसी Enterprise खाते से जुड़ा हुआ नहीं है. कृपया किसी दूसरे डिवाइस से g.co/ChromeEnterpriseAccount पर जाकर एक Enterprise खाता बनाएं.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: सिंक सुविधा काम नहीं कर रही है</translation> <translation id="6212039847102026977">बेहतर नेटवर्क प्रॉपर्टी दिखाएं</translation> <translation id="6212168817037875041">डिसप्ले बंद करें</translation> <translation id="6212752530110374741">लिंक ईमेल करें</translation> @@ -5792,6 +5787,7 @@ <translation id="7427348830195639090">पेजभूमि पेज: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> से कॉल करें</translation> <translation id="7431719494109538750">कोई भी एचआईडी डिवाइस नहीं मिला</translation> +<translation id="7431991332293347422">यह नियंत्रित करें कि खोज वगैरह को मनमुताबिक बनाने के लिए आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे किया जाए</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> का इस्तेमाल जारी रखने के लिए स्मार्ट कार्ड डालें</translation> <translation id="7433957986129316853">इसे बनाए रखें</translation> <translation id="7434509671034404296">डेवलपर</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 6f0b25e..0d94192 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Da biste izbrisali podatke o pregledavanju sa svih svojih sinkroniziranih uređaja i svojeg Google računa, <ph name="BEGIN_LINK" />otvorite postavke sinkronizacije<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Ispis...</translation> <translation id="1176471985365269981">Nije dopušteno uređivanje datoteka ili mapa na uređaju</translation> -<translation id="1177138678118607465">Google može upotrebljavati vašu povijest pregledavanja za prilagodbu pretraživanja, oglasa i drugih Googleovih usluga. To možete promijeniti u bilo kojem trenutku na stranici myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Prilagođeno</translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="117916940443676133">Vaš sigurnosni ključ nije zaštićen PIN-om. Za upravljanje podacima za prijavu prvo izradite PIN.</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">Pokretanje virtualnog računala</translation> <translation id="1603914832182249871">(Anonimno)</translation> <translation id="1604432177629086300">Ispis nije uspio. Provjerite pisač i pokušajte ponovo.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: sinkronizacija zaporki ne radi</translation> <translation id="1607139524282324606">Brisanje unosa</translation> <translation id="1607499585984539560">Korisnik nije povezan s domenom</translation> <translation id="1608626060424371292">Ukloni tog korisnika</translation> @@ -1759,6 +1757,7 @@ <translation id="2889064240420137087">Otvori vezu sa...</translation> <translation id="2891922230654533301">Upotrijebiti uređaj za prijavljivanje na <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Zadani preglednik</translation> +<translation id="2893180576842394309">Google može upotrebljavati vašu povijest za prilagodbu Pretraživanja i drugih Googleovih usluga</translation> <translation id="2894757982205307093">Nova kartica u grupi</translation> <translation id="289695669188700754">ID ključa: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ta će se prilagođena postavka ukloniti kad zatvorite sve anonimne prozore</translation> @@ -2639,7 +2638,6 @@ <translation id="3856096718352044181">Potvrdite da je to valjani davatelj ili pokušajte ponovo kasnije</translation> <translation id="3856800405688283469">Odaberite vremensku zonu</translation> <translation id="3857807444929313943">Podignite i ponovo dodirnite</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinkronizacija je pauzirana</translation> <translation id="3861638017150647085">Korisničko ime "<ph name="USERNAME" />" nije dostupno</translation> <translation id="3861977424605124250">Prikaži prilikom pokretanja</translation> <translation id="3862788408946266506">Aplikaciju s atributom manifesta "kiosk_only" potrebno je instalirati u načinu kioska OS-a Chrome</translation> @@ -3530,7 +3528,6 @@ <translation id="4881685975363383806">Nemoj me podsjećati sljedeći put</translation> <translation id="4881695831933465202">Otvori</translation> <translation id="4882312758060467256">Ima pristup ovoj web-lokaciji</translation> -<translation id="4882831918239250449">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja, oglasa i drugog</translation> <translation id="4882919381756638075">Web-lokacije obično upotrebljavaju mikrofon za komunikacijske značajke poput videochata</translation> <translation id="4883436287898674711">Sve web-lokacije <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Upravitelj zadataka</translation> @@ -4329,7 +4326,6 @@ <translation id="5794414402486823030">Uvijek otvori u pregledniku sustava</translation> <translation id="5794700615121138172">Linuxove dijeljene mape</translation> <translation id="5794786537412027208">Zatvori sve Chromeove aplikacije</translation> -<translation id="5797070761912323120">Google može upotrebljavati vašu povijest za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga</translation> <translation id="5798079537501238810">Web-lokacije mogu instalirati rukovatelje plaćanjem</translation> <translation id="579907812742603813">zaštićeni sadržaj</translation> <translation id="579915268381781820">Vaš je sigurnosni ključ uklonjen.</translation> @@ -4690,7 +4686,6 @@ <translation id="6208521041562685716">U tijeku je aktivacija mobilnih podataka</translation> <translation id="6209838773933913227">Ažuriranje komponenti</translation> <translation id="6209908325007204267">Vaš uređaj uključuje Nadogradnju za Chrome za poduzeća, no vaše korisničko ime nije povezano s računom tvrtke. Da biste izradili račun tvrtke, otvorite stranicu g.co/ChromeEnterpriseAccount na drugom uređaju.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinkronizacija ne funkcionira</translation> <translation id="6212039847102026977">Prikaži napredna svojstva mreže</translation> <translation id="6212168817037875041">Isključi zaslon</translation> <translation id="6212752530110374741">Vezu pošalji e-poštom</translation> @@ -5779,6 +5774,7 @@ <translation id="7427348830195639090">Pozadinska stranica: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Nazovite s uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nije pronađen nijedan HID uređaj</translation> +<translation id="7431991332293347422">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja i drugih značajki</translation> <translation id="7433708794692032816">Umetnite pametnu karticu da biste nastavili upotrebljavati uređaj <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Zadrži</translation> <translation id="7434509671034404296">Razvojni programer</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index b40c3f20..b9e790ba 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Ha az összes szinkronizált eszközéről és a Google-fiókjából is törölni szeretné böngészési adatait, <ph name="BEGIN_LINK" />keresse fel a szinkronizálási beállításokat<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Nyomtatás...</translation> <translation id="1176471985365269981">Nem szerkeszthetik az Ön eszközén található fájlokat és mappákat</translation> -<translation id="1177138678118607465">A Google felhasználhatja a keresési előzményeket a Keresés és más Google-szolgáltatások személyre szabására. Ezt bármikor módosíthatja a myaccount.google.com/activitycontrols/search címen.</translation> <translation id="1177863135347784049">Egyéni</translation> <translation id="1178581264944972037">Szünet</translation> <translation id="117916940443676133">Biztonsági hardverkulcsát nem védi PIN-kód. A bejelentkezési adatok kezeléséhez előbb hozzon létre PIN-kódot.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">A virtuális gép indítása</translation> <translation id="1603914832182249871">(Inkognitó mód)</translation> <translation id="1604432177629086300">Nem sikerült nyomtatni. Ellenőrizze a nyomtatót, és próbálja újra.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Nem működik a jelszavak szinkronizálása</translation> <translation id="1607139524282324606">Bejegyzés törlése</translation> <translation id="1607499585984539560">A felhasználó nem tartozik domainhez</translation> <translation id="1608626060424371292">Felhasználó eltávolítása</translation> @@ -1770,6 +1768,7 @@ <translation id="2889064240420137087">Link megnyitása...</translation> <translation id="2891922230654533301">Szeretne az eszközével bejelentkezni a(z) <ph name="APP_NAME" /> alkalmazásba?</translation> <translation id="2893168226686371498">Alapértelmezett böngésző</translation> +<translation id="2893180576842394309">A Google felhasználhatja az Ön előzményeit a Kereső és más Google-szolgáltatások személyre szabására</translation> <translation id="2894757982205307093">Új lap a csoportban</translation> <translation id="289695669188700754">Kulcsazonosító: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ez az egyéni beállítás el lesz távolítva, amikor bezárja az összes inkognitó ablakot.</translation> @@ -2650,7 +2649,6 @@ <translation id="3856096718352044181">Ellenőrizze a szolgáltató érvényességét, vagy próbálkozzon újra.</translation> <translation id="3856800405688283469">Időzóna kiválasztása</translation> <translation id="3857807444929313943">Emelje fel, majd érintse újra</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: a szinkronizálás szünetel</translation> <translation id="3861638017150647085">A(z) „<ph name="USERNAME" />” felhasználónév nem áll rendelkezésre</translation> <translation id="3861977424605124250">Megjelenítés indításkor</translation> <translation id="3862788408946266506">A „kiosk_only” jegyzékattribútummal rendelkező alkalmazást kioszk módban kell telepíteni a Chrome OS rendszeren</translation> @@ -3541,7 +3539,6 @@ <translation id="4881685975363383806">Ne emlékeztessen többször</translation> <translation id="4881695831933465202">Megnyitás</translation> <translation id="4882312758060467256">Hozzáfér ehhez a webhelyhez</translation> -<translation id="4882831918239250449">Beállíthatja, hogy a rendszer hogyan szabja személyre a Keresést, a hirdetéseket és egyebeket a böngészési előzmények alapján</translation> <translation id="4882919381756638075">A webhelyek általában kommunikációs szolgáltatások (például videocsevegés) biztosítása érdekében férnek hozzá a mikrofonhoz</translation> <translation id="4883436287898674711">Minden <ph name="WEBSITE_1" /> webhelyen</translation> <translation id="48838266408104654">&Feladatkezelő</translation> @@ -4342,7 +4339,6 @@ <translation id="5794414402486823030">Megnyitás mindig a rendszer megtekintőjével</translation> <translation id="5794700615121138172">Megosztott Linux-mappák</translation> <translation id="5794786537412027208">Összes Chrome-alkalmazás bezárása</translation> -<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására</translation> <translation id="5798079537501238810">A webhelyek telepíthetik a fizetéskezelőket</translation> <translation id="579907812742603813">védett tartalmak</translation> <translation id="579915268381781820">Eltávolította a biztonsági hardverkulcsot.</translation> @@ -4703,7 +4699,6 @@ <translation id="6208521041562685716">Mobiladatok aktiválása…</translation> <translation id="6209838773933913227">Az összetevő frissítése folyamatban van</translation> <translation id="6209908325007204267">Eszközéhez Chrome Enterprise Upgrade licenc tartozik, de a felhasználóneve nincs vállalati fiókhoz társítva. Hozzon létre vállalati fiókot másodlagos eszközén a g.co/ChromeEnterpriseAccount címen.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: A szinkronizálás nem működik</translation> <translation id="6212039847102026977">Speciális hálózati tulajdonságok megjelenítése</translation> <translation id="6212168817037875041">A kijelző kikapcsol</translation> <translation id="6212752530110374741">Link küldése e-mailben</translation> @@ -5792,6 +5787,7 @@ <translation id="7427348830195639090">Háttéroldal: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Hívás a következőtől: <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nem találhatók HID-eszközök</translation> +<translation id="7431991332293347422">Beállíthatja, hogy a rendszer hogyan szabja személyre a Keresést és egyebeket a böngészési előzmények alapján</translation> <translation id="7433708794692032816">Helyezze be az intelligens kártyát, hogy tovább használhassa <ph name="DEVICE_TYPE" /> eszközét</translation> <translation id="7433957986129316853">Megtartom</translation> <translation id="7434509671034404296">Fejlesztőknek</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 98766b8..418a835 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Այցելությունների պատմությունը բոլոր համաժամացված սարքերից և Google հաշվից ջնջելու համար <ph name="BEGIN_LINK" />անցեք համաժամացման կարգավորումներ<ph name="END_LINK" />:</translation> <translation id="1175364870820465910">&Տպել…</translation> <translation id="1176471985365269981">Չի թույլատրվում ձեր սարքում խմբագրել ֆայլեր և պանակներ</translation> -<translation id="1177138678118607465">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել Որոնումն ու Google-ի այլ ծառայություններն անհատականացնելու համար: Այդ գործառույթը կարող եք կառավարել myaccount.google.com էջում:</translation> <translation id="1177863135347784049">Անհատականացված</translation> <translation id="1178581264944972037">Դադար</translation> <translation id="117916940443676133">Անվտանգության բանալին պաշտպանված չէ PIN-ով: Մուտքի տվյալները կառավարելու համար նախ ստեղծեք PIN կոդ:</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Վիրտուալ մեքենան գործարկվում է</translation> <translation id="1603914832182249871">(Ինկոգնիտո)</translation> <translation id="1604432177629086300">Չհաջողվեց տպել: Ստուգեք տպիչը և նորից փորձեք:</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />՝ գաղտնաբառերի համաժամացումը չի աշխատում</translation> <translation id="1607139524282324606">Մաքրել հաղորդագրությունը</translation> <translation id="1607499585984539560">Օգտատերը կապված չէ տիրույթի հետ</translation> <translation id="1608626060424371292">Հեռացնել այս պրոֆիլը</translation> @@ -1758,6 +1756,7 @@ <translation id="2889064240420137087">Բացել հղումը` օգտագործելով…</translation> <translation id="2891922230654533301">Օգտագործե՞լ ձեր սարքը՝ <ph name="APP_NAME" /> հավելվածում հաշիվ մտնելու համար</translation> <translation id="2893168226686371498">Կանխադրված դիտարկիչ</translation> +<translation id="2893180576842394309">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել` Որոնումն ու Google-ի մյուս ծառայություններն անհատականացնելու համար:</translation> <translation id="2894757982205307093">Նոր ներդիր խմբում</translation> <translation id="289695669188700754">Բանալու ID` <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Այս հատուկ կարգավորումը կհեռացվի, երբ դուք փակեք ձեր բոլոր ինկոգնիտո պատուհանները</translation> @@ -2638,7 +2637,6 @@ <translation id="3856096718352044181">Հաստատեք, որ սա վավեր մատակարար է կամ նորից փորձեք</translation> <translation id="3856800405688283469">Ընտրեք ժամային գոտին</translation> <translation id="3857807444929313943">Բարձրացրեք մատը և նորից փորձեք</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />․ համաժամացումը դադարեցված է</translation> <translation id="3861638017150647085">«<ph name="USERNAME" />» օգտանունը հասանելի չէ</translation> <translation id="3861977424605124250">Ցույց տալ գործարկման ժամանակ</translation> <translation id="3862788408946266506">«Kiosk_only» մանիֆեստի հատկանիշով հավելվածը պետք է տեղադրվի Chrome OS-ի կրպակի ռեժիմում</translation> @@ -3530,7 +3528,6 @@ <translation id="4881685975363383806">Այլևս չհիշեցնել</translation> <translation id="4881695831933465202">Բացել</translation> <translation id="4882312758060467256">Այս կայքը հասանելի է ընդլայնմանը</translation> -<translation id="4882831918239250449">Կառավարեք ձեր այցելությունների պատմության օգտագործումը՝ Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> <translation id="4882919381756638075">Կայքերը սովորաբար խոսափողն օգտագործում են հաղորդակցման գործառույթների, օրինակ՝ տեսազրույցների համար</translation> <translation id="4883436287898674711">Բոլոր <ph name="WEBSITE_1" /> կայքերը</translation> <translation id="48838266408104654">&Խնդիրների կառավարիչ</translation> @@ -4331,7 +4328,6 @@ <translation id="5794414402486823030">Միշտ բացել համակարգի դիտման ծրագրի միջոցով</translation> <translation id="5794700615121138172">Լինուքսի ընդհանուր պանակներ</translation> <translation id="5794786537412027208">Դուրս գալ Chrome-ի բոլոր հավելվածներից</translation> -<translation id="5797070761912323120">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել` Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> <translation id="5798079537501238810">Կայքերը կարող են տեղադրել վճարումների մշակիչներ</translation> <translation id="579907812742603813">պաշտպանված բովանդակություն</translation> <translation id="579915268381781820">Անվտանգության բանալին հեռացվել է:</translation> @@ -4692,7 +4688,6 @@ <translation id="6208521041562685716">Բջջային ինտերնետն ակտիվացվեց</translation> <translation id="6209838773933913227">Բաղադրիչի թարմացում</translation> <translation id="6209908325007204267">Ձեր սարքում առկա է Chrome Enterprise-ի արտոնագիր, բայց ձեր օգտանունը կապված չէ կազմակերպության հաշվի հետ։ Մեկ այլ սարքով անցեք g.co/ChromeEnterpriseAccount էջ և ստեղծեք կազմակերպության հաշիվ։</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />. համաժամացումը չի աշխատում</translation> <translation id="6212039847102026977">Ցուցադրել ցանցի լրացուցիչ հատկությունները</translation> <translation id="6212168817037875041">Անջատել էկրանը</translation> <translation id="6212752530110374741">Ուղարկել հղումը էլփոստով</translation> @@ -5781,6 +5776,7 @@ <translation id="7427348830195639090">Հետնաշերտի էջ՝ <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Զանգել <ph name="DEVICE_NAME" />-ից</translation> <translation id="7431719494109538750">HID սարքեր չեն գտնվել</translation> +<translation id="7431991332293347422">Կառավարեք ձեր այցելությունների պատմության օգտագործումը՝ Որոնումը և այլ ծառայություններ անհատականացնելու համար</translation> <translation id="7433708794692032816">Տեղադրեք խելացի քարտը, որպեսզի շարունակեք օգտվել <ph name="DEVICE_TYPE" /> սարքից</translation> <translation id="7433957986129316853">Պահպանել</translation> <translation id="7434509671034404296">Մշակողների համար</translation> @@ -7079,14 +7075,14 @@ <translation id="8846746259444262774">Չհաջողվեց տեղադրել</translation> <translation id="8847523528195140327">Դուրս գալ հաշվից, երբ պատյանի շապիկը փակ է</translation> <translation id="8847988622838149491">USB</translation> -<translation id="8849001918648564819">Թաքցված է</translation> +<translation id="8849001918648564819">Ոչ ոք</translation> <translation id="8849219423513870962">Չեղարկել eSIM պրոֆիլի (<ph name="PROFILE_NAME" />) հեռացումը</translation> <translation id="8850251000316748990">Ավելին…</translation> <translation id="885246833287407341">API-ի ֆունկցիայի փոփոխականներ</translation> <translation id="8853586775156634952">Այս քարտը կպահվի միայն այս սարքում</translation> <translation id="8855977033756560989">Այս Chromebook Enterprise սարքի համար տրամադրվում է Chrome Enterprise-ի արտոնագիր։ Որպեսզի կարողանաք օգտվել բոլոր կորպորատիվ գործառույթներից, գրանցեք սարքը Google-ի ադմինիստրատորի հաշվի օգտագործմամբ։</translation> <translation id="8856028055086294840">Վերականգնել հավելվածներն ու էջերը</translation> -<translation id="885701979325669005">Պահեստ</translation> +<translation id="885701979325669005">Պահոց</translation> <translation id="8859057652521303089">Ընտրեք լեզուն`</translation> <translation id="8859174528519900719">Ենթաշրջանակ՝ <ph name="SUBFRAME_SITE" /></translation> <translation id="8859402192569844210">Չհաջողվեց բեռնել օգտագործման պայմանները</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index f037b54..b3f8e40 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Untuk menghapus data browsing dari semua perangkat yang disinkronkan dan dari Akun Google, <ph name="BEGIN_LINK" />buka setelan sinkronisasi<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Cetak...</translation> <translation id="1176471985365269981">Tidak diizinkan mengedit file atau folder di perangkat Anda</translation> -<translation id="1177138678118607465">Google dapat menggunakan histori browsing untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya. Anda dapat mengubahnya kapan saja di myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Sesuaikan</translation> <translation id="1178581264944972037">Jeda</translation> <translation id="117916940443676133">Kunci keamanan Anda tidak dilindungi PIN. Untuk mengelola data login, buat PIN terlebih dahulu.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Memulai mesin virtual</translation> <translation id="1603914832182249871">(Samaran)</translation> <translation id="1604432177629086300">Tidak dapat mencetak. Periksa printer dan coba lagi.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Sinkronisasi sandi tidak berfungsi</translation> <translation id="1607139524282324606">Hapus entri</translation> <translation id="1607499585984539560">Pengguna tidak berafiliasi dengan domain</translation> <translation id="1608626060424371292">Hapus pengguna ini</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Buka link dengan...</translation> <translation id="2891922230654533301">Gunakan perangkat Anda untuk login ke <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Browser default</translation> +<translation id="2893180576842394309">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran dan layanan Google lainnya</translation> <translation id="2894757982205307093">Tab baru di grup</translation> <translation id="289695669188700754">ID Kunci: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Setelan khusus ini akan dihapus saat Anda menutup semua jendela Samaran</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Verifikasi bahwa ini adalah penyedia yang valid atau coba lagi nanti</translation> <translation id="3856800405688283469">Pilih zona waktu</translation> <translation id="3857807444929313943">Angkat, kemudian sentuh lagi</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Sinkronisasi dijeda</translation> <translation id="3861638017150647085">Nama pengguna "<ph name="USERNAME" />" tidak tersedia</translation> <translation id="3861977424605124250">Tampilkan saat memulai</translation> <translation id="3862788408946266506">Aplikasi dengan atribut manifes 'kiosk_only' harus diinstal dalam mode kios Chrome OS</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Jangan ingatkan saya lain kali</translation> <translation id="4881695831933465202">Buka</translation> <translation id="4882312758060467256">Memiliki akses ke situs ini</translation> -<translation id="4882831918239250449">Kontrol cara histori browsing digunakan untuk mempersonalisasi Penelusuran, iklan, dan lainnya</translation> <translation id="4882919381756638075">Situs biasanya menggunakan mikrofon Anda untuk fitur komunikasi seperti video chat</translation> <translation id="4883436287898674711">Semua situs <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Pengelola &Tugas</translation> @@ -4343,7 +4340,6 @@ <translation id="5794414402486823030">Selalu buka dengan penampil sistem</translation> <translation id="5794700615121138172">Folder bersama Linux</translation> <translation id="5794786537412027208">Keluar dari semua Aplikasi Chrome</translation> -<translation id="5797070761912323120">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya</translation> <translation id="5798079537501238810">Situs dapat menginstal pengendali pembayaran</translation> <translation id="579907812742603813">konten yang dilindungi</translation> <translation id="579915268381781820">Kunci keamanan Anda dihapus.</translation> @@ -4704,7 +4700,6 @@ <translation id="6208521041562685716">Data seluler sedang diaktifkan</translation> <translation id="6209838773933913227">Komponen sedang diupdate</translation> <translation id="6209908325007204267">Perangkat Anda mencakup Chrome Enterprise Upgrade, tetapi nama pengguna Anda tidak terkait dengan akun perusahaan. Buat akun perusahaan dengan membuka g.co/ChromeEnterpriseAccount di perangkat kedua.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Sinkronisasi tidak berfungsi</translation> <translation id="6212039847102026977">Tampilkan properti jaringan lanjutan</translation> <translation id="6212168817037875041">Matikan layar</translation> <translation id="6212752530110374741">Email Link</translation> @@ -5793,6 +5788,7 @@ <translation id="7427348830195639090">Halaman Background: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Panggilan dari <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Tidak ditemukan perangkat HID</translation> +<translation id="7431991332293347422">Kontrol cara histori browsing digunakan untuk mempersonalisasi Penelusuran dan lainnya</translation> <translation id="7433708794692032816">Pasang kartu smart agar tetap menggunakan <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Simpan</translation> <translation id="7434509671034404296">Pengembang</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 715925d..638595e 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Til að hreinsa vafragögn úr öllum samstilltum tækjum og af Google reikningnum þínum skaltu <ph name="BEGIN_LINK" />skoða samstillingarkosti<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Prenta...</translation> <translation id="1176471985365269981">Mega ekki breyta skrám og möppum í tækinu</translation> -<translation id="1177138678118607465">Google notar hugsanlega vefskoðunarferilinn þinn til að sérsníða leitina, auglýsingar og aðra þjónustu Google. Þú getur breytt þessu hvenær sem er með því að fara á myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Sérsniðið</translation> <translation id="1178581264944972037">Gera hlé</translation> <translation id="117916940443676133">Öryggislykillinn þinn er ekki varinn með PIN-númeri. Til að stjórna innskráningargögnum þarftu fyrst að búa til PIN-númer.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">Ræsir sýndarvélina</translation> <translation id="1603914832182249871">(Huliðsstilling)</translation> <translation id="1604432177629086300">Ekki var hægt að prenta. Athugaðu prentarann og reyndu aftur.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Samstilling aðgangsorða virkar ekki</translation> <translation id="1607139524282324606">Hreinsa færslu</translation> <translation id="1607499585984539560">Notandi tengist ekki léni</translation> <translation id="1608626060424371292">Fjarlægja þennan notanda</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Opna tengil með...</translation> <translation id="2891922230654533301">Nota tækið þitt til að skrá þig inn á <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Sjálfgefinn vafri</translation> +<translation id="2893180576842394309">Google notar hugsanlega ferilinn þinn til að sérsníða leitina og aðra þjónustu Google</translation> <translation id="2894757982205307093">Nýr flipi í hópi</translation> <translation id="289695669188700754">Lykilsauðkenni: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Þessi sérstilling verður fjarlægð þegar þú lokar öllum huliðsgluggum</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Gakktu úr skugga um að þetta sé staðfest veita eða reyndu aftur síðar</translation> <translation id="3856800405688283469">Veldu tímabelti</translation> <translation id="3857807444929313943">Lyftu upp og snertu aftur með fingrinum</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Samstilling stöðvuð</translation> <translation id="3861638017150647085">Notandanafnið „<ph name="USERNAME" />“ er ekki laust</translation> <translation id="3861977424605124250">Birta við ræsingu</translation> <translation id="3862788408946266506">Forrit með upplýsingaskráreigindina „kiosk_only“ verður að vera uppsett í sjálfsalastillingu Chrome OS</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Ekki minna mig á næst</translation> <translation id="4881695831933465202">Opna</translation> <translation id="4882312758060467256">Hefur aðgang að þessu vefsvæði</translation> -<translation id="4882831918239250449">Stjórnaðu því hvernig vefskoðunarferillinn þinn er notaður til að sérsníða leit, auglýsingar og fleira</translation> <translation id="4882919381756638075">Vefsvæði nota yfirleitt hljóðnemann fyrir samskiptaeiginleika eins og myndspjall</translation> <translation id="4883436287898674711">Öll vefsvæði <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Verks&tjórn</translation> @@ -4343,7 +4340,6 @@ <translation id="5794414402486823030">Opna alltaf með skoðara kerfis</translation> <translation id="5794700615121138172">Sameiginlegar möppur í Linux</translation> <translation id="5794786537412027208">Loka öllum Chrome forritum</translation> -<translation id="5797070761912323120">Google notar hugsanlega ferilinn þinn til að sérsníða leitina, auglýsingar og aðra þjónustu Google</translation> <translation id="5798079537501238810">Vefsvæði mega setja upp greiðslumiðlara</translation> <translation id="579907812742603813">varið efni</translation> <translation id="579915268381781820">Öryggislykillinn var fjarlægður.</translation> @@ -4704,7 +4700,6 @@ <translation id="6208521041562685716">Verið er að virkja farsímagögn</translation> <translation id="6209838773933913227">Hlutauppfærsla</translation> <translation id="6209908325007204267">Tækið þitt er með Chrome Enterprise uppfærslu en notandanafnið þitt er ekki tengt við fyrirtækisreikning. Stofnaðu fyrirtækisreikning með því að fara á g.co/ChromeEnterpriseAccount í öðru tæki.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Samstilling virkar ekki</translation> <translation id="6212039847102026977">Sýna ítarlega neteiginleika</translation> <translation id="6212168817037875041">Slökkva á skjá</translation> <translation id="6212752530110374741">Tengill í tölvupósti</translation> @@ -5793,6 +5788,7 @@ <translation id="7427348830195639090">Bakgrunnssíða: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Símtal frá <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Engin HID-tæki fundust</translation> +<translation id="7431991332293347422">Stjórnaðu því hvernig vefskoðunarferillinn þinn er notaður til að sérsníða leit og fleira</translation> <translation id="7433708794692032816">Settu snjallkort í til að halda áfram að nota <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Halda henni</translation> <translation id="7434509671034404296">Forritarar</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 164caad3..1384c2f 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388"><ph name="BEGIN_LINK" />Accedi alle impostazioni di sincronizzazione<ph name="END_LINK" /> per cancellare i dati di navigazione da tutti i dispositivi sincronizzati e dal tuo Account Google.</translation> <translation id="1175364870820465910">&Stampa...</translation> <translation id="1176471985365269981">Non autorizzati a modificare file o cartelle sul dispositivo</translation> -<translation id="1177138678118607465">Google può utilizzare la tua cronologia di navigazione per personalizzare gli annunci associati ai risultati di ricerca e altri servizi Google. Puoi modificare l'impostazione in qualsiasi momento visitando il sito myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personalizzati</translation> <translation id="1178581264944972037">Pausa</translation> <translation id="117916940443676133">Il token di sicurezza non è protetto tramite PIN. Per poter gestire i dati di accesso devi creare un PIN.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Avvio della macchina virtuale</translation> <translation id="1603914832182249871">(In incognito)</translation> <translation id="1604432177629086300">Stampa non riuscita. Controlla la stampante e riprova</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: la sincronizzazione delle password non funziona</translation> <translation id="1607139524282324606">Cancella voce</translation> <translation id="1607499585984539560">L'utente non è affiliato al dominio</translation> <translation id="1608626060424371292">Rimuovi questo utente</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">Apri link con...</translation> <translation id="2891922230654533301">Vuoi usare il tuo dispositivo per accedere al sito <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Browser predefinito</translation> +<translation id="2893180576842394309">Google può utilizzare la tua cronologia per personalizzare la Ricerca e altri servizi Google</translation> <translation id="2894757982205307093">Nuova scheda nel gruppo</translation> <translation id="289695669188700754">ID chiave: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Questa impostazione personalizzata verrà rimossa quando chiuderai tutte le finestre di navigazione in incognito</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">Verifica che questo fornitore sia valido e riprova più tardi</translation> <translation id="3856800405688283469">Seleziona il fuso orario</translation> <translation id="3857807444929313943">Solleva, quindi tocca di nuovo</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sincronizzazione in pausa</translation> <translation id="3861638017150647085">Il nome utente "<ph name="USERNAME" />" non è disponibile</translation> <translation id="3861977424605124250">Mostra all'avvio</translation> <translation id="3862788408946266506">L'app con l'attributo del file manifest "kiosk_only" deve essere installata in modalità kiosk di Chrome OS</translation> @@ -3528,7 +3526,6 @@ <translation id="4881685975363383806">Non visualizzare più il promemoria</translation> <translation id="4881695831933465202">Apri</translation> <translation id="4882312758060467256">Ha accesso a questo sito</translation> -<translation id="4882831918239250449">Controlla il modo in cui la cronologia di navigazione viene utilizzata per personalizzare la Ricerca, gli annunci e altro ancora</translation> <translation id="4882919381756638075">In genere, i siti usano il microfono per funzionalità di comunicazione come la chat video</translation> <translation id="4883436287898674711">Tutti i siti <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Task Manager</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">Apri sempre con visualizzatore di sistema</translation> <translation id="5794700615121138172">Cartelle condivise di Linux</translation> <translation id="5794786537412027208">Chiudi tutte le app di Chrome</translation> -<translation id="5797070761912323120">Google può utilizzare la tua cronologia per personalizzare la Ricerca, gli annunci e altri servizi Google</translation> <translation id="5798079537501238810">I siti possono installare gestori dei pagamenti</translation> <translation id="579907812742603813">contenuti protetti</translation> <translation id="579915268381781820">Il token di sicurezza è stato rimosso.</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">Attivazione dei dati mobili in corso</translation> <translation id="6209838773933913227">Aggiornamento del componente</translation> <translation id="6209908325007204267">Il tuo dispositivo include una licenza Chrome Enterprise Upgrade, ma il tuo nome utente non è associato a un account aziendale. Crea un account aziendale dal sito g.co/ChromeEnterpriseAccount su un dispositivo secondario.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: la sincronizzazione non funziona</translation> <translation id="6212039847102026977">Mostra proprietà di rete avanzate</translation> <translation id="6212168817037875041">Disattiva lo schermo</translation> <translation id="6212752530110374741">Invia link tramite email</translation> @@ -5777,6 +5772,7 @@ <translation id="7427348830195639090">Pagina di sfondo: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Chiamata da <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nessun dispositivo HID trovato</translation> +<translation id="7431991332293347422">Controlla la modalità di utilizzo della cronologia di navigazione per personalizzare la Ricerca e non solo</translation> <translation id="7433708794692032816">Inserisci la smart card per continuare a utilizzare il tuo <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Mantieni</translation> <translation id="7434509671034404296">Opzioni per sviluppatori</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index fcbb961..114a83f9de 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">כדי לנקות את נתוני הגלישה מכל המכשירים המסונכרנים ומחשבון Google שלך, <ph name="BEGIN_LINK" />יש להיכנס להגדרות הסנכרון<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">הדפסה…</translation> <translation id="1176471985365269981">לא מורשים לערוך קבצים או תיקיות במכשיר</translation> -<translation id="1177138678118607465">Google עשויה להשתמש בהיסטוריית הגלישה שלך כדי להתאים אישית את החיפוש, מודעות ושירותים נוספים של Google. אפשר לשנות את ההגדרה הזו בכתובת myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">מותאם אישית</translation> <translation id="1178581264944972037">השהיה</translation> <translation id="117916940443676133">מפתח האבטחה שלך אינו מוגן באמצעות קוד אימות. כדי לנהל את פרטי הכניסה, צריך תחילה ליצור קוד אימות.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">המערכת מפעילה את המכונה הווירטואלית</translation> <translation id="1603914832182249871">(אנונימי)</translation> <translation id="1604432177629086300">לא ניתן היה להדפיס. יש לבדוק את המדפסת ולנסות שוב.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: סנכרון הסיסמאות לא פועל</translation> <translation id="1607139524282324606">ניקוי רשומה</translation> <translation id="1607499585984539560">המשתמש לא משויך לדומיין</translation> <translation id="1608626060424371292">הסרת המשתמש הזה</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">פתיחת קישור באמצעות...</translation> <translation id="2891922230654533301">להשתמש במכשיר שלך כדי להיכנס לחשבון באתר <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">דפדפן ברירת מחדל</translation> +<translation id="2893180576842394309">Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש ושירותי Google אחרים</translation> <translation id="2894757982205307093">כרטיסייה חדשה בקבוצה</translation> <translation id="289695669188700754">מזהה מפתח: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">לאחר הסגירה של כל החלונות האנונימיים, ההגדרה שהותאמה אישית תוסר</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">יש לאמת שהספק הזה חוקי או לנסות שוב מאוחר יותר</translation> <translation id="3856800405688283469">בחירת אזור זמן</translation> <translation id="3857807444929313943">יש להרים ולגעת בחיישן שוב</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: הסנכרון הושהה</translation> <translation id="3861638017150647085">שם המשתמש "<ph name="USERNAME" />" לא זמין</translation> <translation id="3861977424605124250">הצגה בעת ההפעלה</translation> <translation id="3862788408946266506">במצב קיוסק של Chrome OS, יש להתקין אפליקציות עם מאפיין המניפסט 'kiosk_only'</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">אין צורך להזכיר לי בפעם הבאה</translation> <translation id="4881695831933465202">פתיחה</translation> <translation id="4882312758060467256">יש גישה לאתר הזה</translation> -<translation id="4882831918239250449">הגדרת השימוש בהיסטוריית הגלישה לצורך התאמה אישית של החיפוש, המודעות ועוד</translation> <translation id="4882919381756638075">אתרים משתמשים בדרך כלל במיקרופון של המכשיר כדי לתמוך בתכונות תקשורת כמו וידאו צ'אט</translation> <translation id="4883436287898674711">כל אתרי <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&מנהל המשימות</translation> @@ -4343,7 +4340,6 @@ <translation id="5794414402486823030">תמיד לפתוח באמצעות מציג המערכת</translation> <translation id="5794700615121138172">תיקיות משותפות של Linux</translation> <translation id="5794786537412027208">יציאה מכל אפליקציות Chrome</translation> -<translation id="5797070761912323120">Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים</translation> <translation id="5798079537501238810">אתרים מורשים להתקין רכיבי handler של תשלומים</translation> <translation id="579907812742603813">תוכן מוגן</translation> <translation id="579915268381781820">מפתח האבטחה שלך הוסר.</translation> @@ -4704,7 +4700,6 @@ <translation id="6208521041562685716">המערכת מפעילה את חבילת הגלישה</translation> <translation id="6209838773933913227">עדכון רכיבים</translation> <translation id="6209908325007204267">המכשיר כולל אפשרות שדרוג ל-Chrome Enterprise, אבל שם המשתמש שלך לא משויך לחשבון ארגוני. כדי ליצור חשבון ארגוני, יש להיכנס לכתובת g.co/ChromeEnterpriseAccount במכשיר אחר.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: הסנכרון לא פועל</translation> <translation id="6212039847102026977">הצגת מאפייני רשת מתקדמים</translation> <translation id="6212168817037875041">כיבוי המסך</translation> <translation id="6212752530110374741">שליחת קישור באימייל</translation> @@ -5793,6 +5788,7 @@ <translation id="7427348830195639090">דף רקע: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">שיחה מ-<ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">לא נמצאו התקני HID</translation> +<translation id="7431991332293347422">קביעת אופן השימוש בהיסטוריית הגלישה להתאמה אישית של החיפוש ועוד</translation> <translation id="7433708794692032816">יש להכניס את הכרטיס החכם כדי להמשיך להשתמש ב-<ph name="DEVICE_TYPE" /> שלך</translation> <translation id="7433957986129316853">שמירת השינוי</translation> <translation id="7434509671034404296">למפתחים</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 244b29e..caf87e0 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">同期しているすべてのデバイスと Google アカウントから閲覧データを削除するには、<ph name="BEGIN_LINK" />同期設定に移動<ph name="END_LINK" />してください。</translation> <translation id="1175364870820465910">印刷(&P)...</translation> <translation id="1176471985365269981">デバイスのファイルやフォルダの編集を許可しないサイト</translation> -<translation id="1177138678118607465">検索、広告、その他の Google サービスをカスタマイズする目的で、閲覧履歴が Google に使用されることがあります。この設定は myaccount.google.com/activitycontrols/search でいつでも変更できます</translation> <translation id="1177863135347784049">カスタム</translation> <translation id="1178581264944972037">一時停止</translation> <translation id="117916940443676133">セキュリティ キーは PIN で保護されていません。ログインデータを管理するには、まず PIN を作成してください。</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">仮想マシンを起動しています</translation> <translation id="1603914832182249871">(シークレット モード)</translation> <translation id="1604432177629086300">印刷できませんでした。プリンタを確認してもう一度お試しください。</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: パスワード同期が機能していません</translation> <translation id="1607139524282324606">エラー項目を消去</translation> <translation id="1607499585984539560">ユーザーはドメインに関連付けられていません</translation> <translation id="1608626060424371292">このユーザーを削除</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">次のプログラムでリンクを開く...</translation> <translation id="2891922230654533301">デバイスを使用して <ph name="APP_NAME" /> にログインしますか?</translation> <translation id="2893168226686371498">既定のブラウザ</translation> +<translation id="2893180576842394309">検索やその他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります</translation> <translation id="2894757982205307093">グループにタブを追加</translation> <translation id="289695669188700754">キー ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">このカスタム設定はシークレット ウィンドウをすべて閉じると削除されます</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">有効なプロバイダであることを確認するか、しばらくしてからもう一度お試しください</translation> <translation id="3856800405688283469">タイムゾーンを選択</translation> <translation id="3857807444929313943">指を放して、もう一度タッチ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: 同期が一時停止されています</translation> <translation id="3861638017150647085">ユーザー名「<ph name="USERNAME" />」は使用できません</translation> <translation id="3861977424605124250">起動時に表示する</translation> <translation id="3862788408946266506">「kiosk_only」のマニフェスト属性が指定されているアプリは、Chrome OS キオスクモードでインストールする必要があります。</translation> @@ -3528,7 +3526,6 @@ <translation id="4881685975363383806">次回表示しない</translation> <translation id="4881695831933465202">開く</translation> <translation id="4882312758060467256">このサイトへのアクセスが許可されています</translation> -<translation id="4882831918239250449">検索、広告などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="4882919381756638075">多くのサイトは、ビデオチャットなどの通信機能にマイクを使用します。</translation> <translation id="4883436287898674711"><ph name="WEBSITE_1" /> の全サイト</translation> <translation id="48838266408104654">タスク マネージャ(&T)</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">常にシステム ビューアで開く</translation> <translation id="5794700615121138172">Linux の共有フォルダ</translation> <translation id="5794786537412027208">すべての Chrome アプリを終了</translation> -<translation id="5797070761912323120">検索、広告、その他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります</translation> <translation id="5798079537501238810">サイトが支払いハンドラをインストールできるようにする</translation> <translation id="579907812742603813">保護されたコンテンツ</translation> <translation id="579915268381781820">セキュリティ キーは削除されています。</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">モバイルデータを有効化しています</translation> <translation id="6209838773933913227">コンポーネントを更新しています</translation> <translation id="6209908325007204267">デバイスには Chrome Enterprise Upgrade が含まれていますが、ユーザー名が Enterprise アカウントに関連付けられていません。サブデバイスで g.co/ChromeEnterpriseAccount にアクセスし、Enterprise アカウントを作成してください。</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: 同期が機能していません</translation> <translation id="6212039847102026977">ネットワークの詳細プロパティを表示</translation> <translation id="6212168817037875041">画面をオフにする</translation> <translation id="6212752530110374741">リンクをメールで送信</translation> @@ -5068,7 +5063,7 @@ <translation id="6624687053722465643">スイーツ</translation> <translation id="6628328486509726751">アップロード日時: <ph name="WEBRTC_LOG_UPLOAD_TIME" /></translation> <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> が、自身を自動的に認証できるよう、証明書への恒久的なアクセス許可を求めています。</translation> -<translation id="6635362468090274700">検出を有効にするまで、誰もあなたと共有できません。<ph name="BR" /><ph name="BR" />検出を一時的に有効にするには、ステータス領域を開いて、周辺ユーザーによる検出をオンにします。</translation> +<translation id="6635362468090274700">デバイスを非公開に設定している場合、誰もあなたとコンテンツを共有できません。<ph name="BR" /><ph name="BR" />一時的に公開するには、ステータス領域を開いて、ニアバイシェアをオンにします。</translation> <translation id="6635944431854494329">所有者はこの機能を [設定] > [詳細設定] > [診断と使用状況のデータを Google に自動送信する] で管理できます。</translation> <translation id="6635956300022133031">テキスト読み上げ用の音声を選択してカスタマイズします</translation> <translation id="6639554308659482635">SQLite メモリ</translation> @@ -5700,7 +5695,7 @@ <translation id="7348093485538360975">画面キーボード</translation> <translation id="7349010927677336670">動画の滑らかさ</translation> <translation id="7352651011704765696">問題が発生しました</translation> -<translation id="7353261921908507769">近くにいる連絡先が共有できます。許可するまで転送は行われません。</translation> +<translation id="7353261921908507769">近くにいる連絡先から共有を受けられます。許可するまで転送は行われません。</translation> <translation id="735361434055555355">Linux をインストールしています...</translation> <translation id="7354341762311560488">指紋認証センサーはキーボードの左下のキーに搭載されています。いずれかの指で軽く触れてください。</translation> <translation id="7356908624372060336">ネットワーク ログ</translation> @@ -5777,6 +5772,7 @@ <translation id="7427348830195639090">バックグラウンド ページ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> から発信</translation> <translation id="7431719494109538750">HID デバイスは見つかりませんでした</translation> +<translation id="7431991332293347422">検索などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> を引き続き使用するにはスマートカードを挿入してください</translation> <translation id="7433957986129316853">そのままにする</translation> <translation id="7434509671034404296">開発 / 管理</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 4c90b28..382b2d0 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">თქვენი Google ანგარიშიდან და ყველა სინქრონიზებული მოწყობილობიდან დათვალიერების მონაცემების გასასუფთავებლად <ph name="BEGIN_LINK" />გადადით სინქრონიზაციის პარამეტრებზე<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&ბეჭდვა…</translation> <translation id="1176471985365269981">თქვენს მოწყობილობაზე არსებული ფაილებისა თუ საქაღალდეების რედაქტირება დაუშვებელია</translation> -<translation id="1177138678118607465">Google-მა შეიძლება გამოიყენოს თქვენი დათვალიერების ისტორია Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად. ამის ნებისმიერ დროს შეცვლა შეგიძლიათ მისამართზე: myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">მორგებული</translation> <translation id="1178581264944972037">პაუზა</translation> <translation id="117916940443676133">თქვენი უსაფრთხოების გასაღები არ არის დაცული PIN-კოდით. სისტემაში შესვლის მონაცემების სამართავად, პირველ რიგში, შექმენით PIN-კოდი.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">მიმდინარეობს ვირტუალური მოწყობილობის გაშვება</translation> <translation id="1603914832182249871">(ინკოგნიტო)</translation> <translation id="1604432177629086300">ბეჭდვა ვერ მოხერხდა. შეამოწმეთ პრინტერი და ცადეთ ხელახლა.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: პაროლების სინქრონიზაცია არ მუშაობს</translation> <translation id="1607139524282324606">ჩანაწერის გასუფთავება</translation> <translation id="1607499585984539560">მომხმარებელი არაა დაკავშირებული ამ დომენთან</translation> <translation id="1608626060424371292">ამ მომხმარებლის წაშლა</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">ბმულის გახსნა…</translation> <translation id="2891922230654533301">გსურთ, გამოიყენოთ თქვენი მოწყობილობა <ph name="APP_NAME" />-ში შესასვლელად?</translation> <translation id="2893168226686371498">ნაგულისხმევი ბრაუზერი</translation> +<translation id="2893180576842394309">Google-მა შეიძლება გამოიყენოს თქვენი ისტორია Search-ისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation> <translation id="2894757982205307093">ახალი ჩანართი ჯგუფში</translation> <translation id="289695669188700754">გასაღების ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ეს მორგებული პარამეტრი გაუქმდება, როცა ყველა ინკოგნიტო ფანჯარას დახურავთ</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">დაადასტურეთ პროვაიდერის სისწორე ან ცადეთ მოგვიანებით</translation> <translation id="3856800405688283469">აირჩიეთ დროის სარტყელი</translation> <translation id="3857807444929313943">აიღეთ თითი, შემდეგ კი ხელახლა შეეხეთ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: სინქრონიზაცია დაპაუზებულია</translation> <translation id="3861638017150647085">მომხმარებლის სახელი „<ph name="USERNAME" />“ მიუწვდომელია</translation> <translation id="3861977424605124250">გაშვებისას ჩვენება</translation> <translation id="3862788408946266506">აპი, რომლის მანიფესტის ატრიბუტიცაა „kiosk_only“, უნდა დაინსტალირდეს Chrome OS-ის კიოსკის რეჟიმში</translation> @@ -3528,7 +3526,6 @@ <translation id="4881685975363383806">შემდეგში აღარ შემახსენოთ</translation> <translation id="4881695831933465202">გახსნა</translation> <translation id="4882312758060467256">აქვს წვდომა ამ საიტზე</translation> -<translation id="4882831918239250449">მართეთ თქვენი დათვალიერების ისტორიის გამოყენების სპეციფიკა Search-ის, სარეკლამო კონტენტის და სხვა სერვისების პერსონალიზებისთვის</translation> <translation id="4882919381756638075">როგორც წესი, საიტების მიერ თქვენი მიკროფონი გამოიყენება კომუნიკაციასთან დაკავშირებული ისეთი ფუნქციების უზრუნველსაყოფად, როგორიცაა ვიდეოჩეთი</translation> <translation id="4883436287898674711">ყველა <ph name="WEBSITE_1" /> ვებგვერდები</translation> <translation id="48838266408104654">&ამოცანების მმართველი</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">ყოველთვის გახსნა სისტემის დამთვალიერებლით</translation> <translation id="5794700615121138172">Linux-ის გაზიარებული საქაღალდეები</translation> <translation id="5794786537412027208">Chrome-ის ყველა პროგრამის დახურვა</translation> -<translation id="5797070761912323120">Google-მა შეიძლება გამოიყენოს თქვენი ისტორია Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation> <translation id="5798079537501238810">საიტებს შეუძლია გადახდის დამმუშავებლების ინსტალაცია</translation> <translation id="579907812742603813">დაცული კონტენტი</translation> <translation id="579915268381781820">თქვენი უსაფრთხოების გასაღები ამოღებულია.</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">მიმდინარეობს მობილური ინტერნეტის გააქტიურება</translation> <translation id="6209838773933913227">კომპონენტების განახლება</translation> <translation id="6209908325007204267">თქვენს მოწყობილობას მოჰყვება Chrome Enterprise-ზე განახლება, თუმცა თქვენი მომხმარებლის სახელი არ არის დაკავშირებული კორპორაციულ ანგარიშთან. კორპორაციული ანგარიშის შესაქმნელად სხვა მოწყობილობიდან გადადით შემდეგ მისამართზე: g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: სინქრონიზაცია არ მუშაობს</translation> <translation id="6212039847102026977">ქსელის დამატებითი მახასიათებლების ჩვენება</translation> <translation id="6212168817037875041">ეკრანის გამორთვა</translation> <translation id="6212752530110374741">ბმულის ელფოსტით გაგზავნა</translation> @@ -5777,6 +5772,7 @@ <translation id="7427348830195639090">ფონის გვერდი: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">ზარი <ph name="DEVICE_NAME" />-ისგან</translation> <translation id="7431719494109538750">HID მოწყობილობები ვერ მოიძებნა</translation> +<translation id="7431991332293347422">მართეთ თქვენი დათვალიერების ისტორიის გამოყენების ხერხები Search-ისა და სხვა სერვისების პერსონალიზებისთვის</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> კვლავ რომ გამოიყენოთ, ჩასვით სმარტ-ბარათი</translation> <translation id="7433957986129316853">შენარჩუნება</translation> <translation id="7434509671034404296">შემმუშავებელი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index d756fd9..5001f97 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Барлық синхрондалған құрылғылардан және Google есептік жазбасынан браузерді пайдалану деректерін өшіру үшін <ph name="BEGIN_LINK" />синхрондау параметрлеріне кіріңіз<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Басып шығару…</translation> <translation id="1176471985365269981">Құрылғыңыздағы файлдарды немесе қалталарды өзгертуге рұқсаты жоқтар</translation> -<translation id="1177138678118607465">Іздеу, жарнама және басқа да Google қызметтерін жекелендіру үшін Google қызметі интернетті шарлау тарихын пайдалануы мүмкін. Параметрді кез келген уақытта myaccount.google.com/activitycontrols/search бетінде өзгертуге болады</translation> <translation id="1177863135347784049">Реттелетін</translation> <translation id="1178581264944972037">Кідірту</translation> <translation id="117916940443676133">Сіздің қауіпсіздік кілтіңіз PIN кодымен қорғалмаған. Кіру деректерін басқару үшін алдымен PIN кодын жасаңыз.</translation> @@ -549,7 +548,6 @@ <translation id="1602085790802918092">Виртуалдық құрылғы іске қосылуда</translation> <translation id="1603914832182249871">(Инкогнито)</translation> <translation id="1604432177629086300">Басып шығарылмады. Принтерді тексеріп, қайталап көріңіз.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Құпия сөзді синхрондау жұмыс істеп тұрған жоқ.</translation> <translation id="1607139524282324606">Жазбаны өшіру</translation> <translation id="1607499585984539560">Пайдаланушы доменмен байланыстырылмаған.</translation> <translation id="1608626060424371292">Бұл пайдаланушыны алып тастау</translation> @@ -1753,6 +1751,7 @@ <translation id="2889064240420137087">Сілтеме ашу әдісі…</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> кіру үшін құрылғыңызды пайдаланасыз ба?</translation> <translation id="2893168226686371498">Әдепкі браузер</translation> +<translation id="2893180576842394309">Search және басқа да Google қызметтерін жеке қажеттеліктерге бейімдеу үшін Google интернеттегі әрекеттеріңізді пайдалануы мүмкін.</translation> <translation id="2894757982205307093">Топқа жаңа қойынды енгізу</translation> <translation id="289695669188700754">Кілт индентификаторы: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Сіз барлық инкогнито терезесін жапқан кезде, бұл арнаулы параметр өз күшін жояды.</translation> @@ -1820,7 +1819,7 @@ <translation id="2960208947600937804">Linux жүйесін конфигурациялау кезінде қате шықты. Әкімшіңізге хабарласыңыз.</translation> <translation id="296026337010986570">Дайын! Зиянды бағдарламалық құрал өшірілді. Кеңейтімдерді қайта қосу үшін <a href="chrome://extensions">Кеңейтімдер</a> бетіне кіріңіз.</translation> <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (кеңейтім берген)</translation> -<translation id="2961695502793809356">Алға өту үшін басыңыз, журнал көру үшін басып ұстап тұрыңыз</translation> +<translation id="2961695502793809356">Алға өту үшін басыңыз, журнал көру үшін басып тұрыңыз</translation> <translation id="2962131322798295505">Wallpaper Picker</translation> <translation id="2963151496262057773">Келесі плагин жауап бермейді: <ph name="PLUGIN_NAME" />Оны тоқтатқыңыз келе ме?</translation> <translation id="2964193600955408481">Wi-Fi желісін өшіру</translation> @@ -1889,6 +1888,7 @@ <translation id="3027296729579831126">Nearby Share функциясын қосу</translation> <translation id="3029466929721441205">Стилус құралдарын сөреде көрсету</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> жаңа нұсқаны бүгін жүктеп алуыңызды талап етеді. Интернетке қосылғаннан кейін, жаңа нұсқа автоматты түрде жүктеп алынады.}other{Мерзім аяқталғанға дейін, <ph name="MANAGER" /> жаңа нұсқаны жүктеп алуыңызды талап етеді. Интернетке қосылғаннан кейін, жаңа нұсқа автоматты түрде жүктеп алынады.}}</translation> +<translation id="3030967311408872958">Күн батқаннан күн шыққанға дейін</translation> <translation id="3031417829280473749">Agent X</translation> <translation id="3031557471081358569">Импорттау үшін элементтерді таңдаңыз:</translation> <translation id="3036327949511794916">Осы <ph name="DEVICE_TYPE" /> құрылғысын қайтару мерзімі өтіп кетті.</translation> @@ -2479,7 +2479,7 @@ <translation id="3704331259350077894">Жұмыстың тоқтатылуы</translation> <translation id="3705722231355495246">-</translation> <translation id="3706463572498736864">Әр парақтағы бет саны</translation> -<translation id="370649949373421643">Wi-Fi қосу</translation> +<translation id="370649949373421643">Wi‑Fi желісін қосу</translation> <translation id="370665806235115550">Жүктелуде…</translation> <translation id="3707163604290651814">Есептік жазбаға <ph name="NAME" /> ретінде кірдіңіз.</translation> <translation id="3708684582558000260">Жабылған сайттардың деректерді жіберуді немесе қабылдауды аяқтауына рұқсат бермеу</translation> @@ -2632,7 +2632,6 @@ <translation id="3856096718352044181">Мұның жарамды провайдер екенін тексеріңіз немесе кейінірек қайталап көріңіз.</translation> <translation id="3856800405688283469">Уақыт белдеуін таңдау</translation> <translation id="3857807444929313943">Саусағыңызды алып, қайта түртіңіз</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: синхрондау кідіртілді</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" деген пайдаланушы аты қолжетімді емес.</translation> <translation id="3861977424605124250">Іске қосу кезінде көрсету</translation> <translation id="3862788408946266506">"kiosk_only" манифест атрибутына ие қолданба Chrome OS киоск режимінде орнатылуы тиіс</translation> @@ -3523,7 +3522,6 @@ <translation id="4881685975363383806">Келесі жолы еске салынбасын</translation> <translation id="4881695831933465202">Ашу</translation> <translation id="4882312758060467256">Осы сайтқа кіре алады</translation> -<translation id="4882831918239250449">Іздеу, жарнама қызметтерін, т.б. жекелендіру үшін шолу тарихын қалай пайдалану керектігін көрсетіңіз</translation> <translation id="4882919381756638075">Сайттар әдетте бейнечат сияқты байланыс функциялары үшін микрофон пайдаланады.</translation> <translation id="4883436287898674711">Барлық <ph name="WEBSITE_1" /> сайттары</translation> <translation id="48838266408104654">&Тапсырмалар реттегіші</translation> @@ -3957,7 +3955,7 @@ <translation id="5372579129492968947">Кеңейтімді босату</translation> <translation id="5372632722660566343">Есептік жазбасыз жалғастыру</translation> <translation id="5375318608039113175">Nearby Share функциясын осы контактілермен пайдалану үшін Google есептік жазбасымен байланыстырылған электрондық пошта мекенжайын контактілерге қосыңыз.</translation> -<translation id="5376169624176189338">Артқа қайту үшін басыңыз, журнал көру үшін басып ұстап тұрыңыз</translation> +<translation id="5376169624176189338">Артқа қайту үшін басыңыз, журнал көру үшін басып тұрыңыз</translation> <translation id="5376931455988532197">Файл тым үлкен</translation> <translation id="5379140238605961210">Микрофонды пайдалануға салынған тыйымды сақтау</translation> <translation id="5382591305415226340">Қолдауға ие сілтемелерді басқару</translation> @@ -4070,6 +4068,7 @@ <translation id="5502500733115278303">Firefox браузерінен импортталған</translation> <translation id="5502915260472117187">Бала</translation> <translation id="5503982651688210506"><ph name="HOST" /> сайтына камераны пайдалануға және жылжытуға, микрофонды пайдалануға рұқсат ету</translation> +<translation id="5504909642107847870">Құпиялылық және қауіпсіздік параметрлерін тексеру</translation> <translation id="5505264765875738116">Сайттар хабарландырулар жіберу рұқсатын сұрай алмайды</translation> <translation id="5505307013568720083">Сия бітті</translation> <translation id="5505794066310932198">Commander функциясын қосу/өшіру</translation> @@ -4321,7 +4320,6 @@ <translation id="5794414402486823030">Әрқашан жүйе көру құралымен ашу</translation> <translation id="5794700615121138172">Linux ортақ қалталары</translation> <translation id="5794786537412027208">Барлық Chrome қолданбаларынан шығу</translation> -<translation id="5797070761912323120">Search, жарнамалар және басқа да Google қызметтерін жеке қажеттеліктерге бейімдеу үшін Google интернеттегі әрекеттеріңізді пайдалануы мүмкін.</translation> <translation id="5798079537501238810">Сайттар төлем өңдегіштерін орната алады.</translation> <translation id="579907812742603813">қорғалған мазмұн</translation> <translation id="579915268381781820">Қауіпсіздік кілтіңіз өшірілді.</translation> @@ -4682,7 +4680,6 @@ <translation id="6208521041562685716">Мобильдік интернет іске қосылуда</translation> <translation id="6209838773933913227">Компонентті жаңарту</translation> <translation id="6209908325007204267">Құрылғыда Chrome Enterprise Upgrade қамтылған, бірақ пайдаланушы атыңыз корпоративтік есептік жазбамен байланыстырылмаған. Қосымша құрылғыдан g.co/ChromeEnterpriseAccount бетіне өтіп, корпоративтік есептік жазбасын жасаңыз.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: синхрондалмай тұр</translation> <translation id="6212039847102026977">Кеңейтілген желі сипаттарын көрсету</translation> <translation id="6212168817037875041">Дисплейді өшіру</translation> <translation id="6212752530110374741">Электрондық пошта сілтемесі</translation> @@ -4876,7 +4873,7 @@ <translation id="6417265370957905582">Google Assistant</translation> <translation id="6417468503703810114">Әдеттегі әрекет</translation> <translation id="6418160186546245112">Бұрын орнатылған <ph name="IDS_SHORT_PRODUCT_NAME" /> нұсқасына қайтарылды</translation> -<translation id="6418481728190846787">Барлық қолданбалар үшін кіру құқығын біржола жою</translation> +<translation id="6418481728190846787">Барлық қолданба үшін кіру құқығын біржола жою</translation> <translation id="6418511932144861495">Маңызды жаңартылған нұсқаны орнату</translation> <translation id="6419546358665792306">Ашылмаған кеңейтімді жүктеу</translation> <translation id="6419843101460769608">Ешқандай сайтқа Bluetooth құрылғыларын пайдалануға рұқсат етпеу</translation> @@ -4899,6 +4896,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> — Bluetooth құрылғыларын іздеу қосулы.</translation> <translation id="6445450263907939268">Егер сіз бұл өзгерістерді қаламасаңыз, алдыңғы параметрлерді қалпына келтіре аласыз.</translation> <translation id="6446213738085045933">Жұмыс үстеліндегі таңбашаны жасау</translation> +<translation id="6447210166804596538">Ең маңызды құпиялылық пен қауіпсіздікті басқару элементтерін бір жерден көріңіз.</translation> <translation id="6447842834002726250">Cookie файлдары</translation> <translation id="6450876761651513209">Құпиялылыққа қатысты параметрлерді өзгерту</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> және тағы 1 қойынды}other{<ph name="PAGE_TITLE" /> және тағы # қойынды}}</translation> @@ -5770,6 +5768,7 @@ <translation id="7427348830195639090">Фондық бет: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> шалған қоңырау</translation> <translation id="7431719494109538750">HID құрылғылары табылмады.</translation> +<translation id="7431991332293347422">Search және т.б. қызметтерді жекелендіру үшін шолу тарихын қалай пайдалану керектігін көрсетіңіз</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> құрылғысын пайдалана беру үшін смарт картаны салу</translation> <translation id="7433957986129316853">Сақтау</translation> <translation id="7434509671034404296">Әзірлеуші</translation> @@ -6878,6 +6877,7 @@ <translation id="8655972064210167941">Кірілмеді, себебі құпия сөзіңіз расталмады. Әкімшіңізге хабарласыңыз немесе әрекетті қайталаңыз.</translation> <translation id="8657393004602556571">Пікірді жою керек пе?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> қолданбасы <ph name="TAB_NAME" /> сайтымен экранды және аудионы бөлісуде.</translation> +<translation id="8660073998956001352">Іздеу жүйелеріңіз</translation> <translation id="8661290697478713397">Сілтемені Инко&гнито терезесінде ашу</translation> <translation id="8662671328352114214"><ph name="TYPE" /> желісіне қосылу</translation> <translation id="8662795692588422978">Байланыстар</translation> @@ -7064,6 +7064,7 @@ <translation id="8845001906332463065">Анықтама алу</translation> <translation id="8846132060409673887">Компьютердің өндірушісі және моделі туралы ақпаратты оқыңыз</translation> <translation id="8846163936679269230">eSIM профильдерін бастапқы күйге қайтару</translation> +<translation id="8846746259444262774">Орнатылмады</translation> <translation id="8847523528195140327">Қақпағы жабылғанда, жүйеден шығу</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Жасырын</translation> @@ -7200,7 +7201,7 @@ <translation id="8986362086234534611">Ұмыту</translation> <translation id="8986494364107987395">Қолданыс статистикасы мен жаңылыс туралы есептерді Google компаниясына автоматты түрде жіберу</translation> <translation id="8987927404178983737">Ай</translation> -<translation id="8988879467270412492">Chrome OS-ке арналған ендірілген ChromeVox экранды оқу құралын іске қосқыңыз келе ме? Іске қосқыңыз келсе, екі дыбыс деңгейі пернесін бес секунд басып ұстап тұрыңыз.</translation> +<translation id="8988879467270412492">Chrome OS-ке арналған ендірілген ChromeVox экранды оқу құралын іске қосқыңыз келе ме? Іске қосқыңыз келсе, екі дыбыс деңгейі пернесін бес секунд басып тұрыңыз.</translation> <translation id="8989823300731803443">Тоқтаған жерден жалғастырыңыз.</translation> <translation id="8990209962746788689">QR кодын жасау мүмкін емес</translation> <translation id="8991520179165052608">Сайт микрофонды пайдалана алады</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 2721b9a..70311c0 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ដើម្បីសម្អាតទិន្នន័យរុករកចេញពីឧបករណ៍ដែលបានធ្វើសមកាលកម្មទាំងអស់របស់អ្នក និងគណនី Google របស់អ្នក <ph name="BEGIN_LINK" />សូមចូលទៅកាន់ការកំណត់សមកាលកម្ម<ph name="END_LINK" />។</translation> <translation id="1175364870820465910">បោះពុម្ព...</translation> <translation id="1176471985365269981">មិនអនុញ្ញាតឱ្យកែឯកសារ ឬថតនៅក្នុងឧបករណ៍របស់អ្នកទេ</translation> -<translation id="1177138678118607465">Google អាចនឹងប្រើប្រវត្តិរុករករបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងសេវាកម្មផ្សេងទៀតរបស់ Google ស្របនឹងអ្នក។ អ្នកអាចប្ដូរវាបានគ្រប់ពេលនៅ myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">ផ្ទាល់ខ្លួន</translation> <translation id="1178581264944972037">ផ្អាក</translation> <translation id="117916940443676133">សោសុវត្ថិភាពរបស់អ្នកមិនបានប្រើកូដ PIN សម្រាប់ការពារទេ។ ដើម្បីគ្រប់គ្រងទិន្នន័យសម្រាប់ចូលគណនី សូមបង្កើតកូដ PIN ជាមុនសិន។</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">កំពុងចាប់ផ្ដើមម៉ាស៊ីននិម្មិត</translation> <translation id="1603914832182249871">(អនាមិក)</translation> <translation id="1604432177629086300">មិនអាចបោះពុម្ពបានទេ។ សូមពិនិត្យម៉ាស៊ីនបោះពុម្ព រួចព្យាយាមម្ដងទៀត។</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />៖ សមកាលកម្មពាក្យសម្ងាត់មិនដំណើរការទេ</translation> <translation id="1607139524282324606">សម្អាតធាតុ</translation> <translation id="1607499585984539560">អ្នកប្រើប្រាស់មិនពាក់ព័ន្ធនឹងដែនទេ</translation> <translation id="1608626060424371292">ដកអ្នកប្រើចេញ</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">បើកតំណជាមួយ...</translation> <translation id="2891922230654533301">ប្រើឧបករណ៍របស់អ្នក ដើម្បីចូល <ph name="APP_NAME" /> ឬ?</translation> <translation id="2893168226686371498">កម្មវិធីរុករកលំនាំដើម</translation> +<translation id="2893180576842394309">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក</translation> <translation id="2894757982205307093">ផ្ទាំងថ្មីនៅក្នុងក្រុម</translation> <translation id="289695669188700754">លេខសម្គាល់សោ៖ <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ការកំណត់ផ្ទាល់ខ្លួននេះនឹងត្រូវបានលុបចេញ នៅពេលដែលអ្នកបិទផ្ទាំងឯកជនទាំងអស់របស់អ្នក</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">សូមផ្ទៀងផ្ទាត់ថា នេះគឺជាក្រុមហ៊ុនផ្ដល់សេវាត្រឹមត្រូវ ឬព្យាយាមម្ដងទៀតនៅពេលក្រោយ</translation> <translation id="3856800405688283469">ជ្រើសរើសល្វែងម៉ោង</translation> <translation id="3857807444929313943">លើកឡើង បន្ទាប់មកប៉ះម្តងទៀត</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />៖ សមកាលកម្មបានផ្អាក</translation> <translation id="3861638017150647085">មិនមានឈ្មោះអ្នកប្រើប្រាស់ "<ph name="USERNAME" />" ទេ</translation> <translation id="3861977424605124250">បង្ហាញនៅពេលចាប់ផ្ដើម</translation> <translation id="3862788408946266506">កម្មវិធីដែលមានលក្ខណៈមេនីហ្វេសថ៍ 'kiosk_only' ត្រូវបានដំឡើងជាមុខងារបញ្ជរ Chrome OS</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">កុំរំលឹកខ្ញុំលើកក្រោយ</translation> <translation id="4881695831933465202">បើក</translation> <translation id="4882312758060467256">មានសិទ្ធិចូលប្រើគេហទំព័រនេះ</translation> -<translation id="4882831918239250449">គ្រប់គ្រងរបៀបដែលប្រវត្តិរុករករបស់អ្នកត្រូវបានប្រើ ដើម្បីកំណត់ឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងអ្វីៗជាច្រើនទៀតស្របនឹងអ្នក</translation> <translation id="4882919381756638075">ជាធម្មតា គេហទំព័រប្រើមីក្រូហ្វូនរបស់អ្នកសម្រាប់មុខងារទំនាក់ទំនងដូចជា ការជជែកជាវីដេអូជាដើម</translation> <translation id="4883436287898674711">គេហទំព័រ <ph name="WEBSITE_1" /> ទាំងអស់</translation> <translation id="48838266408104654">កម្មវិធីគ្រប់គ្រងភារកិច្ច</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">បើកជាមួយកម្មវិធីមើលប្រព័ន្ធជានិច្ច</translation> <translation id="5794700615121138172">ថតដែល Linux បានចែករំលែក</translation> <translation id="5794786537412027208">ចាកចេញពីកម្មវិធី Chrome ទាំងអស់</translation> -<translation id="5797070761912323120">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក</translation> <translation id="5798079537501238810">គេហទំព័រអាចដំឡើងឧបករណ៍ដោះស្រាយការបង់ប្រាក់</translation> <translation id="579907812742603813">ខ្លឹមសារដែលមានការការពារ</translation> <translation id="579915268381781820">សោសុវត្ថិភាពរបស់អ្នកត្រូវបានដកចេញ។</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">កំពុងបើកដំណើរការទិន្នន័យទូរសព្ទចល័ត</translation> <translation id="6209838773933913227">កំពុងធ្វើបច្ចុប្បន្នភាពធាតុ</translation> <translation id="6209908325007204267">ឧបករណ៍របស់អ្នកមាន Chrome Enterprise Upgrade ប៉ុន្តែឈ្មោះអ្នកប្រើប្រាស់របស់អ្នកមិនពាក់ព័ន្ធជាមួយគណនីសហគ្រាសទេ។ សូមបង្កើតគណនីសហគ្រាសដោយចូលទៅកាន់ g.co/ChromeEnterpriseAccount នៅលើឧបករណ៍បន្ទាប់បន្សំ។</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />៖ សមកាលកម្មមិនដំណើរការទេ</translation> <translation id="6212039847102026977">បង្ហាញលក្ខណៈសម្បត្តិបណ្តាញកម្រិតខ្ពស់</translation> <translation id="6212168817037875041">បិទអេក្រង់</translation> <translation id="6212752530110374741">តំណអ៊ីមែល</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090">ទំព័រផ្ទៃខាងក្រោយ៖ <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">ហៅទូរសព្ទពី <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">រកមិនឃើញឧបករណ៍ HID ទេ</translation> +<translation id="7431991332293347422">គ្រប់គ្រងរបៀបដែលប្រវត្តិរុករករបស់អ្នកត្រូវបានប្រើប្រាស់ ដើម្បីកំណត់ឱ្យការស្វែងរក និងអ្វីៗជាច្រើនទៀតស្របនឹងអ្នក</translation> <translation id="7433708794692032816">ដោតកាតឆ្លាតវៃ ដើម្បីបន្តប្រើ <ph name="DEVICE_TYPE" /> របស់អ្នក</translation> <translation id="7433957986129316853">រក្សាទុកវា</translation> <translation id="7434509671034404296">អ្នកអភិវឌ្ឍន៍</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 1b1df01a..73a6ad88 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ಸಿಂಕ್ ಮಾಡಿರುವ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳು ಮತ್ತು ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲು, <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಭೇಟಿ ನೀಡಿ<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&ಮುದ್ರಿಸಿ...</translation> <translation id="1176471985365269981">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫೈಲ್ಗಳು ಅಥವಾ ಫೋಲ್ಡರ್ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> -<translation id="1177138678118607465">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು. ನೀವು ಇದನ್ನು myaccount.google.com/activitycontrols/search ನಲ್ಲಿ ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು</translation> <translation id="1177863135347784049">ಕಸ್ಟಮ್</translation> <translation id="1178581264944972037">ವಿರಾಮ</translation> <translation id="117916940443676133">ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಕೀಯನ್ನು ಪಿನ್ ಮೂಲಕ ಸಂರಕ್ಷಿಸಿಲ್ಲ. ಸೈನ್-ಇನ್ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಲು, ಮೊದಲು ಪಿನ್ ರಚಿಸಿ.</translation> @@ -557,7 +556,6 @@ <translation id="1602085790802918092">ವರ್ಚುವಲ್ ಯಂತ್ರವನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1603914832182249871">(ಅದೃಶ್ಯ)</translation> <translation id="1604432177629086300">ಪ್ರಿಂಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪ್ರಿಂಟರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: ಪಾಸ್ವರ್ಡ್ ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ</translation> <translation id="1607139524282324606">ಪ್ರವೇಶವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> <translation id="1607499585984539560">ಡೊಮೇನ್ ಜೊತೆಗೆ ಬಳಕೆದಾರರು ಸಂಯೋಜಿತವಾಗಿಲ್ಲ</translation> <translation id="1608626060424371292">ಈ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ</translation> @@ -1764,6 +1762,7 @@ <translation id="2889064240420137087">ಇದರೊಂದಿಗೆ Open Link...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> ಆ್ಯಪ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಬಳಸಬೇಕೆ?</translation> <translation id="2893168226686371498">ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್</translation> +<translation id="2893180576842394309">ಹುಡುಕಾಟ ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು.</translation> <translation id="2894757982205307093">ಗುಂಪಿನಲ್ಲಿ ಹೊಸ ಟ್ಯಾಬ್</translation> <translation id="289695669188700754">ಕೀಲಿ ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ನಿಮ್ಮ ಎಲ್ಲಾ ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ನೀವು ಮುಚ್ಚಿದಾಗ ಈ ಕಸ್ಟಮ್ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ</translation> @@ -2644,7 +2643,6 @@ <translation id="3856096718352044181">ಇವರು ಮಾನ್ಯವಾದ ಪೂರೈಕೆದಾರರೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ ಅಥವಾ ಆನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="3856800405688283469">ಸಮಯ ವಲಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="3857807444929313943">ಎತ್ತಿರಿ, ನಂತರ ಪುನಃ ಸ್ಪರ್ಶಿಸಿ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="3861638017150647085">ಬಳಕೆದಾರ ಹೆಸರು "<ph name="USERNAME" />" ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="3861977424605124250">ಪ್ರಾರಂಭ ಪುಟದಲ್ಲಿ ತೋರಿಸಿ</translation> <translation id="3862788408946266506">ChromeOS ಕಿಯೋಸ್ಕ್ ಮೋಡ್ನಲ್ಲಿ 'kiosk_only' ಮ್ಯಾನಿಫೆಸ್ಟ್ ಲಕ್ಷಣವನ್ನು ಹೊಂದಿರುವ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿರಬೇಕು</translation> @@ -3536,7 +3534,6 @@ <translation id="4881685975363383806">ಮುಂದಿನ ಬಾರಿ ನನಗೆ ಜ್ಞಾಪಿಸಬೇಡಿ</translation> <translation id="4881695831933465202">ತೆರೆ</translation> <translation id="4882312758060467256">ಈ ಸೈಟ್ಗೆ ಪ್ರವೇಶವಿದೆ</translation> -<translation id="4882831918239250449">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="4882919381756638075">ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ, ಮೈಕ್ರೋಫೋನ್ನಂತಹ ಸಂವಾದಾತ್ಮಕ ಫೀಚರ್ಗಳಿಗಾಗಿ ನಿಮ್ಮ ವೀಡಿಯೊ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಿಕೊಳ್ಳುತ್ತವೆ</translation> <translation id="4883436287898674711">ಎಲ್ಲಾ <ph name="WEBSITE_1" /> ಸೈಟ್ಗಳು</translation> <translation id="48838266408104654">&ಕಾರ್ಯ ನಿರ್ವಾಹಕ</translation> @@ -4335,7 +4332,6 @@ <translation id="5794414402486823030">ಯಾವಾಗಲೂ ಸಿಸ್ಟಂ ವೀಕ್ಷಕದ ಜೊತೆಗೆ ತೆರೆಯಿರಿ</translation> <translation id="5794700615121138172">Linux ಹಂಚಿಕೊಂಡ ಫೋಲ್ಡರ್ಗಳು</translation> <translation id="5794786537412027208">ಎಲ್ಲ Chrome ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ತ್ಯಜಿಸಿ</translation> -<translation id="5797070761912323120">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು</translation> <translation id="5798079537501238810">ಸೈಟ್ಗಳು ಪಾವತಿ ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಬಹುದು</translation> <translation id="579907812742603813">ಸಂರಕ್ಷಿಸಿದ ವಿಷಯ</translation> <translation id="579915268381781820">ನಿಮ್ಮ ಭದ್ರತೆ ಕೀ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ.</translation> @@ -4696,7 +4692,6 @@ <translation id="6208521041562685716">ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="6209838773933913227">ಕಾಂಪೊನೆಂಟ್ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> <translation id="6209908325007204267">ನಿಮ್ಮ ಸಾಧನವು Chrome ಎಂಟರ್ಪ್ರೈಸ್ ಅಪ್ಗ್ರೇಡ್ ಅನ್ನು ಒಳಗೊಂಡಿದೆ, ಆದರೆ ನಿಮ್ಮ ಬಳಕೆದಾರರ ಹೆಸರು ಯಾವುದೇ ಎಂಟರ್ಪ್ರೈಸ್ ಖಾತೆಯ ಜೊತೆಗೆ ಸಂಯೋಜಿತವಾಗಿಲ್ಲ. ಸೆಕೆಂಡರಿ ಸಾಧನದಲ್ಲಿ g.co/ChromeEnterpriseAccount ಗೆ ಭೇಟಿ ನೀಡುವ ಮೂಲಕ ಎಂಟರ್ಪ್ರೈಸ್ ಖಾತೆಯನ್ನು ರಚಿಸಿ.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ಸಿಂಕ್ ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ</translation> <translation id="6212039847102026977">ಸುಧಾರಿತ ನೆಟ್ವರ್ಕ್ ಗುಣಲಕ್ಷಣಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="6212168817037875041">ಡಿಸ್ಪ್ಲೇ ಅನ್ನು ಆಫ್ ಮಾಡಿ</translation> <translation id="6212752530110374741">ಇಮೇಲ್ ಲಿಂಕ್</translation> @@ -5785,6 +5780,7 @@ <translation id="7427348830195639090">ಹಿನ್ನೆಲೆ ಪುಟ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> ನಿಂದ ಕರೆ ಮಾಡಿ</translation> <translation id="7431719494109538750">ಯಾವುದೇ HID ಸಾಧನಗಳು ಕಂಡುಬಂದಿಲ್ಲ</translation> +<translation id="7431991332293347422">ಹುಡುಕಾಟ ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="7433708794692032816">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಬಳಕೆಯನ್ನು ಮುಂದುವರಿಸಲು ಸ್ಮಾರ್ಟ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ</translation> <translation id="7433957986129316853">ಇರಲಿ ಬಿಡಿ</translation> <translation id="7434509671034404296">ಡೆವಲಪರ್</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 4dd607e..9de606c 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">동기화된 모든 기기 및 Google 계정에서 인터넷 사용 기록을 삭제하려면 <ph name="BEGIN_LINK" />동기화 설정을 방문<ph name="END_LINK" />하세요.</translation> <translation id="1175364870820465910">인쇄(&P)</translation> <translation id="1176471985365269981">기기의 파일 또는 폴더 수정이 허용되지 않음</translation> -<translation id="1177138678118607465">검색, 광고 및 다른 Google 서비스를 맞춤설정하기 위하여 Google에서 인터넷 사용 기록을 사용할 수 있습니다. 이 설정은 언제든지 myaccount.google.com/activitycontrols/search에서 변경할 수 있습니다.</translation> <translation id="1177863135347784049">맞춤설정</translation> <translation id="1178581264944972037">일시중지</translation> <translation id="117916940443676133">보안 키가 PIN으로 보호되어 있지 않습니다. 로그인 데이터를 관리하려면 PIN을 만드세요.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">가상 머신 시작 중</translation> <translation id="1603914832182249871">(시크릿 모드)</translation> <translation id="1604432177629086300">인쇄할 수 없음: 프린터를 확인하고 다시 시도해 보세요</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: 비밀번호 동기화가 작동하지 않음</translation> <translation id="1607139524282324606">항목 삭제</translation> <translation id="1607499585984539560">사용자가 도메인과 연결되어 있지 않습니다.</translation> <translation id="1608626060424371292">이 사용자 삭제</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">다음으로 링크 열기...</translation> <translation id="2891922230654533301">기기를 사용하여 <ph name="APP_NAME" />에 로그인하시겠습니까?</translation> <translation id="2893168226686371498">기본 브라우저</translation> +<translation id="2893180576842394309">Google에서 내 방문 기록을 사용하여 Google 검색 및 다른 Google 서비스를 맞춤설정할 수 있습니다.</translation> <translation id="2894757982205307093">그룹에 새 탭 추가</translation> <translation id="289695669188700754">키 ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">시크릿 창을 모두 닫으면 맞춤 설정이 삭제됩니다.</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">유효한 제공업체인지 확인하거나 나중에 다시 시도하세요.</translation> <translation id="3856800405688283469">시간대 선택</translation> <translation id="3857807444929313943">손가락을 뗀 후 다시 터치</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: 동기화 중지됨</translation> <translation id="3861638017150647085">사용자 이름 ‘<ph name="USERNAME" />’은(는) 사용할 수 없습니다.</translation> <translation id="3861977424605124250">시작 시 표시</translation> <translation id="3862788408946266506">'kiosk_only' 매니페스트 속성을 사용하는 앱은 Chrome OS 키오스크 모드에 설치해야 합니다</translation> @@ -3541,7 +3539,6 @@ <translation id="4881685975363383806">다음번에 알리지 않음</translation> <translation id="4881695831933465202">열기</translation> <translation id="4882312758060467256">이 사이트의 액세스 권한이 있습니다.</translation> -<translation id="4882831918239250449">검색, 광고 등을 맞춤설정하는 데 인터넷 방문 기록이 사용되는 방식 관리</translation> <translation id="4882919381756638075">사이트에서는 일반적으로 영상 채팅 같은 커뮤니케이션 기능에 마이크를 사용합니다.</translation> <translation id="4883436287898674711">모든 <ph name="WEBSITE_1" /> 사이트</translation> <translation id="48838266408104654">작업 관리자(&T)</translation> @@ -4340,7 +4337,6 @@ <translation id="5794414402486823030">항상 시스템 뷰어로 열기</translation> <translation id="5794700615121138172">Linux 공유 폴더</translation> <translation id="5794786537412027208">모든 Chrome 앱 종료</translation> -<translation id="5797070761912323120">Google에서 내 방문 기록을 사용하여 Google 검색, 광고 및 다른 Google 서비스를 맞춤설정할 수 있습니다.</translation> <translation id="5798079537501238810">사이트에서 결제 핸들러를 설치할 수 있음</translation> <translation id="579907812742603813">보호된 콘텐츠</translation> <translation id="579915268381781820">보안 키가 삭제되었습니다.</translation> @@ -4701,7 +4697,6 @@ <translation id="6208521041562685716">모바일 데이터가 활성화됨</translation> <translation id="6209838773933913227">구성요소 업데이트 중</translation> <translation id="6209908325007204267">기기에 Chrome Enterprise 업그레이드가 있지만 사용자 이름이 엔터프라이즈 계정에 연결되어 있지 않았습니다. 다른 기기에서 다음 페이지를 방문하여 엔터프라이즈 계정을 만드세요. g.co/ChromeEnterpriseAccount</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: 동기화가 작동하지 않음</translation> <translation id="6212039847102026977">고급 네트워크 속성 표시</translation> <translation id="6212168817037875041">디스플레이 사용 중지</translation> <translation id="6212752530110374741">이메일 링크</translation> @@ -5790,6 +5785,7 @@ <translation id="7427348830195639090">백그라운드 페이지: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" />에서 전화 걸기</translation> <translation id="7431719494109538750">HID 기기를 찾을 수 없음</translation> +<translation id="7431991332293347422">검색 등을 맞춤설정하는 데 인터넷 방문 기록이 사용되는 방식 관리</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> 기기를 계속 사용하려면 스마트 카드 삽입</translation> <translation id="7433957986129316853">유지</translation> <translation id="7434509671034404296">개발자 정보</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 17b9c22..150ca63 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Бардык шайкештирилген түзмөктөрүңүздөгү жана Google аккаунтуңуздагы серептөө дайындарын тазалоо үчүн <ph name="BEGIN_LINK" />шайкештирүү жөндөөлөрүнө өтүңүз<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Басып чыгаруу…</translation> <translation id="1176471985365269981">Түзмөгүңүздөгү файлдарды же папкаларды түзөтө албайт</translation> -<translation id="1177138678118607465">Издөө жыйынтыктарын, жарнамаларды жана башка Google кызматтарын жекелештирүү үчүн Google серептөө таржымалыңызды колдонот. Аны myaccount.google.com/activitycontrols/search дарегине өтүп, каалаган убакта өзгөртүп алсаңыз болот</translation> <translation id="1177863135347784049">Өзгөчөлөштүрүлгөн</translation> <translation id="1178581264944972037">Бир азга токтотуу</translation> <translation id="117916940443676133">Коопсуздук ачкычы PIN код менен корголгон эмес. Кирүү дайындарын башкаруу үчүн, адегенде PIN код тузуңуз.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Виртуалдык машина иштетилип баштады</translation> <translation id="1603914832182249871">(Жашыруун)</translation> <translation id="1604432177629086300">Басылып чыгарылган жок. Принтерди текшерип, кайталап көрүңүз.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Сырсөздү шайкештирүү иштеген жок</translation> <translation id="1607139524282324606">Киргизүүнү тазалоо</translation> <translation id="1607499585984539560">Колдонуучу домен менен байланышкан эмес</translation> <translation id="1608626060424371292">Бул колдонуучуну алып салуу</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Шилтемени төмөнкү менен ачуу…</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> колдонмосуна түзмөгүңүздөн киресизби?</translation> <translation id="2893168226686371498">Демейки серепчи</translation> +<translation id="2893180576842394309">Издөө жана башка Google кызматтарын жекечелештирүү үчүн, Google таржымалыңызды колдонушу мүмкүн</translation> <translation id="2894757982205307093">Топтогу жаңы өтмөк</translation> <translation id="289695669188700754">Ачкычтын далдаштырма коду: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Бул жеке жөндөө бардык Жашыруун терезелер жабылганда өчүрүлөт</translation> @@ -1908,6 +1907,7 @@ <translation id="3027296729579831126">Nearby Share функциясын күйгүзүү</translation> <translation id="3029466929721441205">Стилус куралдарын текчеде көрсөтүү</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> жаңыртууну бүгүн жүктөп алууну талап кылууда. Бул жаңыртуу Интернетке байланышканыңызда автоматтык түрдө жүктөлүп алынат.}other{<ph name="MANAGER" /> жаңыртууну мөөнөтү бүткөнгө чейин жүктөп алууну талап кылууда. Бул жаңыртуу Интернетке байланышканыңызда автоматтык түрдө жүктөлүп алынат.}}</translation> +<translation id="3030967311408872958">Күн баткандан күн чыкканга чейин</translation> <translation id="3031417829280473749">Агент X</translation> <translation id="3031557471081358569">Импорттоло турган нерселерди тандаңыз:</translation> <translation id="3036327949511794916">Бул <ph name="DEVICE_TYPE" /> түзмөгүн кайтарып берүү мөөнөтү өтүп кетти.</translation> @@ -2651,7 +2651,6 @@ <translation id="3856096718352044181">Бул жарамдуу кызмат көрсөтүүчү экенин текшерип, кайра аракет кылыңыз</translation> <translation id="3856800405688283469">Убакыт алкагын тандоо</translation> <translation id="3857807444929313943">Көтөрүп, кайра тийип коюңуз</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Шайкештирүү тындырылды</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" колдонуучунун аты жеткиликсиз</translation> <translation id="3861977424605124250">Башында көрсөтүү</translation> <translation id="3862788408946266506">"Толук экран_гана" манифест атрибуту камтылган колдонмо Chrome OS толук экран режиминде орнотулушу керек</translation> @@ -3543,7 +3542,6 @@ <translation id="4881685975363383806">Кийинки жолу эскертилбесин</translation> <translation id="4881695831933465202">Ачуу</translation> <translation id="4882312758060467256">Бул сайтка кирүү мүмкүнчүлүгү бар</translation> -<translation id="4882831918239250449">Издөөнү, жарнамаларды жана башка кызматтарды жекечелештирүү үчүн серептөө таржымалыңыз кандайча пайдаланыларын көзөмөлдөңүз</translation> <translation id="4882919381756638075">Сайттар видео маек сыяктуу байланыш функциялары үчүн микрофонуңузду колдонот</translation> <translation id="4883436287898674711">Бардык <ph name="WEBSITE_1" /> сайттар</translation> <translation id="48838266408104654">&Тапшырмаларды башкаргыч</translation> @@ -4090,6 +4088,7 @@ <translation id="5502500733115278303">Firefox'тон импорттолгон</translation> <translation id="5502915260472117187">Бала</translation> <translation id="5503982651688210506"><ph name="HOST" /> сайтына камера менен микрофонду колдонуп, камераны жылдырууга уруксат берүүгө макул болуу</translation> +<translation id="5504909642107847870">Купуялык жана коопсуздук каражаттары менен таанышуу</translation> <translation id="5505264765875738116">Сайттар билдирмелерди жөнөтүүнү сурана алышпайт</translation> <translation id="5505307013568720083">Сыя түгөндү</translation> <translation id="5505794066310932198">Commander функциясын өчүрүү/күйгүзүү</translation> @@ -4341,7 +4340,6 @@ <translation id="5794414402486823030">Ар дайым тутум көрсөткүч менен ачылсын</translation> <translation id="5794700615121138172">Linux'тун бөлүшүлгөн папкалары</translation> <translation id="5794786537412027208">Бардык Chrome Колдонмолорунан чыгуу</translation> -<translation id="5797070761912323120">Издөө, жарнама жана башка Google кызматтарын жекечелештирүү үчүн, Google таржымалыңызды колдонушу мүмкүн</translation> <translation id="5798079537501238810">Сайттар төлөм иштеткичтерин орното алат</translation> <translation id="579907812742603813">корголгон мазмун</translation> <translation id="579915268381781820">Коопсуздук ачкычыңыз өчүрүлдү.</translation> @@ -4702,7 +4700,6 @@ <translation id="6208521041562685716">Мобилдик дайындар жандырылууда</translation> <translation id="6209838773933913227">Компонентти жаңыртуу</translation> <translation id="6209908325007204267">Түзмөгүңүздө Chrome Enterprise Upgrade камтылган, бирок колдонуучунун аты ишкананын аккаунту менен байланышкан эмес. Кошумча түзмөгүңүздөн g.co/ChromeEnterpriseAccount бөлүмүнө өтүп, ишкана аккаунтун түзүңүз.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Шайкештирүү иштебей жатат</translation> <translation id="6212039847102026977">Тармактын өркүндөтүлгөн мүмкүнчүлүктөрү көрүнсүн</translation> <translation id="6212168817037875041">Дисплейди өчүрүү</translation> <translation id="6212752530110374741">Шилтемени электрондук кат менен жөнөтүү</translation> @@ -4919,6 +4916,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> - Bluetooth скандоодо</translation> <translation id="6445450263907939268">Эгер бул өзгөртүүлөрдү каалаган эмес болсоңуз, мурунку жөндөөлөрүңүздү калыбына келтире аласыз.</translation> <translation id="6446213738085045933">Иш тактада кыска жол түзүү</translation> +<translation id="6447210166804596538">Эң маанилүү купуялык жана коопсуздук көзөмөлдөө каражаттарын бир жерден көрүңүз</translation> <translation id="6447842834002726250">Кукилер</translation> <translation id="6450876761651513209">Купуялуулугуңуз боюнча жөндөөлөрдү өзгөртүңүз</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> жана дагы башка 1 өтмөк}other{<ph name="PAGE_TITLE" /> жана дагы башка # өтмөк}}</translation> @@ -5790,6 +5788,7 @@ <translation id="7427348830195639090">Фондук бет: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> келген чалуу</translation> <translation id="7431719494109538750">HID түзмөктөрү табылган жок</translation> +<translation id="7431991332293347422">Издөөнү жана башка кызматтарды жекечелештирүү үчүн серептөө таржымалыңыз кандайча пайдаланыларын көзөмөлдөңүз</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> түзмөгүңүздү колдонууну улантуу үчүн акылдуу картаны салыңыз</translation> <translation id="7433957986129316853">Жок, кала берсин</translation> <translation id="7434509671034404296">Иштеп чыгуучу</translation> @@ -6899,6 +6898,7 @@ <translation id="8655972064210167941">Сырсөзүңүз тастыкталбай койгондуктан, аккаунтка кире албай калдыңыз. Администраторуңузга кайрылыңыз же кайталап көрүңүз.</translation> <translation id="8657393004602556571">Пикирди өчүрөсүзбү?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> колдонмосу экраныңызды жана аудио файлын <ph name="TAB_NAME" /> менен бөлүшүп жатат.</translation> +<translation id="8660073998956001352">Издөө каражаттарыңыз</translation> <translation id="8661290697478713397">Шилтемени жашыр&уун терезеде ачуу</translation> <translation id="8662671328352114214"><ph name="TYPE" /> тармагына кошулуу</translation> <translation id="8662795692588422978">Адамдар</translation> @@ -7085,6 +7085,7 @@ <translation id="8845001906332463065">Жардам алуу</translation> <translation id="8846132060409673887">Компьютердин өндүрүүчүсүн жана үлгүсүн окуу</translation> <translation id="8846163936679269230">eSIM-карта профилдерин баштапкы абалга келтирүү</translation> +<translation id="8846746259444262774">Орнотулбай калды</translation> <translation id="8847523528195140327">Капкагы жабылып турганда аккаунттан чыгарылсын</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Жашырылды</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 4199d81..9b4f4bc 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ເພື່ອລຶບລ້າງຂໍ້ມູນການທ່ອງເວັບອອກຈາກອຸປະກອນທີ່ຊິ້ງຂໍ້ມູນຂອງທ່ານທັງໝົດ ແລະ ບັນຊີ Google ຂອງທ່ານ, ກະລຸນາ <ph name="BEGIN_LINK" />ເຂົ້າຫາການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນ<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">ພິມ...</translation> <translation id="1176471985365269981">ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ແກ້ໄຂໄຟລ໌ ຫຼື ໂຟນເດີຢູ່ອຸປະກອນຂອງທ່ານ</translation> -<translation id="1177138678118607465">Google ອາດຈະໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານເພື່ອປັບແຕ່ງການຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນໆຂອງ Google ໃຫ້ເປັນແບບສ່ວນຕົວ. ທ່ານສາມາດປ່ຽນສິ່ງນີ້ໄດ້ທຸກເວລາທີ່ myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">ກໍານົດເອງ</translation> <translation id="1178581264944972037">ຢຸດຊົ່ວຄາວ</translation> <translation id="117916940443676133">ກະແຈຄວາມປອດໄພຂອງທ່ານບໍ່ໄດ້ຮັບການປົກປ້ອງດ້ວຍ PIN. ເພື່ອຈັດການຂໍ້ມູນການເຂົ້າສູ່ລະບົບ, ກ່ອນອື່ນໃຫ້ສ້າງ PIN.</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">ກຳລັງເລີ່ມເຄື່ອງສະເໝືອນ</translation> <translation id="1603914832182249871">(ບໍ່ເຜີຍຕົນຕົວ)</translation> <translation id="1604432177629086300">ບໍ່ສາມາດພິມໄດ້. ກວດເບິ່ງເຄື່ອງພິມ ແລ້ວລອງອີກຄັ້ງ.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: ການຊິ້ງຂໍ້ມູນລະຫັດຜ່ານບໍ່ເຮັດວຽກ</translation> <translation id="1607139524282324606">ລຶບລ້າງລາຍການຂໍ້ມູນ</translation> <translation id="1607499585984539560">ຜູ້ໃຊ້ບໍ່ມີສ່ວນກ່ຽວຂ້ອງກັບໂດເມນ</translation> <translation id="1608626060424371292">ເອົາຜູ້ໃຊ້ນີ້ອອກໄປ</translation> @@ -1769,6 +1767,7 @@ <translation id="2889064240420137087">ເປີດລິ້ງກັບ...</translation> <translation id="2891922230654533301">ໃຊ້ອຸປະກອນຂອງທ່ານເພື່ອເຂົ້າສູ່ລະບົບ <ph name="APP_NAME" /> ບໍ?</translation> <translation id="2893168226686371498">ບຣາວເຊີມາດຕະຖານ</translation> +<translation id="2893180576842394309">Google ອາດຈະໃຊ້ປະຫວັດຂອງທ່ານເພື່ອປັບແຕ່ງຊອກຫາ ແລະ ການບໍລິການອື່ນຂອງ Google</translation> <translation id="2894757982205307093">ແຖບໃໝ່ໃນກຸ່ມ</translation> <translation id="289695669188700754">ID ປຸ່ມ: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ລະບົບຈະລຶບການຕັ້ງຄ່າແບບກຳນົດເອງນີ້ອອກເມື່ອທ່ານປິດໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນທັງໝົດຂອງທ່ານ</translation> @@ -2649,7 +2648,6 @@ <translation id="3856096718352044181">ກະລຸນາຢັ້ງຢືນວ່ານີ້ແມ່ນຜູ້ໃຫ້ບໍລິການທີ່ຖືກຕ້ອງ ຫຼື ລອງໃໝ່ໃນພາຍຫຼັງ</translation> <translation id="3856800405688283469">ເລືອກເຂດເວລາ</translation> <translation id="3857807444929313943">ຍົກຂຶ້ນ, ຈາກນັ້ນແຕະອີກຄັ້ງ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: ຢຸດການຊິ້ງຂໍ້ມູນໄວ້ແລ້ວ</translation> <translation id="3861638017150647085">ຊື່ຜູ້ໃຊ້ "<ph name="USERNAME" />" ບໍ່ສາມາດໃຊ້ໄດ້</translation> <translation id="3861977424605124250">ສະແດງໃນເວລາສະຕາດອັບ</translation> <translation id="3862788408946266506">ຕ້ອງຕິດຕັ້ງແອັບທີ່ມີຄຸນລັກສະນະ 'kiosk_only' manifest ຢູ່ໃນໂໝດ Chrome OS kiosk</translation> @@ -3541,7 +3539,6 @@ <translation id="4881685975363383806">ຢ່າແຈ້ງເຕືອນຂ້ອຍໃນເທື່ອຕໍ່ໄປ</translation> <translation id="4881695831933465202">ເປີດ</translation> <translation id="4882312758060467256">ມີສິດເຂົ້າເຖິງເວັບໄຊນີ້</translation> -<translation id="4882831918239250449">ຄວບຄຸມວ່າຈະໃຫ້ໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານແນວໃດເພື່ອປັບແຕ່ງການຊອກຫາ, ໂຄສະນາ ແລະ ອື່ນໆອີກໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="4882919381756638075">ໂດຍປົກກະຕິ ເວັບໄຊຈະໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານສຳລັບຄຸນສົມບັດການສື່ສານ ເຊັ່ນ: ການສົນທະນາວິດີໂອ</translation> <translation id="4883436287898674711">ທຸກເວັບໄຊທ໌ <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">ຕົວຈັດການໜ້າວຽກ</translation> @@ -4340,7 +4337,6 @@ <translation id="5794414402486823030">ເປີດກັບຕົວເບິ່ງລະບົບທຸກຄັ້ງ</translation> <translation id="5794700615121138172">ໂຟນເດີທີ່ແບ່ງປັນຂອງ Linux</translation> <translation id="5794786537412027208">ອອກທຸກແອັບ Chrome</translation> -<translation id="5797070761912323120">Google ອາດຈະໃຊ້ປະຫວັດຂອງທ່ານເພື່ອປັບແຕ່ງຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນຂອງ Google</translation> <translation id="5798079537501238810">ເວັບໄຊສາມາດຕິດຕັ້ງຕົວຈັດການການຈ່າຍເງິນໄດ້</translation> <translation id="579907812742603813">ເນື້ອຫາທີ່ໄດ້ຮັບການປົກປ້ອງ</translation> <translation id="579915268381781820">ຖອດກະແຈຄວາມປອດໄພອອກແລ້ວ.</translation> @@ -4701,7 +4697,6 @@ <translation id="6208521041562685716">ກຳລັງເປີດນຳໃຊ້ອິນເຕີເນັດມືຖື</translation> <translation id="6209838773933913227">ກຳລັງອັບເດດອົງປະກອບ</translation> <translation id="6209908325007204267">ອຸປະກອນຂອງທ່ານຮວມມີການອັບເກຣດ Chrome Enterprise, ແຕ່ຊື່ຜູ້ໃຊ້ຂອງທ່ານບໍ່ເຊື່ອມໂຍງກັບບັນຊີວິສາຫະກິດ. ກະລຸນາສ້າງບັນຊີວິສາຫະກິດໂດຍການເຂົ້າຫາ g.co/ChromeEnterpriseAccount ໃນອຸປະກອນສຳຮອງ.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ການຊິ້ງຂໍ້ມູນໃຊ້ບໍ່ໄດ້</translation> <translation id="6212039847102026977">ສະແດງຄຸນລັກສະນະເຄືອຂ່າຍຂັ້ນສູງ</translation> <translation id="6212168817037875041">ປິດໜ້າຈໍ</translation> <translation id="6212752530110374741">ອີເມວລິ້ງ</translation> @@ -5790,6 +5785,7 @@ <translation id="7427348830195639090">ໜ້າພື້ນຫຼັງ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">ການໂທຈາກ <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">ບໍ່ພົບອຸປະກອນ HID ໃດ</translation> +<translation id="7431991332293347422">ຄວບຄຸມວ່າຈະໃຫ້ໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານແນວໃດເພື່ອປັບແຕ່ງການຊອກຫາ ແລະ ອື່ນໆອີກໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="7433708794692032816">ສຽບບັດອັດສະລິຍະເພື່ອສືບຕໍ່ໃຊ້ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ</translation> <translation id="7433957986129316853">ເກັບໄວ້</translation> <translation id="7434509671034404296">ຜູ້ພັດທະນາ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index a033466..71270be 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Norėdami išvalyti naršymo duomenis iš sinchronizuotų įrenginių ir „Google“ paskyros, <ph name="BEGIN_LINK" />apsilankykite sinchronizavimo nustatymuose<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Spausdinti...</translation> <translation id="1176471985365269981">Neleidžiama įrenginyje redaguoti failų ar aplankų</translation> -<translation id="1177138678118607465">Naudodama naršymo istoriją „Google“ gali suasmeninti Paieškos skelbimus ir kitas „Google“ paslaugas. Galite bet kada tai pakeisti apsilankę myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Priskirtas</translation> <translation id="1178581264944972037">Pristabdyti</translation> <translation id="117916940443676133">Saugos raktas neapsaugotas PIN kodu. Kad galėtumėte tvarkyti prisijungimo duomenis, pirmiausia sukurkite PIN kodą.</translation> @@ -558,7 +557,6 @@ <translation id="1602085790802918092">Paleidžiamas virtualus įrenginys</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Nepavyko atspausdinti. Patikrinkite spausdintuvą ir bandykite dar kartą.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: slaptažodžio sinchronizavimas neveikia</translation> <translation id="1607139524282324606">Išvalyti įrašą</translation> <translation id="1607499585984539560">Naudotojas nesusietas su domenu</translation> <translation id="1608626060424371292">Pašalinti šį naudotoją</translation> @@ -1775,6 +1773,7 @@ <translation id="2889064240420137087">Atidaryti nuorodą naudojant...</translation> <translation id="2891922230654533301">Naudoti jūsų įrenginį prisijungiant prie „<ph name="APP_NAME" />“?</translation> <translation id="2893168226686371498">Numatytoji naršyklė</translation> +<translation id="2893180576842394309">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką ir kitas „Google“ paslaugas</translation> <translation id="2894757982205307093">Naujas skirtukas grupėje</translation> <translation id="289695669188700754">Rakto ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Šis tinkintas nustatymas bus pašalintas, kai uždarysite visus inkognito langus</translation> @@ -2655,7 +2654,6 @@ <translation id="3856096718352044181">Patvirtinkite, kad tai yra tinkamas paslaugų teikėjas, arba vėliau bandykite dar kartą</translation> <translation id="3856800405688283469">Pasirinkti laiko juostą</translation> <translation id="3857807444929313943">Patraukite ir vėl prilieskite</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinchronizavimas pristabdytas</translation> <translation id="3861638017150647085">Naudotojo vardas „<ph name="USERNAME" />“ nepasiekiamas</translation> <translation id="3861977424605124250">Rodyti paleidžiant</translation> <translation id="3862788408946266506">Programa su aprašo atributu „kiosk_only“ turi būti įdiegta „Chrome“ OS viešojo terminalo režimu</translation> @@ -3547,7 +3545,6 @@ <translation id="4881685975363383806">Nepriminti kitą kartą</translation> <translation id="4881695831933465202">Atidaryti</translation> <translation id="4882312758060467256">Turi prieigą prie šios svetainės</translation> -<translation id="4882831918239250449">Naršymo istorijos naudojimo paieškai, skelbimams ir kitoms funkcijoms suasmeninti valdymas</translation> <translation id="4882919381756638075">Paprastai svetainėse naudojamas mikrofonas bendravimo funkcijoms, pvz., vaizdo pokalbiams, vykdyti</translation> <translation id="4883436287898674711">Visos <ph name="WEBSITE_1" /> svetainės</translation> <translation id="48838266408104654">&Užduočių tvarkytuvė</translation> @@ -4347,7 +4344,6 @@ <translation id="5794414402486823030">Visada atidaryti naudojant sistemos peržiūros priemonę</translation> <translation id="5794700615121138172">„Linux“ bendrinami aplankai</translation> <translation id="5794786537412027208">Uždaryti visas „Chrome“ programas</translation> -<translation id="5797070761912323120">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas</translation> <translation id="5798079537501238810">Svetainėse galima įdiegti mokėjimo dorokles</translation> <translation id="579907812742603813">saugomas turinys</translation> <translation id="579915268381781820">Saugos raktas buvo pašalintas.</translation> @@ -4708,7 +4704,6 @@ <translation id="6208521041562685716">Aktyvinami mobilieji duomenys</translation> <translation id="6209838773933913227">Komponento atnaujinimas</translation> <translation id="6209908325007204267">Prie jūsų įrenginio yra pridėtas „Chrome“ įmonei skirtos versijos licencijos naujovinimas, bet jūsų naudotojo vardas nesusietas su įmonės paskyra. Sukurkite įmonės paskyrą antriniame įrenginyje apsilankę adresu g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinchronizavimas neveikia</translation> <translation id="6212039847102026977">Rodyti išplėstines tinklo nuosavybes</translation> <translation id="6212168817037875041">Išjungti ekraną</translation> <translation id="6212752530110374741">Siųsti nuorodą el. paštu</translation> @@ -5797,6 +5792,7 @@ <translation id="7427348830195639090">Foninis puslapis: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Skambina <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nerasta jokių HID įrenginių</translation> +<translation id="7431991332293347422">Naršymo istorijos naudojimo paieškai ir kitoms funkcijoms suasmeninti valdymas</translation> <translation id="7433708794692032816">Įdėkite išmaniąją kortelę, kad galėtumėte toliau naudoti „<ph name="DEVICE_TYPE" />“ įrenginį</translation> <translation id="7433957986129316853">Palikti</translation> <translation id="7434509671034404296">Vykdymo programa</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 9a21b4b..491e703 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Lai notīrītu pārlūkošanas datus no visām savām sinhronizētajām ierīcēm un Google konta, <ph name="BEGIN_LINK" />pārejiet uz sinhronizācijas iestatījumiem<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Drukāt...</translation> <translation id="1176471985365269981">Nedrīkst rediģēt failus vai mapes jūsu ierīcē</translation> -<translation id="1177138678118607465">Google var izmantot jūsu pārlūkošanas vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus. Jūs jebkurā laikā to varat mainīt vietnē myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Pielāgota</translation> <translation id="1178581264944972037">Pauzēt</translation> <translation id="117916940443676133">Jūsu drošības atslēga nav aizsargāta ar PIN. Lai pārvaldītu pierakstīšanās datus, vispirms izveidojiet PIN.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Virtuālās mašīnas startēšana</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Nevarēja izdrukāt. Pārbaudiet printeri un mēģiniet vēlreiz.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: paroļu sinhronizācija nedarbojas</translation> <translation id="1607139524282324606">Notīrīt ierakstu</translation> <translation id="1607499585984539560">Lietotājs nav saistīts ar domēnu</translation> <translation id="1608626060424371292">Noņemt šo lietotāju</translation> @@ -1759,6 +1757,7 @@ <translation id="2889064240420137087">Atvērt saiti ar...</translation> <translation id="2891922230654533301">Vai vēlaties izmantot ierīci, lai pierakstītos lietotnē <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Noklusējuma pārlūks</translation> +<translation id="2893180576842394309">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu un citus Google pakalpojumus.</translation> <translation id="2894757982205307093">Jauna cilne grupā</translation> <translation id="289695669188700754">Atslēgas ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Aizverot visus inkognito režīma logus, šis pielāgotais iestatījums tiks noņemts.</translation> @@ -2639,7 +2638,6 @@ <translation id="3856096718352044181">Pārbaudiet, vai pakalpojumu sniedzējs ir derīgs, vai arī vēlāk mēģiniet vēlreiz</translation> <translation id="3856800405688283469">Laika joslas atlasīšana</translation> <translation id="3857807444929313943">Paceliet un pieskarieties vēlreiz</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinhronizācija ir apturēta</translation> <translation id="3861638017150647085">Lietotājvārds “<ph name="USERNAME" />” nav pieejams.</translation> <translation id="3861977424605124250">Rādīt palaišanas brīdī</translation> <translation id="3862788408946266506">Lai instalētu lietotni ar manifesta atribūtu kiosk_only, ir jāizmanto Chrome OS kioska režīms.</translation> @@ -3530,7 +3528,6 @@ <translation id="4881685975363383806">Nākamreiz vairs neatgādināt</translation> <translation id="4881695831933465202">Atvērt</translation> <translation id="4882312758060467256">Var piekļūt šai vietnei</translation> -<translation id="4882831918239250449">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas, reklāmu un cita satura personalizēšanai</translation> <translation id="4882919381756638075">Parasti vietnēs mikrofons tiek izmantots, lai nodrošinātu noteiktas saziņas funkcijas, piemēram, video tērzēšanu.</translation> <translation id="4883436287898674711">Visās <ph name="WEBSITE_1" /> vietnēs</translation> <translation id="48838266408104654">Uz&devumu pārvaldnieks</translation> @@ -4329,7 +4326,6 @@ <translation id="5794414402486823030">Vienmēr atvērt, izmantojot sistēmas skatītāju</translation> <translation id="5794700615121138172">Linux koplietotās mapes</translation> <translation id="5794786537412027208">Aizvērt visas Chrome lietotnes</translation> -<translation id="5797070761912323120">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus.</translation> <translation id="5798079537501238810">Atļaut vietnēm instalēt maksājumu apdarinātājus</translation> <translation id="579907812742603813">aizsargāts saturs</translation> <translation id="579915268381781820">Drošības atslēga tika noņemta.</translation> @@ -4690,7 +4686,6 @@ <translation id="6208521041562685716">Tiek aktivizēti mobilie dati</translation> <translation id="6209838773933913227">Komponentu atjaunināšana</translation> <translation id="6209908325007204267">Jūsu ierīces komplektācijā ir iekļauts Chrome uzņēmuma versijas jauninājums, taču jūsu lietotājvārds nav saistīts ar uzņēmuma kontu. Lūdzu, izveidojiet uzņēmuma kontu, otrā ierīcē apmeklējot vietni g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinhronizācija nedarbojas</translation> <translation id="6212039847102026977">Rādīt tīkla papildu rekvizītus</translation> <translation id="6212168817037875041">Izslēgt displeju</translation> <translation id="6212752530110374741">Sūtīt saiti e-pasta ziņojumā</translation> @@ -5776,6 +5771,7 @@ <translation id="7427348830195639090">Fona lapa: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Zvanīt no ierīces <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Netika atrasta neviena HID ierīce.</translation> +<translation id="7431991332293347422">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas un cita satura personalizēšanai</translation> <translation id="7433708794692032816">Lai jūs varētu turpināt izmantot savu <ph name="DEVICE_TYPE" /> ierīci, ievietojiet viedkarti</translation> <translation id="7433957986129316853">Paturēt</translation> <translation id="7434509671034404296">Izstrādātājs</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 9b912f2..5627413 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">За да ги избришете податоците од прелистувањето од сите ваши синхронизирани уреди и од сметката на Google, <ph name="BEGIN_LINK" />одете на поставките за синхронизација<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Печати...</translation> <translation id="1176471985365269981">Не им е дозволено да ги изменуваат датотеките или папките на уредот</translation> -<translation id="1177138678118607465">Google може да ја користи историјата на прелистување за да ги персонализира „Пребарување“, рекламите и другите услуги на Google. Ова може да го промените во секое време наmyaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Приспособено</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="117916940443676133">Вашиот безбедносен клуч не е заштитен со PIN. За да управувате со податоците за најавување, прво создајте PIN.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">Се стартува виртуелната машина</translation> <translation id="1603914832182249871">(Инкогнито)</translation> <translation id="1604432177629086300">Не може да се отпечати. Проверете го печатачот и обидете се повторно.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: синхронизацијата на лозинките не работи</translation> <translation id="1607139524282324606">Исчисти го записот</translation> <translation id="1607499585984539560">Корисникот не е поврзан со доменот</translation> <translation id="1608626060424371292">Отстрани го овој корисник</translation> @@ -1773,6 +1771,7 @@ <translation id="2889064240420137087">Отвори ја врската со…</translation> <translation id="2891922230654533301">Дали сакате да го користите вашиот уред за најавување на <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Стандарден прелистувач</translation> +<translation id="2893180576842394309">Google може да ја користи вашата историја за да го персонализира „Пребарувањето“ и другите услуги на Google</translation> <translation id="2894757982205307093">Нова картичка во групата</translation> <translation id="289695669188700754">ИД на клуч: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Оваа приспособена поставка ќе биде отстранета кога ќе ги затворите сите ваши прозорци „Инкогнито“</translation> @@ -2653,7 +2652,6 @@ <translation id="3856096718352044181">Потврдете дека ова е вистински давател на услуги или обидете се повторно подоцна</translation> <translation id="3856800405688283469">Изберете временска зона</translation> <translation id="3857807444929313943">Подигнете и допрете повторно</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: синхронизацијата е паузирана</translation> <translation id="3861638017150647085">Корисничкото име „<ph name="USERNAME" />“ не е достапно</translation> <translation id="3861977424605124250">Прикажувај при стартување</translation> <translation id="3862788408946266506">Апликацијата со атрибут на манифестот „kiosk_only“ мора да се инсталира во режим на киоск на Chrome OS</translation> @@ -3545,7 +3543,6 @@ <translation id="4881685975363383806">Не потсетувај ме следниот пат</translation> <translation id="4881695831933465202">Отвори</translation> <translation id="4882312758060467256">Има пристап до сајтов</translation> -<translation id="4882831918239250449">Контролирајте како вашата историја на прелистување се користи за персонализирање на „Пребарувањето“, рекламите и друго</translation> <translation id="4882919381756638075">Сајтовите обично го користат микрофонот за функциите за комуникација како што е видеоразговорот</translation> <translation id="4883436287898674711">Сите локации на <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Управник со &задачи</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">Секогаш отворај со прегледувачот на системот</translation> <translation id="5794700615121138172">Споделени папки на Linux</translation> <translation id="5794786537412027208">Затвори ги сите апликации на Chrome</translation> -<translation id="5797070761912323120">Google може да ја користи вашата историја за да го персонализира „Пребарувањето“, рекламите и другите услуги на Google</translation> <translation id="5798079537501238810">Сајтовите може да инсталираат ракувачи со плаќања</translation> <translation id="579907812742603813">заштитени содржини</translation> <translation id="579915268381781820">Вашиот безбедносен клуч е отстранет.</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">Мобилниот интернет се активира</translation> <translation id="6209838773933913227">Ажурирање компонента</translation> <translation id="6209908325007204267">Вашиот уред содржи Chrome Enterprise Upgrade, но вашето корисничко име не е поврзано со сметка на организација. Создајте сметка на организација така што ќе отидете на g.co/ChromeEnterpriseAccount на втор уред.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: синхронизацијата не функционира</translation> <translation id="6212039847102026977">Покажи ги напредните својства на мрежата</translation> <translation id="6212168817037875041">Исклучи го екранот</translation> <translation id="6212752530110374741">Испрати е-порака со линк</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090">Страница во заднина: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Јавете се од <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Не се најдени HID-уреди</translation> +<translation id="7431991332293347422">Контролирајте како вашата историја на прелистување се користи за персонализирање на „Пребарувањето“ и друго</translation> <translation id="7433708794692032816">Вметнете паметна картичка за да продолжите да го користите вашиот <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Задржи</translation> <translation id="7434509671034404296">Програмер</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index f7ba1f7..9479099 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">നിങ്ങളുടെ സമന്വയിപ്പിച്ച എല്ലാ ഉപകരണങ്ങളിൽ നിന്നും Google അക്കൗണ്ടിൽ നിന്നും ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കാൻ, <ph name="BEGIN_LINK" />സമന്വയ ക്രമീകരണം സന്ദർശിക്കുക<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&അച്ചടിക്കൂ...</translation> <translation id="1176471985365269981">നിങ്ങളുടെ ഉപകരണത്തിൽ ഫയലുകളോ ഫോൾഡറുകളോ എഡിറ്റ് ചെയ്യാൻ അനുവാദമില്ല</translation> -<translation id="1177138678118607465">തിരയൽ, പരസ്യങ്ങൾ, മറ്റ് Google സേവനങ്ങൾ എന്നിവ വ്യക്തിപരമാക്കാൻ, നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം Google ഉപയോഗിച്ചേക്കാം. ഏത് സമയത്തും നിങ്ങൾക്ക് ഇത് myaccount.google.com/activitycontrols/search സന്ദർശിച്ച് മാറ്റാവുന്നതാണ്</translation> <translation id="1177863135347784049">ഇഷ്ടാനുസൃതം</translation> <translation id="1178581264944972037">അല്പംനിര്ത്തൂ</translation> <translation id="117916940443676133">പിൻ ഉപയോഗിച്ച് നിങ്ങളുടെ സുരക്ഷാ കീ പരിരക്ഷിച്ചിട്ടില്ല. സൈൻ ഇൻ ഡാറ്റ മാനേജ് ചെയ്യാൻ, ആദ്യം ഒരു പിൻ സൃഷ്ടിക്കുക.</translation> @@ -551,7 +550,6 @@ <translation id="1602085790802918092">വെർച്വൽ മെഷീൻ ആരംഭിക്കുന്നു</translation> <translation id="1603914832182249871">(ആള്മാറാട്ടം)</translation> <translation id="1604432177629086300">പ്രിന്റ് ചെയ്യാനായില്ല. പ്രിന്റർ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: പാസ്വേഡ് സമന്വയം പ്രവർത്തിക്കുന്നില്ല</translation> <translation id="1607139524282324606">എൻട്രി മായ്ക്കുക</translation> <translation id="1607499585984539560">ഉപയോക്താവിന് ഡൊമെയ്നുമായി ബന്ധമില്ല</translation> <translation id="1608626060424371292">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation> @@ -1756,6 +1754,7 @@ <translation id="2889064240420137087">ഇനിപ്പറയുന്നതിൽ ലിങ്ക് തുറക്കുക...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> ആപ്പിൽ സൈൻ ചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം ഉപയോഗിക്കണോ?</translation> <translation id="2893168226686371498">ഡിഫോൾട്ട് ബ്രൗസര്</translation> +<translation id="2893180576842394309">തിരയലും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation> <translation id="2894757982205307093">ഗ്രൂപ്പിലെ പുതിയ ടാബ്</translation> <translation id="289695669188700754">കീ ഐഡി: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">നിങ്ങളുടെ എല്ലാ അദൃശ്യ വിൻഡോകളും അടയ്ക്കുമ്പോൾ, ഈ ഇഷ്ടാനുസൃത ക്രമീകരണം നീക്കം ചെയ്യും</translation> @@ -2635,7 +2634,6 @@ <translation id="3856096718352044181">ഇത് സാധുതയുള്ളൊരു ദാതാവാണെന്ന് പരിശോധിച്ചുറപ്പിക്കുക അല്ലെങ്കിൽ പിന്നീട് വീണ്ടും ശ്രമിക്കുക</translation> <translation id="3856800405688283469">സമയ മേഖല തിരഞ്ഞെടുക്കുക</translation> <translation id="3857807444929313943">വിരൽ ഉയർത്തി, വീണ്ടും സ്പർശിക്കുക</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: സമന്വയം താൽക്കാലികമായി നിർത്തി</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" എന്ന ഉപയോക്തൃനാമം ലഭ്യമല്ല</translation> <translation id="3861977424605124250">ആരംഭത്തിൽ കാണിക്കുക</translation> <translation id="3862788408946266506">Chrome OS കിയോസ്ക് മോഡിൽ, 'kiosk_only' മാനിഫെസ്റ്റ് ആട്രിബ്യൂട്ട് ഉള്ള ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണം</translation> @@ -3525,7 +3523,6 @@ <translation id="4881685975363383806">അടുത്ത തവണ എന്നെ ഓർമ്മിപ്പിക്കരുത്</translation> <translation id="4881695831933465202">തുറക്കുക</translation> <translation id="4882312758060467256">ഈ സൈറ്റിലേക്ക് ആക്സസ് ഉണ്ട്</translation> -<translation id="4882831918239250449">തിരയൽ, പരസ്യങ്ങൾ എന്നിവയും മറ്റും വ്യക്തിപരമാക്കുന്നതിനായി നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="4882919381756638075">വീഡിയോ ചാറ്റിംഗ് പോലുള്ള ആശയവിനിമയ ഫീച്ചറുകൾക്ക്, സൈറ്റുകൾ സാധാരണയായി നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാറുണ്ട്</translation> <translation id="4883436287898674711">എല്ലാ <ph name="WEBSITE_1" /> സൈറ്റുകളും</translation> <translation id="48838266408104654">&ടാസ്ക് മാനേജര്</translation> @@ -4324,7 +4321,6 @@ <translation id="5794414402486823030">എപ്പോഴും സിസ്റ്റം വ്യൂവറിൽ തുറക്കുക</translation> <translation id="5794700615121138172">Linux-ൽ നിന്ന് പങ്കിട്ട ഫോൾഡറുകൾ</translation> <translation id="5794786537412027208">എല്ലാ Chrome അപ്ലിക്കേഷനുകളിൽ നിന്നും പുറത്തുകടക്കുക</translation> -<translation id="5797070761912323120">തിരയലും പരസ്യവും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation> <translation id="5798079537501238810">സൈറ്റുകൾക്ക് പേയ്മെന്റ് കൈകാര്യം ചെയ്യുന്ന സംവിധാനങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യാം</translation> <translation id="579907812742603813">പരിരക്ഷിത ഉള്ളടക്കം</translation> <translation id="579915268381781820">നിങ്ങളുടെ സുരക്ഷാ കീ നീക്കം ചെയ്തു.</translation> @@ -4686,7 +4682,6 @@ <translation id="6208521041562685716">മൊബൈൽ ഡാറ്റ സജീവമാക്കുന്നു</translation> <translation id="6209838773933913227">കമ്പോണന്റ് അപ്ഡേറ്റ് ചെയ്യുന്നു</translation> <translation id="6209908325007204267">നിങ്ങളുടെ ഉപകരണത്തിൽ Chrome എന്റർപ്രൈസ് അപ്ഗ്രേഡ് ഉൾപ്പെടുന്നു, എന്നാൽ നിങ്ങളുടെ ഉപയോക്തൃനാമം ഒരു എന്റർപ്രൈസ് അക്കൗണ്ടുമായി ബന്ധപ്പെട്ടതല്ല. മറ്റൊരു ഉപകരണത്തിൽ g.co/ChromeEnterpriseAccount സന്ദർശിച്ച് എന്റർപ്രൈസ് അക്കൗണ്ട് സൃഷ്ടിക്കുക.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: സമന്വയം പ്രവർത്തിക്കുന്നില്ല</translation> <translation id="6212039847102026977">വിപുലമായ നെറ്റ്വർക്ക് പ്രോപ്പർട്ടികൾ കാണിക്കുക</translation> <translation id="6212168817037875041">ഡിസ്പ്ലേ ഓഫാക്കുക</translation> <translation id="6212752530110374741">ലിങ്ക് ഇമെയിൽ ചെയ്യുക</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">പശ്ചാത്തല പേജ്: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> എന്ന ഉപകരണത്തിൽ നിന്നും വിളിക്കുക</translation> <translation id="7431719494109538750">HID ഉപകരണങ്ങളൊന്നും കണ്ടെത്തിയില്ല</translation> +<translation id="7431991332293347422">തിരയലും മറ്റും വ്യക്തിപരമാക്കുന്നതിന് നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="7433708794692032816">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഉപയോഗിക്കുന്നത് തുടരാൻ സ്മാർട്ട് കാർഡ് ഇൻസേർട്ട് ചെയ്യുക</translation> <translation id="7433957986129316853">നിലനിർത്തുക</translation> <translation id="7434509671034404296">ഡെവലപ്പർ</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 10967e0..be6e88e 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Хөтчийн өгөгдлийг синк хийсэн бүх төхөөрөмж болон Google Бүртгэлээсээ устгахын тулд <ph name="BEGIN_LINK" />синк хийх тохиргоонд зочилно уу<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Хэвлэх ...</translation> <translation id="1176471985365269981">Таны төхөөрөмж дээрх файлууд эсвэл фолдеруудыг засахыг зөвшөөрөхгүй</translation> -<translation id="1177138678118607465">Хайлт, зар болон Google-н бусад үйлчилгээг сайжруулахын тулд Google таны хайлтын түүхийг ашиглаж болзошгүй. Та үүнийг хүссэн үедээ myaccount.google.com/activitycontrols/search-д өөрчлөх боломжтой</translation> <translation id="1177863135347784049">Хэвийн</translation> <translation id="1178581264944972037">Түр зогсоох</translation> <translation id="117916940443676133">Таны аюулгүй байдлын түлхүүр ПИН-р хамгаалагдаагүй байна. Нэвтрэх өгөгдлийг удирдахын тулд эхлээд ПИН үүсгэнэ үү.</translation> @@ -551,7 +550,6 @@ <translation id="1602085790802918092">Виртуал машиныг эхлүүлж байна</translation> <translation id="1603914832182249871">(Нэрээ нууцлах)</translation> <translation id="1604432177629086300">Хэвлэж чадсангүй. Хэвлэгчийг шалгаад дахин оролдоно уу.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Нууц үгийг синк хийх ажиллахгүй байна</translation> <translation id="1607139524282324606">Оролтыг устгах</translation> <translation id="1607499585984539560">Хэрэглэгч домэйнтэй холбоогүй байна</translation> <translation id="1608626060424371292">Энэ хэрэглэгчийг устга</translation> @@ -1768,6 +1766,7 @@ <translation id="2889064240420137087">Холбоосыг ...-аар нээх</translation> <translation id="2891922230654533301">Төхөөрөмжөө <ph name="APP_NAME" />-д нэвтрэхдээ ашиглах уу?</translation> <translation id="2893168226686371498">Стандарт веб хөтөч</translation> +<translation id="2893180576842394309">Google таны түүхийг Хайлт болон Google-н бусад үйлчилгээг хувийн болгох зорилгоор ашиглаж болзошгүй</translation> <translation id="2894757982205307093">Бүлэг доторх шинэ таб</translation> <translation id="289695669188700754">Гол ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Таныг бүх нууцлалтай цонхоо хаах үед энэ захиалгат тохиргоог хасах болно</translation> @@ -2648,7 +2647,6 @@ <translation id="3856096718352044181">Энэ нь хүчинтэй нийлүүлэгч болохыг бататгах эсвэл дараа дахин оролдоно уу</translation> <translation id="3856800405688283469">Цагийн бүс сонгох</translation> <translation id="3857807444929313943">Дээшлүүлээд дахин хүрэх</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Синкийг түр зогссон</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" хэрэглэгчийн нэр боломжгүй байна</translation> <translation id="3861977424605124250">Гарааны компанид харуулах</translation> <translation id="3862788408946266506">"Kiosk_only" тодорхойлогч файлын шинжтэй аппыг Chrome-н үйлдлийн системийн киоск горимд суулгах шаардлагатай</translation> @@ -3539,7 +3537,6 @@ <translation id="4881685975363383806">Дараагийн удаа надад битгий сануул</translation> <translation id="4881695831933465202">Нээх</translation> <translation id="4882312758060467256">Энэ сайтад хандалттай</translation> -<translation id="4882831918239250449">Таны хайлтын түүхийг Хайлт, зар болон бусад үйлчилгээг тохируулахад хэрхэн ашигладгийг удирдах</translation> <translation id="4882919381756638075">Сайтууд ихэвчлэн видео чат зэрэг харилцаа холбооны онцлогуудад зориулж таны микрофоныг ашигладаг</translation> <translation id="4883436287898674711">Бүх <ph name="WEBSITE_1" /> сайтууд</translation> <translation id="48838266408104654">& Асуудлын менежер</translation> @@ -4339,7 +4336,6 @@ <translation id="5794414402486823030">Систем харагчтай үргэлж хамт нээх</translation> <translation id="5794700615121138172">Linux-н хуваалцсан фолдерууд</translation> <translation id="5794786537412027208">Бүх Chrome Apps-аас гарах</translation> -<translation id="5797070761912323120">Google таны түүхийг Хайлт, зар болон Google-н бусад үйлчилгээг хувийн болгох зорилгоор ашиглаж болзошгүй</translation> <translation id="5798079537501238810">Сайтууд төлбөр хариуцагч суулгах боломжтой</translation> <translation id="579907812742603813">хамгаалалттай контент</translation> <translation id="579915268381781820">Таны аюулгүй байдлын түлхүүрийг устгалаа.</translation> @@ -4699,7 +4695,6 @@ <translation id="6208521041562685716">Мобайл датаг идэвхжүүлж байна</translation> <translation id="6209838773933913227">Бүрэлдэхүүнийг шинэчилж байна</translation> <translation id="6209908325007204267">Таны төхөөрөмжид Chrome Enterprise дэвшүүлэлт агуулагдах боловч таны хэрэглэгчийн нэр байгууллагын бүртгэлтэй холбогдоогүй байна. Хоёрдогч төхөөрөмж дээр g.co/ChromeEnterpriseAccount хаягаар зочилж, байгууллагын бүртгэл үүсгэнэ үү.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Синк ажиллахгүй байна</translation> <translation id="6212039847102026977">Дэвшилтэт сүлжээний сонголтыг харуулах</translation> <translation id="6212168817037875041">Дэлгэцийг унтраах</translation> <translation id="6212752530110374741">Имэйлийн холбоос</translation> @@ -5788,6 +5783,7 @@ <translation id="7427348830195639090">Дэвсгэр хуудас: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" />-c дуудлага хийх</translation> <translation id="7431719494109538750">Ямар ч HID төхөөрөмж олдсонгүй</translation> +<translation id="7431991332293347422">Таны хайлтын түүх Хайлт болон бусад зүйлийг хувийн болгоход хэрхэн ашигладгийг хянах</translation> <translation id="7433708794692032816">Өөрийн <ph name="DEVICE_TYPE" />-г үргэлжлүүлэн ашиглахын тулд ухаалаг карт оруулна уу</translation> <translation id="7433957986129316853">Үүнийг хадгалах</translation> <translation id="7434509671034404296">Хөгжүүлэгч</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index d03681a..fb51e09a 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">तुमच्या सिंक केलेल्या सर्व डिव्हाइसमधून आणि तुमच्या Google खात्यामधून ब्राउझ केलेला डेटा साफ करण्यासाठी, <ph name="BEGIN_LINK" />सिंक सेटिंग्जला भेट द्या<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&मुद्रण...</translation> <translation id="1176471985365269981">तुमच्या डिव्हाइसवरील फाइल किंवा फोल्डर संपादित करण्याची अनुमती नाही</translation> -<translation id="1177138678118607465">शोध, जाहिराती आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google तुमचा ब्राउझिंग इतिहास वापरू शकतो. तुम्ही myaccount.google.com/activitycontrols/search येथे हे कधीही बदलू शकता</translation> <translation id="1177863135347784049">कस्टम</translation> <translation id="1178581264944972037">विराम द्या</translation> <translation id="117916940443676133">तुमची सिक्युरिटी की पिनने संरक्षित केलेली नाही. साइन इन डेटा व्यवस्थापित करण्यासाठी, प्रथम पिन तयार करा.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">व्हर्च्युअल मशीन सुरू करत आहे</translation> <translation id="1603914832182249871">(गुप्त)</translation> <translation id="1604432177629086300">प्रिंट करू शकलो नाही. प्रिंटर तपासा आणि पुन्हा प्रयत्न करा.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: पासवर्ड सिंक काम करत नाही</translation> <translation id="1607139524282324606">प्रवेश साफ करा</translation> <translation id="1607499585984539560">वापरकर्ता डोमेनशी संबंधित नाही</translation> <translation id="1608626060424371292">हा वापरकर्ता काढून टाका</translation> @@ -1771,6 +1769,7 @@ <translation id="2889064240420137087">यासह लिंक उघडा...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> वर साइन इन करण्यासाठी तुमचे डिव्हाइस वापरायचे आहे का?</translation> <translation id="2893168226686371498">डीफॉल्ट ब्राउझर</translation> +<translation id="2893180576842394309">शोध आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते.</translation> <translation id="2894757982205307093">गटामधील नवीन टॅब</translation> <translation id="289695669188700754">की आयडी: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">तुम्ही तुमच्या सर्व गुप्त विंडो बंद केल्यास, हे कस्टम सेटिंग काढून टाकले जाईल</translation> @@ -2650,7 +2649,6 @@ <translation id="3856096718352044181">कृपया हा वैध पुरवठादार आहे याची पडताळणी करा किंवा नंतर पुन्हा प्रयत्न करा</translation> <translation id="3856800405688283469">टाइम झोन निवडा</translation> <translation id="3857807444929313943">उचला, नंतर पुन्हा स्पर्श करा</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: सिंक करणे थांबवले</translation> <translation id="3861638017150647085">वापरकर्ता नाव "<ph name="USERNAME" />" उपलब्ध नाही</translation> <translation id="3861977424605124250">स्टार्टअपच्या वेळी दाखवा</translation> <translation id="3862788408946266506">'kiosk_only' मॅनिफेस्ट विशेषता असलेले अॅप Chrome OS कियोस्क मोडमध्ये इंस्टॉल केले जाणे आवश्यक आहे</translation> @@ -3540,7 +3538,6 @@ <translation id="4881685975363383806">मला पुढील वेळी आठवण करून देऊ नका</translation> <translation id="4881695831933465202">उघडा</translation> <translation id="4882312758060467256">या साइटचा ॲक्सेस आहे</translation> -<translation id="4882831918239250449">तुम्ही ब्राउझ करत असलेला इतिहास पर्सनलाइझ शोध, जाहिराती आणि बरेच काही करण्यासाठी कसा वापरला जातो ते नियंत्रित करा</translation> <translation id="4882919381756638075">व्हिडिओ चॅटिंगसारख्या संवाद वैशिष्ट्यांसाठी साइट सामान्यपणे तुमचा मायक्रोफोन वापरतात</translation> <translation id="4883436287898674711">सर्व <ph name="WEBSITE_1" /> साइट</translation> <translation id="48838266408104654">&कार्य व्यवस्थापक</translation> @@ -4338,7 +4335,6 @@ <translation id="5794414402486823030">नेहमी सिस्टम दर्शकासह उघडा</translation> <translation id="5794700615121138172">Linux ने शेअर केलेले फोल्डर</translation> <translation id="5794786537412027208">सर्व Chrome Apps मधून बाहेर पडा</translation> -<translation id="5797070761912323120">शोध, जाहिरात आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते</translation> <translation id="5798079537501238810">साइट पेमेंट हँडलर इंस्टॉल करू शकतात</translation> <translation id="579907812742603813">संरक्षित आशय</translation> <translation id="579915268381781820">तुमची सिक्युरिटी की काढून टाकली होती.</translation> @@ -4700,7 +4696,6 @@ <translation id="6208521041562685716">मोबाइल डेटा ॲक्टिव्हेट करत आहे</translation> <translation id="6209838773933913227">घटक अपडेट होत आहे</translation> <translation id="6209908325007204267">तुमच्या डिव्हाइसमध्ये Chrome एंटरप्राइझ अपग्रेड याचा समावेश आहे पण तुमचे वापरकर्ता नाव एंटरप्राइझ खात्याशी संबंधित नाही. कृपया पर्यायी डिव्हाइसवरून g.co/ChromeEnterpriseAccount ला भेट देऊन एक एंटरप्राइझ खाते तयार करा.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: सिंक काम करत नाही</translation> <translation id="6212039847102026977">प्रगत नेटवर्क वैशिष्ट्ये दर्शवा</translation> <translation id="6212168817037875041">डिस्प्ले बंद करा</translation> <translation id="6212752530110374741">ईमेल लिंक</translation> @@ -5788,6 +5783,7 @@ <translation id="7427348830195639090">पार्श्वभूमी पृष्ठ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> चा कॉल</translation> <translation id="7431719494109538750">HID डिव्हाइस आढळली नाहीत</translation> +<translation id="7431991332293347422">शोध पर्सनलाइझ करण्यासाठी तुमचा ब्राउझिंग इतिहास कसा वापरला जातो ते आणि बरेच काही नियंत्रित करा</translation> <translation id="7433708794692032816">तुमचे <ph name="DEVICE_TYPE" /> वापरत राहण्यासाठी स्मार्ट कार्ड घाला</translation> <translation id="7433957986129316853">ठेवा</translation> <translation id="7434509671034404296">डेव्हलपर</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 8fb97f7..958400a 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Untuk mengosongkan data semakan imbas daripada semua peranti tersegerak dan Akaun Google anda, <ph name="BEGIN_LINK" />lawati tetapan penyegerakan<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Cetak...</translation> <translation id="1176471985365269981">Tidak dibenarkan untuk mengedit fail atau folder pada peranti anda</translation> -<translation id="1177138678118607465">Google mungkin menggunakan sejarah penyemakan imbas anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain. Anda boleh menukar tetapan ini pada bila-bila masa di myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Tersuai</translation> <translation id="1178581264944972037">Jeda</translation> <translation id="117916940443676133">Kunci keselamatan anda tidak dilindungi dengan PIN. Untuk mengurus data log masuk, buat PIN terlebih dahulu.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Memulakan mesin maya</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Tidak dapat mencetak. Semak pencetak dan cuba lagi.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Penyegerakan kata laluan tidak berfungsi</translation> <translation id="1607139524282324606">Kosongkan masukan</translation> <translation id="1607499585984539560">Pengguna tiada kena-mengena dengan domain</translation> <translation id="1608626060424371292">Alih keluar pengguna ini</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Buka pautan dengan...</translation> <translation id="2891922230654533301">Gunakan peranti anda untuk log masuk ke <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Penyemak imbas lalai</translation> +<translation id="2893180576842394309">Google boleh menggunakan sejarah anda untuk memperibadikan Carian dan perkhidmatan Google yang lain</translation> <translation id="2894757982205307093">Tab baharu dalam kumpulan</translation> <translation id="289695669188700754">ID Kekunci: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Tetapan tersuai ini akan dialih keluar apabila anda menutup semua tetingkap Inkognito anda</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Sila sahkan bahawa penyedia ini sah atau cuba lagi nanti</translation> <translation id="3856800405688283469">Pilih zon waktu</translation> <translation id="3857807444929313943">Angkat jari, kemudian sentuh lagi</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Penyegerakan dijeda</translation> <translation id="3861638017150647085">Nama pengguna "<ph name="USERNAME" />" tidak tersedia</translation> <translation id="3861977424605124250">Tunjukkan pada permulaan</translation> <translation id="3862788408946266506">Apl dengan atribut manifes 'kiosk_only' mesti dipasang dalam mod kios OS Chrome OS</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Jangan ingatkan saya lain kali</translation> <translation id="4881695831933465202">Buka</translation> <translation id="4882312758060467256">Boleh mengakses tapak ini</translation> -<translation id="4882831918239250449">Kawal cara sejarah penyemakan imbas anda digunakan untuk memperibadikan Carian, iklan dan pelbagai lagi</translation> <translation id="4882919381756638075">Tapak biasanya menggunakan mikrofon anda untuk ciri komunikasi seperti sembang video</translation> <translation id="4883436287898674711">Semua tapak <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Pengurus Tugas</translation> @@ -4343,7 +4340,6 @@ <translation id="5794414402486823030">Sentiasa buka dengan alat lihat sistem</translation> <translation id="5794700615121138172">Folder kongsi Linux</translation> <translation id="5794786537412027208">Hentikan semua Apl Chrome</translation> -<translation id="5797070761912323120">Google boleh menggunakan sejarah anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain</translation> <translation id="5798079537501238810">Laman boleh memasang pengendali pembayaran</translation> <translation id="579907812742603813">kandungan yang dilindungi</translation> <translation id="579915268381781820">Kunci keselamatan anda telah dialih keluar.</translation> @@ -4704,7 +4700,6 @@ <translation id="6208521041562685716">Data mudah alih sedang diaktifkan</translation> <translation id="6209838773933913227">Sedang mengemas kini komponen</translation> <translation id="6209908325007204267">Peranti anda termasuk Peningkatan Chrome Enterprise tetapi nama pengguna anda tidak dikaitkan dengan akaun perusahaan. Sila buat akaun perusahaan dengan melawati g.co/ChromeEnterpriseAccount pada peranti kedua.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Penyegerakan tidak berfungsi</translation> <translation id="6212039847102026977">Tunjukkan sifat rangkaian terperinci</translation> <translation id="6212168817037875041">Matikan paparan</translation> <translation id="6212752530110374741">E-melkan Pautan</translation> @@ -5793,6 +5788,7 @@ <translation id="7427348830195639090">Halaman Latar Belakang: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Panggilan daripada <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Tiada peranti HID ditemui</translation> +<translation id="7431991332293347422">Kawal cara sejarah penyemakan imbas anda digunakan untuk memperibadikan Carian dan pelbagai lagi</translation> <translation id="7433708794692032816">Masukkan kad pintar untuk terus menggunakan <ph name="DEVICE_TYPE" /> anda</translation> <translation id="7433957986129316853">Kekalkan</translation> <translation id="7434509671034404296">Pembangun</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index b09fa7c7..c5fd926 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာများကို သင်စင့်ခ်လုပ်ထားသော စက်အားလုံးနှင့် သင့် Google အကောင့်မှ ရှင်းထုတ်ရန် <ph name="BEGIN_LINK" />စင့်ခ်ဆက်တင်များတွင် ဝင်ကြည့်ပါ<ph name="END_LINK" />။</translation> <translation id="1175364870820465910">&ပရင့်ထုတ်ရန်...</translation> <translation id="1176471985365269981">သင့်စက်ပေါ်ရှိ ဖိုင် (သို့) ဖိုင်တွဲများကို တည်းဖြတ်ရန် ခွင့်ပြုမထားပါ</translation> -<translation id="1177138678118607465">Google သည် Search၊ ကြော်ငြာများနှင့် အခြား Google ဝန်ဆောင်မှုများကို စိတ်ကြိုက်သတ်မှတ်ရန် သင်၏ အင်တာနက်အသုံးပြုမှု မှတ်တမ်းကို သုံးနိုင်ပါသည်။ ၎င်းကို myaccount.google.com/activitycontrols/search တွင် အချိန်မရွေး ပြောင်းလဲနိုင်သည်</translation> <translation id="1177863135347784049">စိတ်ကြိုက်</translation> <translation id="1178581264944972037">ဆိုင်းငံ့ထားရန်</translation> <translation id="117916940443676133">သင့်လုံခြုံရေးကီးကို ပင်နံပါတ်ဖြင့် ကာကွယ်မထားပါ။ လက်မှတ်ထိုးဝင်ခြင်း ဒေတာများကို စီမံရန် ပင်နံပါတ် ဦးစွာသတ်မှတ်ပါ။</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">ပကတိအသွင်စက်ကို စတင်နေသည်</translation> <translation id="1603914832182249871">(ရုပ်ဖျက်)</translation> <translation id="1604432177629086300">ပုံနှိပ်ထုတ်၍ မရပါ။ ပရင်တာကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />- စကားဝှက်စင့်ခ်လုပ်ခြင်းကို အသုံးပြု၍မရပါ</translation> <translation id="1607139524282324606">ထည့်သွင်းမှု ဖယ်ရှားရန်</translation> <translation id="1607499585984539560">အသုံးပြုသူကို ဒိုမိန်းနှင့် ချိတ်ဆက်မထားပါ</translation> <translation id="1608626060424371292">ဒီအသုံးပြုသူကို ဖယ်ရှားရန်</translation> @@ -1771,6 +1769,7 @@ <translation id="2889064240420137087">... ဖြင့် လင့် ဖွင့်ရန်</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> သို့ လက်မှတ်ထိုးဝင်ရန် သင့်စက်ကို သုံးမလား။</translation> <translation id="2893168226686371498">ပုံသေ ဘရောင်ဇာ</translation> +<translation id="2893180576842394309">Search နှင့် အခြား Google ဝန်ဆောင်မှုများအား ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် Google က သင့်မှတ်တမ်းကို သုံးနိုင်သည်</translation> <translation id="2894757982205307093">အုပ်စုတွင် တဘ်အသစ်ထည့်ရန်</translation> <translation id="289695669188700754">သော့ ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ရုပ်ဖျက် ဝင်ဒိုးအားလုံးကို ပိတ်လိုက်သောအခါ ဤစိတ်ကြိုက်ဆက်တင်ကို ဖယ်ရှားပါမည်</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">မှန်ကန်သည့် ဝန်ဆောင်မှုပေးသူ ဟုတ်မဟုတ် အတည်ပြုပါ သို့မဟုတ် နောက်မှ ထပ်စမ်းကြည့်ပါ</translation> <translation id="3856800405688283469">စံတော်ချိန်ကို ရွေးပါ</translation> <translation id="3857807444929313943">မြှောက်ပါ၊ ထို့နောက် ပြန်ထိပါ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />− စင့်ခ်ကို ခေတ္တရပ်ထားသည်</translation> <translation id="3861638017150647085">အသုံးပြုသူအမည် "<ph name="USERNAME" />" ကို မရနိုင်ပါ</translation> <translation id="3861977424605124250">စတင်ချိန်တွင် ပြရန်</translation> <translation id="3862788408946266506">'kiosk_only' မန်နီးဖက်စ်ရည်ညွှန်းချက်ပါသည့် အက်ပ်ကို Chrome OS kiosk မုဒ်တွင် ထည့်သွင်းရမည်</translation> @@ -3542,7 +3540,6 @@ <translation id="4881685975363383806">နောက်တစ်ကြိမ်တွင် သတိမပေးပါနှင့်</translation> <translation id="4881695831933465202">ဖွင့်</translation> <translation id="4882312758060467256">ဤဝဘ်ဆိုက်သို့ ဝင်ခွင့်ရှိသည်</translation> -<translation id="4882831918239250449">Search၊ ကြော်ငြာနှင့် အခြားအရာများကို ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်ရာတွင် အသုံးပြုမှုရာဇဝင်ကို မည်သို့အသုံးပြုကြောင်း ထိန်းချုပ်ပါ</translation> <translation id="4882919381756638075">ဗီဒီယိုချတ်လုပ်ခြင်းကဲ့သို့ ဝန်ဆောင်မှုများအတွက်က ဝဘ်ဆိုက်များက သင့်မိုက်ခရိုဖုန်းကို အသုံးပြုလေ့ရှိသည်</translation> <translation id="4883436287898674711">ဆိုက်များ <ph name="WEBSITE_1" />အားလုံး</translation> <translation id="48838266408104654">အလုပ် မန်နေဂျာ</translation> @@ -4342,7 +4339,6 @@ <translation id="5794414402486823030">အမြဲတမ်း စနစ် ကြည့်ရှုသူဖြင့် ဖွင့်ပါ</translation> <translation id="5794700615121138172">Linux မျှဝေထားသော ဖိုင်တွဲများ</translation> <translation id="5794786537412027208">Chrome အက်ပ်များ အားလုံး ရပ်တန့်ရန်</translation> -<translation id="5797070761912323120">Search၊ ကြော်ငြာနှင့် အခြား Google ဝန်ဆောင်မှုများအား ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် Google က သင့်မှတ်တမ်းကို သုံးနိုင်သည်</translation> <translation id="5798079537501238810">ဝဘ်ဆိုက်များက ငွေပေးချေမှု စီမံသူများ ထည့်သွင်းနိုင်သည်</translation> <translation id="579907812742603813">ကာကွယ်ထားသည့် အကြောင်းအရာ</translation> <translation id="579915268381781820">သင့်လုံခြုံရေးကီးကို ဖယ်ရှားလိုက်ပါပြီ။</translation> @@ -4701,7 +4697,6 @@ <translation id="6208521041562685716">မိုဘိုင်းဒေတာ စတင်လိုက်ပါပြီ</translation> <translation id="6209838773933913227">ဝန်ဆောင်မှုအစိတ်အပိုင်းကို အပ်ဒိတ်လုပ်နေသည်</translation> <translation id="6209908325007204267">သင့်စက်တွင် 'Chrome လုပ်ငန်းသုံး အဆင့်မြှင့်တင်မှု' ပါဝင်သည်၊ သို့သော် သင့်အသုံးပြုသူအမည်သည် လုပ်ငန်းသုံး အကောင့်နှင့် ဆက်စပ်မှုမရှိပါ။ ဒုတိယစက်တစ်ခုတွင် g.co/ChromeEnterpriseAccount သို့သွားပြီး လုပ်ငန်းသုံး အကောင့်တစ်ခု ဖွင့်ပါ။</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />− စင့်ခ်သည် အလုပ်မလုပ်ပါ</translation> <translation id="6212039847102026977">အဆင့်မြင့်ကွန်ရက် အချက်အလက်များကို ပြရန်</translation> <translation id="6212168817037875041">မျက်နှာပြင်ပြသမှုကို ပိတ်ရန်</translation> <translation id="6212752530110374741">အီးမေးလ်လင့်ခ်</translation> @@ -5789,6 +5784,7 @@ <translation id="7427348830195639090">နောက်ခံ စာမျက်နှာ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> ထံမှ ဖုန်းခေါ်ဆိုမှု</translation> <translation id="7431719494109538750">HID စက်များ မရှိပါ</translation> +<translation id="7431991332293347422">Search နှင့် အခြားအရာများကို ပုဂ္ဂိုလ်ရေးသီးသန့် သတ်မှတ်ရန်အတွက် အသုံးပြုမှုမှတ်တမ်းအား မည်သို့အသုံးချကြောင်း ထိန်းချုပ်ပါ</translation> <translation id="7433708794692032816">သင်၏ <ph name="DEVICE_TYPE" /> ကို ဆက်သုံးရန် စမတ်ကတ် ထည့်သွင်းပါ</translation> <translation id="7433957986129316853">ဆက်ထားရန်</translation> <translation id="7434509671034404296">ပြုစုသူ</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 554a286..1372f22 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -164,7 +164,6 @@ <translation id="117445914942805388">तपाईंका सिंक गरिएका सबै यन्त्र र Google खाताबाट ब्राउजिङ डेटा खाली गर्न <ph name="BEGIN_LINK" />सिंकसम्बन्धी सेटिङहरू<ph name="END_LINK" /> मा जानुहोस्।</translation> <translation id="1175364870820465910">&छाप्नुहोस्...</translation> <translation id="1176471985365269981">तपाईंको डिभाइसमा भएका फाइल वा फोल्डरहरू परिवर्तन गर्ने अनुमति नदिइएका साइटहरू</translation> -<translation id="1177138678118607465">Google ले खोज, विज्ञापनहरू र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको ब्राउजिङसम्बन्धी इतिहास प्रयोग गर्न सक्छ। तपाईं myaccount.google.com/activitycontrols/search मा गई जुनसुकै बेला यसलाई बदल्न सक्नुहुन्छ</translation> <translation id="1177863135347784049">अनुकूल</translation> <translation id="1178581264944972037">पज गर्नुहोस्</translation> <translation id="117916940443676133">तपाईंको सुरक्षा साँचो PIN प्रयोग गरी सुरक्षित गरिएको छैन। साइन इन गर्न चाहिने डेटा व्यवस्थित गर्न सर्वप्रथम एउटा PIN सिर्जना गर्नुहोस्।</translation> @@ -548,7 +547,6 @@ <translation id="1602085790802918092">भर्चुअल मेसिन सुरु हुँदै छ</translation> <translation id="1603914832182249871">(इन्कगनिटो)</translation> <translation id="1604432177629086300">प्रिन्ट गर्न सकिएन। प्रिन्टरको जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: पासवर्ड सिंक गर्ने सुविधाले काम गरिरहेको छैन</translation> <translation id="1607139524282324606">प्रविष्टि खाली गर्नुहोस्</translation> <translation id="1607499585984539560">यी प्रयोगकर्ता यो डोमेनमा आबद्ध हुनुहुन्न</translation> <translation id="1608626060424371292">यो प्रयोगकर्तालाई हटाउनुहोस्</translation> @@ -1750,6 +1748,7 @@ <translation id="2889064240420137087">कृपया लिङ्क खोल्नुहोस्...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> मा साइन इन गर्न तपाईंको यन्त्र प्रयोग गर्ने हो?</translation> <translation id="2893168226686371498">डिफल्ट ब्राउजर</translation> +<translation id="2893180576842394309">Google ले खोज र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको इतिहाससम्बन्धी जानकारी प्रयोग गर्न सक्छ</translation> <translation id="2894757982205307093">समूहमा नयाँ ट्याब थप्नुहोस्</translation> <translation id="289695669188700754">कुञ्जी आइडी: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">तपाईंले सबै इन्कोग्निटो विन्डो बन्द गरेपछि तपाईंको रोजाइअनुसारको यो सेटिङ हटाइने छ</translation> @@ -1884,7 +1883,7 @@ <translation id="3022978424994383087">मैले बुझिनँ।</translation> <translation id="3023464535986383522">सेलेक्ट टु स्पिक सुविधा</translation> <translation id="3024374909719388945">24-घण्टे घडी प्रयोग गर्नुहोस</translation> -<translation id="3027296729579831126">नजिकैका डिभाइससँग सेयर गर्ने सुविधा सक्रिय गर्नुहोस्</translation> +<translation id="3027296729579831126">नजिकैका डिभाइससँग सेयर गर्ने सुविधा अन गर्नुहोस्</translation> <translation id="3029466929721441205">सेल्फमा स्टाइलसका उपकरणहरू देखाइयोस्</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> का अनुसार तपाईंले आजै अपडेट डाउनलोड गर्नु पर्ने हुन्छ। तपाईं इन्टरनेटमा कनेक्ट भएपछि अपडेट स्वतः डाउनलोड हुने छ।}other{<ph name="MANAGER" /> का अनुसार तपाईंले म्याद सकिनुअघि नै अपडेट डाउनलोड गर्नु पर्ने हुन्छ। तपाईं इन्टरनेटमा कनेक्ट भएपछि अपडेट स्वतः डाउनलोड हुने छ।}}</translation> <translation id="3031417829280473749">एजेन्ट एक्स</translation> @@ -2629,7 +2628,6 @@ <translation id="3856096718352044181">कृपया यो एउटा मान्य प्रदायक हो भनी पुष्टि गर्नुहोस् वा पछि फेरि प्रयास गर्नुहोस्</translation> <translation id="3856800405688283469">प्रामाणिक समय चयन गर्नुहोस्</translation> <translation id="3857807444929313943">औँला उठाई फेरि छुनुहोस्</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: सिंक गर्ने कार्य पज गरियो</translation> <translation id="3861638017150647085">युजरनेम "<ph name="USERNAME" />" उपलब्ध छैन</translation> <translation id="3861977424605124250">ब्राउजर खोल्दा देखाइयोस्</translation> <translation id="3862788408946266506">'Kiosk_only" नामक म्यानिफेस्ट विशेषता भएको एप अनिवार्य रूपमा ChromeOS को किओस्क मोडमा स्थापना गर्नु पर्छ</translation> @@ -3517,7 +3515,6 @@ <translation id="4881685975363383806">मलाई फेरि स्मरण नगराइयोस्</translation> <translation id="4881695831933465202">खोल्नुहोस्</translation> <translation id="4882312758060467256">यो साइटमाथि पहुँच राख्न सक्छ</translation> -<translation id="4882831918239250449">खोज, विज्ञापन र थप कुराहरू वैयक्तीकृत गर्ने प्रयोजनका लागि तपाईंको ब्राउजिङ इतिहासको प्रयोग गरिने तरिका नियन्त्रण गर्नुहोस्</translation> <translation id="4882919381756638075">साइटहरूले भिडियो च्याट जस्ता सञ्चार सुविधाहरू प्रदान गर्न सामान्यतया तपाईंको माइक्रोफोन प्रयोग गर्छन्</translation> <translation id="4883436287898674711">सबै <ph name="WEBSITE_1" /> साइटहरू</translation> <translation id="48838266408104654">&काम प्रबन्धक</translation> @@ -4312,7 +4309,6 @@ <translation id="5794414402486823030">प्रणाली दर्शकमार्फत सधैं खोल्नुहोस्</translation> <translation id="5794700615121138172">Linux बाट सेयर गरिएका फोल्डरहरू</translation> <translation id="5794786537412027208">सबै Chrome एप्स छोड्नुहोस्</translation> -<translation id="5797070761912323120">Google ले खोज, विज्ञापन र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको इतिहाससम्बन्धी जानकारी प्रयोग गर्न सक्छ</translation> <translation id="5798079537501238810">साइटहरूले भुक्तानी ह्यान्ड्लरहरू इन्स्टल गर्न सक्छन्</translation> <translation id="579907812742603813">संरक्षित सामग्री</translation> <translation id="579915268381781820">तपाईंको सुरक्षा साँचो हटाइयो।</translation> @@ -4671,7 +4667,6 @@ <translation id="6208521041562685716">मोबाइल डेटा सक्रिय गरिँदै छ</translation> <translation id="6209838773933913227">कम्पोनेन्टहरू अपडेट हुँदै छन्</translation> <translation id="6209908325007204267">तपाईंको डिभाइसमा स्तरवृद्धि गरी Chrome Enterprise बनाउने सुविधा उपलब्ध छ तर तपाईंको प्रयोगकर्ता नाम भने कुनै पनि इन्टरप्राइजको खातासँग सम्बन्धित छैन। कृपया कुनै सहायक यन्त्रमार्फत g.co/ChromeEnterpriseAccount मा गई इन्टरप्राइज खाता सिर्जना गर्नुहोस्।</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: सिंकले काम गरिरहेको छैन।</translation> <translation id="6212039847102026977">नेटवर्कका उन्नत गुणहरू देखाउनुहोस्</translation> <translation id="6212168817037875041">प्रदर्शन निष्क्रिय पार्नुहोस्</translation> <translation id="6212752530110374741">लिंक भएको इमेल पठाउनुहोस्</translation> @@ -5757,6 +5752,7 @@ <translation id="7427348830195639090">पृष्ठभूमि पाना: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> बाट आएको कल</translation> <translation id="7431719494109538750">कुनै पनि HID यन्त्र फेला परेन</translation> +<translation id="7431991332293347422">खोज र थप कुराहरू वैयक्तीकृत गर्ने प्रयोजनका लागि तपाईंको ब्राउजिङ इतिहासको प्रयोग गरिने तरिका नियन्त्रण गर्नुहोस्</translation> <translation id="7433708794692032816">आफ्नो <ph name="DEVICE_TYPE" /> प्रयोग गरिरहन स्मार्ट कार्ड इन्सर्ट गर्नुहोस्</translation> <translation id="7433957986129316853">यसलाई लागु गर्नुहोस्</translation> <translation id="7434509671034404296">विकासकर्ता</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index eaa5696..2ed6179d 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Als je browsegegevens wilt wissen van al je gesynchroniseerde apparaten en je Google-account, <ph name="BEGIN_LINK" />ga je naar synchronisatie-instellingen<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Afdrukken...</translation> <translation id="1176471985365269981">Geen toestemming om bestanden of mappen op je apparaat te bewerken</translation> -<translation id="1177138678118607465">Google kan je browsegeschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren. Je kunt dit op elk gewenst moment wijzigen via myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Aangepast</translation> <translation id="1178581264944972037">Onderbreken</translation> <translation id="117916940443676133">Je beveiligingssleutel is niet beveiligd met een pincode. Maak eerst een pincode als je de inloggegevens wilt beheren.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">De virtuele machine wordt gestart</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Kan niet afdrukken. Controleer de printer en probeer het opnieuw.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: wachtwoordsynchronisatie werkt niet</translation> <translation id="1607139524282324606">Item wissen</translation> <translation id="1607499585984539560">Gebruiker is niet aangesloten bij het domein</translation> <translation id="1608626060424371292">Gebruiker verwijderen</translation> @@ -1756,6 +1754,7 @@ <translation id="2889064240420137087">Link openen met...</translation> <translation id="2891922230654533301">Je apparaat gebruiken om in te loggen bij <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Standaardbrowser</translation> +<translation id="2893180576842394309">Google kan je geschiedenis gebruiken om Google Zoeken en andere Google-services te personaliseren</translation> <translation id="2894757982205307093">Nieuw tabblad in groep</translation> <translation id="289695669188700754">Sleutel-ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Deze aangepaste instelling wordt verwijderd als je al je incognitovensters sluit</translation> @@ -2636,7 +2635,6 @@ <translation id="3856096718352044181">Controleer of dit een geldige provider is of probeer het later opnieuw</translation> <translation id="3856800405688283469">Tijdzone selecteren</translation> <translation id="3857807444929313943">Til je vinger op en plaats deze opnieuw op de sensor</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: synchronisatie gepauzeerd</translation> <translation id="3861638017150647085">De gebruikersnaam '<ph name="USERNAME" />' is niet beschikbaar</translation> <translation id="3861977424605124250">Tonen bij opstarten</translation> <translation id="3862788408946266506">Een app met het manifestkenmerk 'kiosk_only' moet worden geïnstalleerd in de Chrome OS-kioskmodus</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">Niet opnieuw herinneren</translation> <translation id="4881695831933465202">Openen</translation> <translation id="4882312758060467256">Heeft toegang tot deze site</translation> -<translation id="4882831918239250449">Beheren hoe je browsegeschiedenis wordt gebruikt om Google Zoeken, advertenties en meer te personaliseren</translation> <translation id="4882919381756638075">Sites gebruiken je microfoon vaak voor communicatiefuncties zoals videochatten</translation> <translation id="4883436287898674711">Alle sites op <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Taakbeheer</translation> @@ -4324,7 +4321,6 @@ <translation id="5794414402486823030">Altijd openen met systeemviewer</translation> <translation id="5794700615121138172">Gedeelde mappen voor Linux</translation> <translation id="5794786537412027208">Alle Chrome-apps sluiten</translation> -<translation id="5797070761912323120">Google kan je geschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren</translation> <translation id="5798079537501238810">Sites kunnen betalingshandlers installeren</translation> <translation id="579907812742603813">beschermde content</translation> <translation id="579915268381781820">Je beveiligingssleutel is verwijderd.</translation> @@ -4685,7 +4681,6 @@ <translation id="6208521041562685716">Mobiele data activeren</translation> <translation id="6209838773933913227">Component wordt geüpdatet</translation> <translation id="6209908325007204267">Je apparaat omvat een Chrome Enterprise Upgrade, maar je gebruikersnaam is niet gekoppeld aan een Enterprise-account. Ga op een secundair apparaat naar g.co/ChromeEnterpriseAccount om een Enterprise-account te maken.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: synchronisatie werkt niet</translation> <translation id="6212039847102026977">Geavanceerde netwerkeigenschappen tonen</translation> <translation id="6212168817037875041">Scherm uitzetten</translation> <translation id="6212752530110374741">Link e-mailen</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">Achtergrondpagina: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Gesprek van <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Geen HID-apparaten gevonden</translation> +<translation id="7431991332293347422">Beheren hoe je browsegeschiedenis wordt gebruikt om Google Zoeken en meer te personaliseren</translation> <translation id="7433708794692032816">Plaats een smartcard om je <ph name="DEVICE_TYPE" /> te blijven gebruiken</translation> <translation id="7433957986129316853">Behouden</translation> <translation id="7434509671034404296">Ontwikkelaar</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 37cb2da..aeba89ad 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">For å slette nettleserdata på alle synkroniserte enheter og Google-kontoen din <ph name="BEGIN_LINK" />går du til innstillingene for synkronisering<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Skriv ut...</translation> <translation id="1176471985365269981">Nettsteder som ikke har lov til å redigere filer eller mapper på enheten</translation> -<translation id="1177138678118607465">Google kan bruke nettlesingsloggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg. Du kan når som helst endre dette på myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Tilpasset</translation> <translation id="1178581264944972037">Stans midlertidig</translation> <translation id="117916940443676133">Sikkerhetsnøkkelen din er ikke beskyttet med PIN-kode. For å administrere påloggingsinformasjon må du opprette en PIN-kode først.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Starter den virtuelle maskinen</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Kunne ikke skrive ut. Kontrollér skriveren og prøv på nytt.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Passordsynkronisering fungerer ikke</translation> <translation id="1607139524282324606">Tøm oppføring</translation> <translation id="1607499585984539560">Brukeren er ikke tilknyttet domenet</translation> <translation id="1608626060424371292">Fjern denne brukeren</translation> @@ -1766,6 +1764,7 @@ <translation id="2889064240420137087">Åpne link med</translation> <translation id="2891922230654533301">Vil du bruke enheten din til å logge på <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Standardnettleser</translation> +<translation id="2893180576842394309">Google kan bruke loggen din for å gi Søk og andre Google-tjenester et personlig preg</translation> <translation id="2894757982205307093">Ny fane i gruppen</translation> <translation id="289695669188700754">Nøkkel-id: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Denne egendefinerte innstillingen blir fjernet når du lukker alle inkognitovinduer</translation> @@ -2646,7 +2645,6 @@ <translation id="3856096718352044181">Verifiser at dette er en gyldig leverandør, eller prøv på nytt senere</translation> <translation id="3856800405688283469">Velg tidssone</translation> <translation id="3857807444929313943">Løft fingeren og berør igjen</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Synkronisering er satt på pause</translation> <translation id="3861638017150647085">Brukernavnet «<ph name="USERNAME" />» er ikke tilgjengelig</translation> <translation id="3861977424605124250">Vis ved oppstart</translation> <translation id="3862788408946266506">Apper med manifest-attributtet «kiosk_only» må være installert i Chrome OS-kioskmodus</translation> @@ -3535,7 +3533,6 @@ <translation id="4881685975363383806">Ikke minn meg på dette neste gang</translation> <translation id="4881695831933465202">Åpne</translation> <translation id="4882312758060467256">Har tilgang til dette nettstedet</translation> -<translation id="4882831918239250449">Kontrollér hvordan nettleserloggen din brukes til personlig tilpasning av søk, annonser med mer</translation> <translation id="4882919381756638075">Nettsteder bruker vanligvis mikrofonen din for å kunne tilby kommunikasjonsfunksjoner, som videochat</translation> <translation id="4883436287898674711">Alle <ph name="WEBSITE_1" />-nettsteder</translation> <translation id="48838266408104654">&Oppgavebehandling</translation> @@ -4334,7 +4331,6 @@ <translation id="5794414402486823030">Åpne alltid med systemvisningsprogrammet</translation> <translation id="5794700615121138172">Delte mapper i Linux</translation> <translation id="5794786537412027208">Avslutt alle Chrome-apper</translation> -<translation id="5797070761912323120">Google kan bruke loggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation> <translation id="5798079537501238810">Nettsteder kan installere betalingsbehandlere</translation> <translation id="579907812742603813">beskyttet innhold</translation> <translation id="579915268381781820">Sikkerhetsnøkkelen er fjernet.</translation> @@ -4695,7 +4691,6 @@ <translation id="6208521041562685716">Mobildata aktiveres</translation> <translation id="6209838773933913227">Komponenten oppdateres</translation> <translation id="6209908325007204267">En Chrome Enterprise-oppgradering følger med enheten din, men brukernavnet ditt er ikke knyttet til noen bedriftskonto. Opprett en bedriftskonto ved å besøke g.co/ChromeEnterpriseAccount på en annen enhet.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Synkroniseringen fungerer ikke</translation> <translation id="6212039847102026977">Vis avanserte nettverksegenskaper</translation> <translation id="6212168817037875041">Slå av skjermen</translation> <translation id="6212752530110374741">Send linken på e-post</translation> @@ -5784,6 +5779,7 @@ <translation id="7427348830195639090">Bakgrunnsside: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Ring fra <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Fant ingen HID-enheter</translation> +<translation id="7431991332293347422">Kontrollér hvordan nettleserloggen din brukes til blant annet personlig tilpasning av søk</translation> <translation id="7433708794692032816">Sett inn smartkortet for å fortsette å bruke <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Nei</translation> <translation id="7434509671034404296">Utvikler</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 67a0557..d6f82e6 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ଆପଣଙ୍କର ସମସ୍ତ ସିଙ୍କ୍ ହୋଇଥିବା ଡିଭାଇସ୍ ଏବଂ ଆପଣଙ୍କର ଆକାଉଣ୍ଟରୁ ବ୍ରାଉଜିଂ ଡାଟା ଖାଲି କରିବାକୁ <ph name="BEGIN_LINK" />ସିଙ୍କ୍ ସେଟିଂସ୍କୁ ଯାଆନ୍ତୁ<ph name="END_LINK" />।</translation> <translation id="1175364870820465910">&ମୁଦ୍ରଣ...</translation> <translation id="1176471985365269981">ଆପଣଙ୍କ ଡିଭାଇସରେ ଫାଇଲ୍ କିମ୍ବା ଫୋଲ୍ଡରଗୁଡ଼ିକୁ ଏଡିଟ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ</translation> -<translation id="1177138678118607465">Google, ସନ୍ଧାନ, ବିଜ୍ଞାପନ ଏବଂ ଅନ୍ୟ Google ସେବାକୁ ବ୍ୟକ୍ତିଗତ କରିବା ପାଇଁ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତିକୁ ବ୍ୟବହାର କରିପାରେ। ଆପଣ ଯେକୌଣସି ସମୟରେ ଏହାକୁ myaccount.google.com/activitycontrols/searchରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="1177863135347784049">କଷ୍ଟମ୍</translation> <translation id="1178581264944972037">ବିରତି</translation> <translation id="117916940443676133">ଆପଣଙ୍କର ସୁରକ୍ଷା କୀ ଏକ ପିନ୍ ଦ୍ୱାରା ସୁରକ୍ଷିତ ନୁହେଁ। ସାଇନ୍-ଇନ୍ ଡାଟା ପରିଚାଳନା କରିବାକୁ ପ୍ରଥମେ ଏକ ପିନ୍ ତିଆରି କରନ୍ତୁ।</translation> @@ -551,7 +550,6 @@ <translation id="1602085790802918092">ଭର୍ଚୁଆଲ୍ ମେସିନ୍ ଆରମ୍ଭ ହେଉଛି</translation> <translation id="1603914832182249871">(ଇନ୍କଗ୍ନିଟୋ)</translation> <translation id="1604432177629086300">ପ୍ରିଣ୍ଟ କରାଯାଇପାରିଲା ନାହିଁ। ପ୍ରିଣ୍ଟର୍ ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: ପାସ୍ୱାର୍ଡ ସିଙ୍କ୍ କାମ କରୁ ନାହିଁ</translation> <translation id="1607139524282324606">ଏଣ୍ଟ୍ରି ଖାଲି କରନ୍ତୁ</translation> <translation id="1607499585984539560">ଉପଯୋଗକର୍ତ୍ତା ଡୋମେନ୍ ସହିତ ଆଫିଲିଏଟ୍ ନୁହଁନ୍ତି</translation> <translation id="1608626060424371292">ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ କାଢ଼ିଦିଅନ୍ତୁ</translation> @@ -1755,6 +1753,7 @@ <translation id="2889064240420137087">ଏହା ମାଧ୍ୟମରେ ଲିଙ୍କ୍ ଖୋଲନ୍ତୁ...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" />ରେ ସାଇନ୍ ଇନ୍ କରିବାକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ବ୍ୟବହାର କରିବେ?</translation> <translation id="2893168226686371498">ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍</translation> +<translation id="2893180576842394309">Google ହୁଏତ ଆପଣ କରୁଥିବା ସନ୍ଧାନ ଏବଂ ଅନ୍ୟାନ୍ୟ Google ସେବାକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ ଆପଣଙ୍କର ଇତିବୃତ୍ତିକୁ ବ୍ୟବହାର କରିପାରେ</translation> <translation id="2894757982205307093">ଗୋଷ୍ଠୀରେ ନୂଆ ଟାବ୍</translation> <translation id="289695669188700754">କୀ ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ଆପଣ ଆପଣଙ୍କ ସମସ୍ତ ଇନକଗ୍ନିଟୋ ୱିଣ୍ଡୋ ବନ୍ଦ କଲେ ଏହି କଷ୍ଟମ୍ ସେଟିଂକୁ କାଢ଼ି ଦିଆଯିବ</translation> @@ -2634,7 +2633,6 @@ <translation id="3856096718352044181">ଏହା ଏକ ବୈଧ ପ୍ରଦାନକାରୀ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ କିମ୍ବା ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> <translation id="3856800405688283469">ଟାଇମ୍ ଜୋନ୍ ବାଛନ୍ତୁ</translation> <translation id="3857807444929313943">ଆଙ୍ଗୁଠି ଉଠାଇ ପୁଣି ସ୍ପର୍ଶ କରନ୍ତୁ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: ସିଙ୍କ ବିରତ ହୋଇଛି</translation> <translation id="3861638017150647085">ଉପଯୋଗକର୍ତ୍ତାନାମ "<ph name="USERNAME" />" ଉପଲବ୍ଧ ନାହିଁ</translation> <translation id="3861977424605124250">ଆରମ୍ଭ ପୃଷ୍ଠାରେ ଦେଖାନ୍ତୁ</translation> <translation id="3862788408946266506">Chrome OS କିଓସ୍କୋ ମୋଡ୍ରେ 'kiosk_only' ମାନିଫେଷ୍ଟ ବିଶେଷତାକୁ ନିଶ୍ଚିତରୂପେ ଇନ୍ଷ୍ଟଲ୍ କରିବା ଉଚିତ୍</translation> @@ -3525,7 +3523,6 @@ <translation id="4881685975363383806">ପରବର୍ତ୍ତୀ ସମୟରେ ମୋତେ ରିମାଇଣ୍ଡ କରନ୍ତୁ ନାହିଁ</translation> <translation id="4881695831933465202">ଖୋଲନ୍ତୁ</translation> <translation id="4882312758060467256">ଏହି ସାଇଟ୍କୁ ଆକ୍ସେସ୍ ଅଛି</translation> -<translation id="4882831918239250449">ସର୍ଚ୍ଚ, ବିଜ୍ଞପ୍ତି ଏବଂ ଆହୁରି ଅଧିକକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି କିପରି ବ୍ୟବହାର ହେଉଛି ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="4882919381756638075">ଭିଡିଓ ଚାଟିଂ ପରି କମ୍ୟୁନିକେସନ୍ ଫିଚରଗୁଡ଼ିକ ପାଇଁ ସାଇଟଗୁଡ଼ିକ ସାଧାରଣତଃ ଆପଣଙ୍କ ମାଇକ୍ରୋଫୋନକୁ ବ୍ୟବହାର କରିଥାଏ</translation> <translation id="4883436287898674711">ସମସ୍ତ <ph name="WEBSITE_1" /> ସାଇଟ୍</translation> <translation id="48838266408104654">&ଟାସ୍କ ପରିଚାଳକ</translation> @@ -4323,7 +4320,6 @@ <translation id="5794414402486823030">ସର୍ବଦା ସିଷ୍ଟମ୍ ଭ୍ୟୁଅର୍ ସାହାଯ୍ୟରେ ଖୋଲନ୍ତୁ</translation> <translation id="5794700615121138172">Linux ଦ୍ୱାରା ସେୟାର୍ କରାଯାଇଥିବା ଫୋଲ୍ଡରଗୁଡ଼ିକ</translation> <translation id="5794786537412027208">ସମସ୍ତ Chrome ଆପ୍ସ ପରିତ୍ୟାଗ କରନ୍ତୁ</translation> -<translation id="5797070761912323120">ଆପଣ କରୁଥିବା ସର୍ଚ୍ଚ, ଦେଖୁଥିବା ବିଜ୍ଞାପନ, ଏବଂ ଅନ୍ୟାନ୍ୟ Google ସେବାକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ Google ଆପଣଙ୍କର ଇତିବୃତ୍ତିକୁ ବ୍ୟବହାର କରିପାରେ</translation> <translation id="5798079537501238810">ସାଇଟଗୁଡ଼ିକ ପେମେଣ୍ଟ ହ୍ୟାଣ୍ଡଲର୍ ଇନଷ୍ଟଲ୍ କରିପାରିବ</translation> <translation id="579907812742603813">ସୁରକ୍ଷିତ ବିଷୟବସ୍ତୁ</translation> <translation id="579915268381781820">ଆପଣଙ୍କର ସୁରକ୍ଷା କୀକୁ କାଢ଼ି ଦିଆଯାଇଛି।</translation> @@ -4684,7 +4680,6 @@ <translation id="6208521041562685716">ମୋବାଇଲ୍ ଡାଟା ସକ୍ରିୟ କରାଯାଉଛି</translation> <translation id="6209838773933913227">କମ୍ପୋନେଟ୍ ଅପଡେଟ୍ ହେଉଛି</translation> <translation id="6209908325007204267">ଆପଣଙ୍କ ଡିଭାଇସରେ ଏକ Chrome ଏଣ୍ଟରପ୍ରାଇଜ୍ ଅପଗ୍ରେଡ୍ ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି, କିନ୍ତୁ ଆପଣଙ୍କ ଉପଯୋଗକର୍ତ୍ତାନାମ କୌଣସି ଏଣ୍ଟରପ୍ରାଇଜ୍ ଆକାଉଣ୍ଟ ସହ ସମ୍ବନ୍ଧିତ ନୁହେଁ। ଏକ ଦ୍ୱିତୀୟ ଡିଭାଇସରେ g.co/ChromeEnterpriseAccountରେ ଯାଇ, ଦୟାକରି ଏକ ଏଣ୍ଟରପ୍ରାଇଜ୍ ଆକାଉଣ୍ଟ ତିଆରି କରନ୍ତୁ।</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ସିଙ୍କ୍ କାମ କରୁନାହିଁ</translation> <translation id="6212039847102026977">ଅତ୍ୟାଧୁନିକ ନେଟ୍ୱର୍କ ଗୁଣାବଳୀ ଦେଖାନ୍ତୁ</translation> <translation id="6212168817037875041">ଡିସ୍ପ୍ଲେ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="6212752530110374741">ଇମେଲ୍ ଲିଙ୍କ୍</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">ପୃଷ୍ଠପଟ ପୃଷ୍ଠା: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" />ରୁ କଲ୍ କରନ୍ତୁ</translation> <translation id="7431719494109538750">କୌଣସି HID ଡିଭାଇସ୍ ମିଳିଲା ନାହିଁ</translation> +<translation id="7431991332293347422">Search ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି କିପରି ବ୍ୟବହାର ହେଉଛି ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="7433708794692032816">ଆପଣଙ୍କ <ph name="DEVICE_TYPE" />ର ବ୍ୟବହାର ଜାରି ରଖିବା ପାଇଁ ସ୍ମାର୍ଟ କାର୍ଡକୁ ଇନସାର୍ଟ କରନ୍ତୁ</translation> <translation id="7433957986129316853">ଏହାକୁ ରଖନ୍ତୁ</translation> <translation id="7434509671034404296">ଡେଭେଲପର୍</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index eb4795f..d95ab5e 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ਤੁਹਾਡੇ ਸਾਰੇ ਸਮਕਾਲੀਕਿਰਤ ਡੀਵਾਈਸਾਂ ਅਤੇ ਤੁਹਾਡੇ 'Google ਖਾਤੇ' ਵਿੱਚੋਂ ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨ ਲਈ, <ph name="BEGIN_LINK" />ਸਮਕਾਲੀਕਰਨ ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ<ph name="END_LINK" />।</translation> <translation id="1175364870820465910">&ਪ੍ਰਿੰਟ...</translation> <translation id="1176471985365269981">ਤੁਹਾਡੇ ਡੀਵਾਈਸ 'ਤੇ ਫ਼ਾਈਲਾਂ ਜਾਂ ਫੋਲਡਰਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> -<translation id="1177138678118607465">Google ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੀ ਵਰਤੋਂ ਖੋਜ, ਵਿਗਿਆਪਨਾਂ, ਅਤੇ ਹੋਰ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਕਰ ਸਕਦਾ ਹੈ। ਤੁਸੀਂ ਇਸ ਨੂੰ ਕਿਸੇ ਵੇਲੇ ਵੀ myaccount.google.com/activitycontrols/search 'ਤੇ ਬਦਲ ਸਕਦੇ ਹੋ</translation> <translation id="1177863135347784049">ਵਿਉਂਂਤੀ</translation> <translation id="1178581264944972037">ਰੋਕੋ</translation> <translation id="117916940443676133">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਕਿਸੇ ਪਿੰਨ ਦੇ ਨਾਲ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹੈ। ਸਾਈਨ-ਇਨ ਡਾਟੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਪਹਿਲਾਂ ਕੋਈ ਪਿੰਨ ਬਣਾਓ।</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">ਆਭਾਸੀ ਮਸ਼ੀਨ ਨੂੰ ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="1603914832182249871">(ਗੁਮਨਾਮ)</translation> <translation id="1604432177629086300">ਪ੍ਰਿੰਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਪ੍ਰਿੰਟਰ ਦੀ ਜਾਂਚ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: ਪਾਸਵਰਡ ਸਮਕਾਲੀਕਰਨ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="1607139524282324606">ਇੰਦਰਾਜ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="1607499585984539560">ਵਰਤੋਂਕਾਰ ਡੋਮੇਨ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੈ</translation> <translation id="1608626060424371292">ਇਹ ਵਰਤੋਂਕਾਰ ਹਟਾਓ</translation> @@ -1773,6 +1771,7 @@ <translation id="2889064240420137087">ਇਸ ਨਾਲ ਲਿੰਕ ਖੋਲ੍ਹੇੋ...</translation> <translation id="2891922230654533301">ਕੀ <ph name="APP_NAME" /> 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣਾ ਹੈ?</translation> <translation id="2893168226686371498">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਬ੍ਰਾਊਜ਼ਰ</translation> +<translation id="2893180576842394309">Google ਖੋਜ ਅਤੇ ਹੋਰਾਂ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹੈ</translation> <translation id="2894757982205307093">ਗਰੁੱਪ ਵਿੱਚ ਨਵੀਂ ਟੈਬ</translation> <translation id="289695669188700754">ਕੁੰਜੀ ਆਈ.ਡੀ.: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ਤੁਹਾਡੇ ਵੱਲੋਂ ਆਪਣੀ ਸਾਰੀਆਂ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋਆਂ ਨੂੰ ਬੰਦ ਕਰਨ 'ਤੇ ਇਸ ਵਿਉਂਤਬੱਧ ਸੈਟਿੰਗ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">ਕਿਰਪਾ ਕਰਕੇ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਇਹ ਇੱਕ ਵੈਧ ਪ੍ਰਦਾਨਕ ਹੈ ਜਾਂ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="3856800405688283469">ਸਮਾਂਜ਼ੋਨ ਚੁਣੋ</translation> <translation id="3857807444929313943">ਚੁੱਕੋ, ਫਿਰ ਦੁਬਾਰਾ ਸਪਰਸ਼ ਕਰੋ</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: ਸਮਕਾਲੀਕਰਨ ਰੋਕਿਆ ਗਿਆ</translation> <translation id="3861638017150647085">ਵਰਤੋਂਕਾਰ ਨਾਮ "<ph name="USERNAME" />" ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation> <translation id="3861977424605124250">ਸ਼ੁਰੂਆਤ ਵੇਲੇ ਦਿਖਾਓ</translation> <translation id="3862788408946266506">'kiosk_only' ਮੈਨੀਫ਼ੈਸਟ ਵਿਸ਼ੇਸ਼ਤਾ ਵਾਲੀ ਐਪ Chrome OS ਕਿਓਸਕ ਮੋਡ ਵਿੱਚ ਲਾਜ਼ਮੀ ਤੌਰ 'ਤੇ ਸਥਾਪਤ ਕੀਤੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ</translation> @@ -3543,7 +3541,6 @@ <translation id="4881685975363383806">ਮੈਨੂੰ ਅਗਲੀ ਵਾਰ ਯਾਦ ਨਾ ਕਰਵਾਓ</translation> <translation id="4881695831933465202">ਖੋਲ੍ਹੋ</translation> <translation id="4882312758060467256">ਇਸ ਸਾਈਟ ਤੱਕ ਪਹੁੰਚ ਹੈ</translation> -<translation id="4882831918239250449">'ਖੋਜ', ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਵਰਤੇ ਜਾਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ</translation> <translation id="4882919381756638075">ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਵੀਡੀਓ ਚੈਟਿੰਗ ਜਿਹੀਆਂ ਸੰਚਾਰ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲਈ ਤੁਹਾਡਾ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਵਰਤਦੀਆਂ ਹਨ</translation> <translation id="4883436287898674711">ਸਾਰੀਆਂ <ph name="WEBSITE_1" /> ਸਾਈਟਾਂ</translation> <translation id="48838266408104654">&ਕੰਮ ਪ੍ਰਬੰਧਕ</translation> @@ -4341,7 +4338,6 @@ <translation id="5794414402486823030">ਹਮੇਸ਼ਾਂ ਸਿਸਟਮ ਵਿਊਅਰ ਨਾਲ ਖੋਲ੍ਹੋ</translation> <translation id="5794700615121138172">Linux ਸਾਂਝੇ ਕੀਤੇ ਫੋਲਡਰ</translation> <translation id="5794786537412027208">ਸਾਰੀਆਂ Chrome ਐਪਾਂ ਛੱਡੋ</translation> -<translation id="5797070761912323120">Google ਖੋਜ, ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰਾਂ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹੈ</translation> <translation id="5798079537501238810">ਸਾਈਟਾਂ ਭੁਗਤਾਨ ਹੈਂਡਲਰਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="579907812742603813">ਸੁਰੱਖਿਅਤ ਸਮੱਗਰੀ</translation> <translation id="579915268381781820">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਹਟਾ ਦਿੱਤੀ ਗਈ ਸੀ।</translation> @@ -4702,7 +4698,6 @@ <translation id="6208521041562685716">ਮੋਬਾਈਲ ਡਾਟਾ ਕਿਰਿਆਸ਼ੀਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="6209838773933913227">ਕੰਪੋਨੈਂਟ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="6209908325007204267">ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਇੱਕ Chrome ਐਂਟਰਪ੍ਰਾਈਜ਼ ਅੱਪਗ੍ਰੇਡ ਸ਼ਾਮਲ ਹੈ, ਪਰ ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ ਨਾਮ ਐਂਟਰਪ੍ਰਾਈਜ਼ ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਸੈਕੰਡਰੀ ਡੀਵਾਈਸ ਵਿੱਚ g.co/ChromeEnterpriseAccount 'ਤੇ ਜਾ ਕੇ ਇੱਕ ਐਂਟਰਪ੍ਰਾਈਜ਼ ਖਾਤਾ ਬਣਾਓ।</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ਸਮਕਾਲੀਕਰਨ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="6212039847102026977">ਵਿਕਸਿਤ ਨੈੱਟਵਰਕ ਪ੍ਰਾਪਰਟੀਆਂ ਦਿਖਾਓ</translation> <translation id="6212168817037875041">ਡਿਸਪਲੇ ਬੰਦ ਕਰੋ</translation> <translation id="6212752530110374741">ਲਿੰਕ ਈਮੇਲ ਕਰੋ</translation> @@ -5790,6 +5785,7 @@ <translation id="7427348830195639090">ਪਿਛੋਕੜ ਸਫ਼ਾ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> ਵੱਲੋਂ ਕਾਲ</translation> <translation id="7431719494109538750">ਕੋਈ HID ਡੀਵਾਈਸ ਨਹੀਂ ਮਿਲਿਆ</translation> +<translation id="7431991332293347422">'ਖੋਜ' ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਵਰਤੇ ਜਾਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ</translation> <translation id="7433708794692032816">ਆਪਣੇ <ph name="DEVICE_TYPE" /> ਨੂੰ ਵਰਤਣਾ ਜਾਰੀ ਰੱਖਣ ਲਈ ਸਮਾਰਟ ਕਾਰਡ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="7433957986129316853">ਇਹੋ ਰੱਖੋ</translation> <translation id="7434509671034404296">ਵਿਕਾਸਕਾਰ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index e087547..2eee9191 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Aby wyczyścić dane przeglądania ze wszystkich swoich zsynchronizowanych urządzeń i z konta Google, <ph name="BEGIN_LINK" />otwórz ustawienia synchronizacji<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Drukuj...</translation> <translation id="1176471985365269981">Nie zezwolono na edytowanie plików ani folderów na urządzeniu</translation> -<translation id="1177138678118607465">Google może korzystać z Twojej historii przeglądania, by dostosowywać wyniki wyszukiwania, reklamy i działanie innych usług. W dowolnym momencie możesz to zmienić na myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Niestandardowe</translation> <translation id="1178581264944972037">Wstrzymaj</translation> <translation id="117916940443676133">Klucz bezpieczeństwa nie jest zabezpieczony kodem PIN. Aby zarządzać danymi logowania, najpierw utwórz kod PIN.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Uruchamiam maszynę wirtualną</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Nie udało się wydrukować. Sprawdź drukarkę i spróbuj jeszcze raz.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: synchronizacja haseł nie działa</translation> <translation id="1607139524282324606">Wyczyść wpis</translation> <translation id="1607499585984539560">Użytkownik nie jest powiązany z domeną</translation> <translation id="1608626060424371292">Usuń tego użytkownika</translation> @@ -1754,6 +1752,7 @@ <translation id="2889064240420137087">Otwórz link przy użyciu...</translation> <translation id="2891922230654533301">Chcesz logować się na <ph name="APP_NAME" /> za pomocą tego urządzenia?</translation> <translation id="2893168226686371498">Domyślna przeglądarka</translation> +<translation id="2893180576842394309">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania i działanie innych usług.</translation> <translation id="2894757982205307093">Nowa karta w grupie</translation> <translation id="289695669188700754">Identyfikator klucza: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Gdy zamkniesz wszystkie okna incognito, to niestandardowe ustawienie zostanie usunięte</translation> @@ -2634,7 +2633,6 @@ <translation id="3856096718352044181">Sprawdź, czy jest to prawidłowy dostawca, lub spróbuj ponownie później</translation> <translation id="3856800405688283469">Wybierz strefę czasową</translation> <translation id="3857807444929313943">Podnieś palec i przyłóż ponownie</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: synchronizacja wstrzymana</translation> <translation id="3861638017150647085">Nazwa użytkownika „<ph name="USERNAME" />” jest niedostępna</translation> <translation id="3861977424605124250">Pokaż po uruchomieniu</translation> <translation id="3862788408946266506">Aplikację z atrybutem „kiosk_only” w pliku manifestu należy zainstalować w Chrome OS w trybie kiosku</translation> @@ -3525,7 +3523,6 @@ <translation id="4881685975363383806">Nie przypominaj mi następnym razem</translation> <translation id="4881695831933465202">Otwórz</translation> <translation id="4882312758060467256">Ma dostęp do tej strony</translation> -<translation id="4882831918239250449">Zarządzaj personalizacją wyszukiwarki, reklam i innych funkcji na podstawie historii przeglądania</translation> <translation id="4882919381756638075">Strony zwykle używają mikrofonu na potrzeby komunikacji, na przykład czatu wideo</translation> <translation id="4883436287898674711">Wszystkie strony <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Menedżer zadań</translation> @@ -4324,7 +4321,6 @@ <translation id="5794414402486823030">Zawsze otwieraj w przeglądarce systemowej</translation> <translation id="5794700615121138172">Foldery udostępnione Linuksa</translation> <translation id="5794786537412027208">Zamknij wszystkie aplikacje Chrome</translation> -<translation id="5797070761912323120">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania, reklamy i działanie innych usług</translation> <translation id="5798079537501238810">Strony mogą instalować moduły do obsługi płatności</translation> <translation id="579907812742603813">treść chroniona</translation> <translation id="579915268381781820">Klucz bezpieczeństwa został odłączony.</translation> @@ -4685,7 +4681,6 @@ <translation id="6208521041562685716">Aktywuję mobilną transmisję danych</translation> <translation id="6209838773933913227">Aktualizacja komponentu</translation> <translation id="6209908325007204267">Twoje urządzenie ma licencję na Chrome Enterprise, ale Twoja nazwa użytkownika nie jest powiązana z kontem służbowym. Utwórz takie konto na stronie g.co/ChromeEnterpriseAccount, korzystając z dodatkowego urządzenia.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: synchronizacja nie działa</translation> <translation id="6212039847102026977">Pokaż zaawansowane właściwości sieci</translation> <translation id="6212168817037875041">Wyłącz ekran</translation> <translation id="6212752530110374741">Prześlij link e-mailem</translation> @@ -5771,6 +5766,7 @@ <translation id="7427348830195639090">Strona w tle: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Zadzwoń z urządzenia <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nie znaleziono urządzeń HID</translation> +<translation id="7431991332293347422">Zarządzaj personalizacją wyszukiwarki i innych funkcji na podstawie historii przeglądania</translation> <translation id="7433708794692032816">Aby nadal używać swojego urządzenia <ph name="DEVICE_TYPE" />, włóż kartę inteligentną</translation> <translation id="7433957986129316853">Zachowaj</translation> <translation id="7434509671034404296">Deweloper</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 881caa3..2e86e9c 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Para limpar os dados de navegação de todos os dispositivos sincronizados e da sua Conta do Google, <ph name="BEGIN_LINK" />acesse as configurações de sincronização<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Imprimir...</translation> <translation id="1176471985365269981">Sem permissão para editar arquivos ou pastas no dispositivo</translation> -<translation id="1177138678118607465">O Google pode usar seu histórico de navegação para personalizar a Pesquisa, os anúncios e outros serviços do Google. Você pode alterar essa configuração a qualquer momento em myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personalizado</translation> <translation id="1178581264944972037">Pausar</translation> <translation id="117916940443676133">Sua chave de segurança não está protegida com um PIN. Para gerenciar dados de login, crie um PIN primeiro.</translation> @@ -556,7 +555,6 @@ <translation id="1602085790802918092">Iniciando a máquina virtual</translation> <translation id="1603914832182249871">(Modo anônimo)</translation> <translation id="1604432177629086300">Não foi possível imprimir. Verifique a impressora e tente novamente</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: a sincronização de senha não está funcionando</translation> <translation id="1607139524282324606">Limpar entrada</translation> <translation id="1607499585984539560">O usuário não está afiliado ao domínio</translation> <translation id="1608626060424371292">Remover este usuário</translation> @@ -1773,6 +1771,7 @@ <translation id="2889064240420137087">Abrir link com...</translation> <translation id="2891922230654533301">Usar o dispositivo para fazer login em <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador padrão</translation> +<translation id="2893180576842394309">O histórico será usado para personalizar a Pesquisa, anúncios e outros serviços Google.</translation> <translation id="2894757982205307093">Nova guia no grupo</translation> <translation id="289695669188700754">ID da chave: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Esta configuração personalizada será removida quando você fechar todas as janelas anônimas</translation> @@ -2654,7 +2653,6 @@ <translation id="3856096718352044181">Verifique se o provedor é válido ou tente novamente mais tarde</translation> <translation id="3856800405688283469">Selecionar fuso horário</translation> <translation id="3857807444929313943">Tire o dedo e toque novamente</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sincronização pausada</translation> <translation id="3861638017150647085">O nome de usuário "<ph name="USERNAME" />" não está disponível</translation> <translation id="3861977424605124250">Exibir na inicialização</translation> <translation id="3862788408946266506">O app com o atributo de manifesto "kiosk_only" precisa ser instalado no modo quiosque do Chrome OS</translation> @@ -3546,7 +3544,6 @@ <translation id="4881685975363383806">Não me lembrar na próxima vez</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="4882312758060467256">Tem acesso a este site</translation> -<translation id="4882831918239250449">Controla como o histórico de navegação é usado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="4882919381756638075">Os sites geralmente usam o microfone para recursos de comunicação, como chat por vídeo</translation> <translation id="4883436287898674711">Todos os sites de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Gerenciador de tarefas</translation> @@ -4346,7 +4343,6 @@ <translation id="5794414402486823030">Sempre abrir com visualizador do sistema</translation> <translation id="5794700615121138172">Pastas compartilhadas do Linux</translation> <translation id="5794786537412027208">Sair de todos os aplicativos do Google Chrome</translation> -<translation id="5797070761912323120">O histórico será usado para personalizar a Pesquisa, anúncios e outros serviços Google.</translation> <translation id="5798079537501238810">Os sites podem instalar gerenciadores de pagamento</translation> <translation id="579907812742603813">conteúdo protegido</translation> <translation id="579915268381781820">Sua chave de segurança foi removida.</translation> @@ -4707,7 +4703,6 @@ <translation id="6208521041562685716">Ativando dados móveis</translation> <translation id="6209838773933913227">Atualizando componente</translation> <translation id="6209908325007204267">Seu dispositivo inclui um Upgrade do Chrome Enterprise, mas seu nome de usuário não está associado a uma conta corporativa. Acesse g.co/ChromeEnterpriseAccount em outro dispositivo para criar uma conta corporativa.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: a sincronização não está funcionando</translation> <translation id="6212039847102026977">Mostrar propriedades de rede avançadas</translation> <translation id="6212168817037875041">Desligar a tela</translation> <translation id="6212752530110374741">Enviar link por e-mail</translation> @@ -5796,6 +5791,7 @@ <translation id="7427348830195639090">Página de plano de fundo: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Chamada de <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nenhum dispositivo HID encontrado</translation> +<translation id="7431991332293347422">Controla como o histórico de navegação é usado para personalizar a Pesquisa e muito mais</translation> <translation id="7433708794692032816">Insira o cartão inteligente para continuar usando seu <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Manter assim</translation> <translation id="7434509671034404296">Desenvolvedor</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index cda1ff8e..7b51cb1c 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Para limpar os dados de navegação de todos os seus dispositivos sincronizados e da sua Conta Google, <ph name="BEGIN_LINK" />aceda às definições de sincronização<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Im&primir...</translation> <translation id="1176471985365269981">Sem autorização para editar ficheiros ou pastas no seu dispositivo</translation> -<translation id="1177138678118607465">A Google pode utilizar o seu histórico de navegação para personalizar a Pesquisa, os anúncios e outros serviços Google. Pode alterar esta definição em qualquer altura em myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Personalizado</translation> <translation id="1178581264944972037">Pausa</translation> <translation id="117916940443676133">A sua chave de segurança não está protegida com um PIN. Para gerir os dados de início de sessão, crie primeiro um PIN.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">A iniciar a máquina virtual…</translation> <translation id="1603914832182249871">(Navegação anónima)</translation> <translation id="1604432177629086300">Não foi possível imprimir. Verifique a impressora e tente novamente.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: a sincronização de palavras-passe não está a funcionar</translation> <translation id="1607139524282324606">Limpar entrada</translation> <translation id="1607499585984539560">O utilizador não está afiliado ao domínio</translation> <translation id="1608626060424371292">Remover este utilizador</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">Abrir link com...</translation> <translation id="2891922230654533301">Pretende utilizar o seu dispositivo para iniciar sessão na app <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Navegador predefinido</translation> +<translation id="2893180576842394309">A Google pode utilizar o seu histórico para personalizar a Pesquisa e outros serviços Google.</translation> <translation id="2894757982205307093">Novo separador no grupo</translation> <translation id="289695669188700754">ID da chave: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Esta definição personalizada é removida quando fecha todas as janelas de navegação anónima.</translation> @@ -2638,7 +2637,6 @@ <translation id="3856096718352044181">Confirme que se trata de um fornecedor válido ou tente novamente mais tarde.</translation> <translation id="3856800405688283469">Selecionar fuso horário</translation> <translation id="3857807444929313943">Levante e toque novamente</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sincronização em pausa</translation> <translation id="3861638017150647085">O nome de utilizador "<ph name="USERNAME" />" não está disponível.</translation> <translation id="3861977424605124250">Mostrar no arranque</translation> <translation id="3862788408946266506">É necessário instalar a aplicação com o atributo de manifesto "kiosk_only" no modo quiosque do Chrome OS.</translation> @@ -3529,7 +3527,6 @@ <translation id="4881685975363383806">Não lembrar novamente</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="4882312758060467256">Tem acesso a este site</translation> -<translation id="4882831918239250449">Controlar a forma como o histórico de navegação é utilizado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="4882919381756638075">Normalmente, os sites utilizam o seu microfone para funcionalidades de comunicação como chat de vídeo.</translation> <translation id="4883436287898674711">Todos os sites de <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Gestor de &Tarefas</translation> @@ -4329,7 +4326,6 @@ <translation id="5794414402486823030">Abrir sempre com o visualizador do sistema</translation> <translation id="5794700615121138172">Pastas partilhadas do Linux</translation> <translation id="5794786537412027208">Sair de todas as Apps do Chrome</translation> -<translation id="5797070761912323120">A Google pode utilizar o seu histórico para personalizar a Pesquisa, os anúncios e outros serviços Google.</translation> <translation id="5798079537501238810">Os sites podem instalar controladores de pagamentos</translation> <translation id="579907812742603813">conteúdo protegido</translation> <translation id="579915268381781820">A sua chave de segurança foi removida.</translation> @@ -4690,7 +4686,6 @@ <translation id="6208521041562685716">Os dados móveis estão a ser ativados</translation> <translation id="6209838773933913227">Atualização de componentes</translation> <translation id="6209908325007204267">O seu dispositivo inclui uma Atualização do Chrome Enterprise, mas o seu nome de utilizador não está associado a uma conta de empresa. Crie uma conta de empresa ao visitar g.co/ChromeEnterpriseAccount num dispositivo secundário.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: a sincronização não está a funcionar</translation> <translation id="6212039847102026977">Mostrar propriedades de rede avançadas</translation> <translation id="6212168817037875041">Desligar o ecrã</translation> <translation id="6212752530110374741">Enviar link por email</translation> @@ -5779,6 +5774,7 @@ <translation id="7427348830195639090">Página de fundo: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Chamada de <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nenhum dispositivo HID encontrado.</translation> +<translation id="7431991332293347422">Controle a forma como o histórico de navegação é utilizado para personalizar a Pesquisa e muito mais.</translation> <translation id="7433708794692032816">Insira o cartão inteligente para continuar a utilizar o dispositivo <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Manter</translation> <translation id="7434509671034404296">Programador</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 5312acc..b22d9a2 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Pentru a șterge datele de navigare de pe toate dispozitivele sincronizate și din Contul Google, <ph name="BEGIN_LINK" />accesează setările de sincronizare<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Printează...</translation> <translation id="1176471985365269981">Nu au permisiunea de a modifica fișiere sau dosare de pe dispozitiv</translation> -<translation id="1177138678118607465">Google poate folosi istoricul de navigare pentru a personaliza Căutarea, anunțurile și alte servicii Google. Poți schimba oricând această opțiune la myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Personalizează</translation> <translation id="1178581264944972037">Întrerupe</translation> <translation id="117916940443676133">Cheia de securitate nu este protejată printr-un cod PIN. Pentru a gestiona datele de conectare, creează mai întâi un cod PIN.</translation> @@ -553,7 +552,6 @@ <translation id="1602085790802918092">Se pornește mașina virtuală</translation> <translation id="1603914832182249871">(Incognito)</translation> <translation id="1604432177629086300">Nu s-a putut printa. Verifică imprimanta și încearcă din nou.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: sincronizarea parolelor nu funcționează</translation> <translation id="1607139524282324606">Șterge intrarea</translation> <translation id="1607499585984539560">Utilizatorul nu este asociat cu domeniul</translation> <translation id="1608626060424371292">Ștergeți acest utilizator</translation> @@ -1758,6 +1756,7 @@ <translation id="2889064240420137087">Deschide linkul cu...</translation> <translation id="2891922230654533301">Folosești dispozitivul pentru a te conecta la <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Browserul prestabilit</translation> +<translation id="2893180576842394309">Google poate folosi istoricul pentru a personaliza Căutarea și alte servicii Google</translation> <translation id="2894757982205307093">Filă nouă în grup</translation> <translation id="289695669188700754">ID cheie: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Această setare personalizată va fi eliminată când închizi toate ferestrele incognito</translation> @@ -2638,7 +2637,6 @@ <translation id="3856096718352044181">Confirmă dacă acesta este un furnizor valid sau încearcă din nou mai târziu</translation> <translation id="3856800405688283469">Selectează fusul orar</translation> <translation id="3857807444929313943">Ridică, apoi atinge din nou</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sincronizarea a fost întreruptă</translation> <translation id="3861638017150647085">Numele de utilizator „<ph name="USERNAME" />” nu este disponibil</translation> <translation id="3861977424605124250">Afișează la pornire</translation> <translation id="3862788408946266506">Aplicația cu atributul „kiosk_only” din manifest trebuie să fie instalată în modul chioșc pentru sistemul de operare Chrome</translation> @@ -3529,7 +3527,6 @@ <translation id="4881685975363383806">Nu-mi reaminti data viitoare</translation> <translation id="4881695831933465202">Deschide</translation> <translation id="4882312758060467256">Are acces la acest site</translation> -<translation id="4882831918239250449">Controlează modul în care istoricul de navigare este folosit pentru a personaliza Căutarea, anunțurile și alte servicii</translation> <translation id="4882919381756638075">Site-urile folosesc de obicei microfonul pentru opțiuni de comunicare, cum ar fi chatul video</translation> <translation id="4883436287898674711">Toate site-urile <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Manager de ac&tivități</translation> @@ -4328,7 +4325,6 @@ <translation id="5794414402486823030">Deschide întotdeauna cu Utilitarul de vizualizare al sistemului</translation> <translation id="5794700615121138172">Dosare comune în Linux</translation> <translation id="5794786537412027208">Ieși din toate aplicațiile Chrome</translation> -<translation id="5797070761912323120">Google poate folosi istoricul pentru a personaliza Căutarea, anunțurile și alte servicii Google</translation> <translation id="5798079537501238810">Site-urile pot instala handlere pentru plăți</translation> <translation id="579907812742603813">Conținut protejat</translation> <translation id="579915268381781820">Cheia de securitate a fost eliminată.</translation> @@ -4689,7 +4685,6 @@ <translation id="6208521041562685716">Se activează datele mobile</translation> <translation id="6209838773933913227">Se actualizează componentele</translation> <translation id="6209908325007204267">Dispozitivul tău conține un upgrade la Chrome Enterprise, dar numele tău de utilizator nu este asociat unui cont de întreprindere. Creează un cont de întreprindere accesând g.co/ChromeEnterpriseAccount de pe alt dispozitiv.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sincronizarea nu funcționează</translation> <translation id="6212039847102026977">Afișează proprietățile avansate pentru rețea</translation> <translation id="6212168817037875041">Dezactivează ecranul</translation> <translation id="6212752530110374741">Trimite linkul prin e-mail</translation> @@ -5778,6 +5773,7 @@ <translation id="7427348830195639090">Pagină de fundal: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Apel de la <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nu a fost găsit niciun dispozitiv HID</translation> +<translation id="7431991332293347422">Controlează modul în care istoricul de navigare este folosit pentru a personaliza Căutarea și alte servicii</translation> <translation id="7433708794692032816">Introdu cardul inteligent pentru a folosi în continuare dispozitivul <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Păstreaz-o</translation> <translation id="7434509671034404296">Dezvoltator</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 35cf076..2752d77 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Чтобы удалить данные о работе в браузере со всех синхронизированных устройств и из аккаунта Google, перейдите в <ph name="BEGIN_LINK" />настройки синхронизации<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Печать...</translation> <translation id="1176471985365269981">Сайты, которым запрещено изменять файлы и папки на устройстве:</translation> -<translation id="1177138678118607465">Google может использовать историю браузера, чтобы персонализировать объявления, а также Поиск и другие сервисы. Чтобы настроить эту функцию, перейдите на страницу myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Персонализированные</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="117916940443676133">Ваш электронный ключ не защищен PIN-кодом. Чтобы управлять учетными данными, создайте PIN-код.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Запуск виртуальной машины</translation> <translation id="1603914832182249871">(инкогнито)</translation> <translation id="1604432177629086300">Ошибка печати. Проверьте принтер и повторите попытку.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: синхронизация паролей не работает</translation> <translation id="1607139524282324606">Очистить запись</translation> <translation id="1607499585984539560">Пользователь не связан с доменом.</translation> <translation id="1608626060424371292">Удалить профиль</translation> @@ -1758,6 +1756,7 @@ <translation id="2889064240420137087">Открыть ссылку с помощью...</translation> <translation id="2891922230654533301">Использовать устройство для входа на сайте <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Браузер по умолчанию</translation> +<translation id="2893180576842394309">Google может использовать вашу историю, чтобы персонализировать Поиск и другие сервисы.</translation> <translation id="2894757982205307093">Добавить новую вкладку в группу</translation> <translation id="289695669188700754">Идентификатор ключа: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Когда вы закроете все окна в режиме инкогнито, эта специальная настройка будет сброшена</translation> @@ -2638,7 +2637,6 @@ <translation id="3856096718352044181">Убедитесь, что это действительный поставщик услуг, или повторите попытку позже.</translation> <translation id="3856800405688283469">Выберите часовой пояс</translation> <translation id="3857807444929313943">Коснитесь несколько раз</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: синхронизация приостановлена</translation> <translation id="3861638017150647085">Имя пользователя "<ph name="USERNAME" />" недоступно.</translation> <translation id="3861977424605124250">Показывать при запуске</translation> <translation id="3862788408946266506">Приложения, у которых в манифесте есть атрибут kiosk_only, можно устанавливать только в режиме киоска</translation> @@ -3529,7 +3527,6 @@ <translation id="4881685975363383806">Не напоминать в следующий раз</translation> <translation id="4881695831933465202">Открыть</translation> <translation id="4882312758060467256">У расширения есть доступ к этому сайту</translation> -<translation id="4882831918239250449">Использование данных о посещенных страницах для персонализации Поиска, рекламы и т. д.</translation> <translation id="4882919381756638075">Обычно сайты используют микрофон для функций общения, например видеочата.</translation> <translation id="4883436287898674711">Все сайты <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">Диспетчер задач</translation> @@ -4328,7 +4325,6 @@ <translation id="5794414402486823030">Всегда открывать в программе просмотра по умолчанию</translation> <translation id="5794700615121138172">Общие папки Linux</translation> <translation id="5794786537412027208">Закрыть все приложения Chrome</translation> -<translation id="5797070761912323120">Google может использовать вашу историю, чтобы персонализировать рекламу, а также Поиск и другие сервисы.</translation> <translation id="5798079537501238810">Разрешить сайтам устанавливать обработчики платежей</translation> <translation id="579907812742603813">Защищенный контент</translation> <translation id="579915268381781820">Электронный ключ не подключен.</translation> @@ -4689,7 +4685,6 @@ <translation id="6208521041562685716">Мобильный Интернет активирован</translation> <translation id="6209838773933913227">Обновление компонента</translation> <translation id="6209908325007204267">На этом устройстве есть лицензия Chrome Enterprise, но ваше имя пользователя не связано с корпоративным аккаунтом. Создайте корпоративный аккаунт на странице g.co/ChromeEnterpriseAccount, используя другое устройство.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ошибка синхронизации</translation> <translation id="6212039847102026977">Показать дополнительные свойства сети</translation> <translation id="6212168817037875041">Выключать экран</translation> <translation id="6212752530110374741">Отправить ссылку по эл. почте</translation> @@ -5778,6 +5773,7 @@ <translation id="7427348830195639090">Фоновая страница: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Позвонить с устройства "<ph name="DEVICE_NAME" />"</translation> <translation id="7431719494109538750">HID-устройства не найдены.</translation> +<translation id="7431991332293347422">Укажите, как Google может использовать историю браузера для персонализации Поиска и других сервисов.</translation> <translation id="7433708794692032816">Не вынимайте смарт-карту, чтобы и дальше использовать <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Оставить так</translation> <translation id="7434509671034404296">Разработчикам</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 9cedbeb2..6383d60 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">ඔබේ සියලුම සමමුහුර්ත කළ උපාංගවලින් සහ ඔබේ Google ගිණුමෙන් බ්රවුස් කිරීමේ දත්ත හිස් කිරීමට, <ph name="BEGIN_LINK" />සමමුහුර්ත සැකසීම් වෙත පැමිණෙන්න<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&මුද්රණය...</translation> <translation id="1176471985365269981">ඔබගේ උපාංගයෙහි ගොනු සහ ෆෝල්ඩර සංස්කරණය කිරීමට ඉඩ නොදේ</translation> -<translation id="1177138678118607465">සෙවීම, දැන්වීම්, සහ වෙනත් Google සේවාවන් පෞද්ගලීකරණය කිරීමට Google ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය භාවිතා කරනු ඇත. ඔබට මෙය ඕනෑම වේලාවක myaccount.google.com/activitycontrols/search හි වෙනස් කළ හැක</translation> <translation id="1177863135347784049">සැකසුම්</translation> <translation id="1178581264944972037">විරාමය</translation> <translation id="117916940443676133">ඔබේ ආරක්ෂක යතුරු රහස් අංකයකින් ආරක්ෂා නොකෙරේ. පුරන දත්ත කළමනා කිරීමට, පළමුව රහස් අංකයක් නිර්මාණ කරන්න.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">අතත්ය යන්ත්රය ආරම්භ කිරීම</translation> <translation id="1603914832182249871">(අප්රකට)</translation> <translation id="1604432177629086300">මුද්රණ කිරීමට නොහැකි විය. මුද්රකය පරීක්ෂා කර නැවත උත්සාහ කරන්න.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: මුරපද සමමුහූර්තය ක්රියා නොකරයි</translation> <translation id="1607139524282324606">ඇතුළු කිරීම හිස් කරන්න</translation> <translation id="1607499585984539560">පරිශීලකයා වසම සමඟ අනුබද්ධ නොවේ</translation> <translation id="1608626060424371292">මෙම භාවිතකරු ඉවත් කරන්න</translation> @@ -1760,6 +1758,7 @@ <translation id="2889064240420137087">සමඟ සබැඳිය විවෘත කරන්න...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> වෙත පිරීමට ඔබගේ උපාංගය භාවිත කරන්නද?</translation> <translation id="2893168226686371498">පෙරනිමි බ්රව්සරය</translation> +<translation id="2893180576842394309">සෙවීම සහ අනෙකුත් Google සේවා පුද්ගලායන කිරීමට Google ඔබේ ඉතිහාසය භාවිත කළ හැක</translation> <translation id="2894757982205307093">කණ්ඩායම තුළ නව පටිත්ත</translation> <translation id="289695669188700754">යතුරු ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ඔබ ඔබගේ සියලු අප්රසිද්ධ කවුළු වැසූ විට මෙම අභිරුචි සැකසීම ඉවත් කරනු ඇත</translation> @@ -2641,7 +2640,6 @@ <translation id="3856096718352044181">මෙය වලංගු සැපයුම්කරුවෙක් බව සත්යාපන කරන්න, නැති නම් පසුව නැවත උත්සාහ කරන්න</translation> <translation id="3856800405688283469">වේලා කලාපය තෝරන්න</translation> <translation id="3857807444929313943">ඔසවා, පසුව නැවත ස්පර්ශ කරන්න</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: සමමුහුර්ත කිරීම විරාම කරන ලදී</translation> <translation id="3861638017150647085">පරිශීලක නාමය "<ph name="USERNAME" />" නොලැබේ</translation> <translation id="3861977424605124250">ඇරඹුමේදී පෙන්වන්න</translation> <translation id="3862788408946266506">'kiosk_only' මැනිෆෙස්ට් උපලක්ෂණය සහිත යෙදුම Chrome OS කියෝස්ක් ප්රකාරයේ ස්ථාපනය කළ යුතුය</translation> @@ -3532,7 +3530,6 @@ <translation id="4881685975363383806">ඊළඟ අවස්ථාවේදී මට මතක් නොකරන්න</translation> <translation id="4881695831933465202">විවෘත කරන්න</translation> <translation id="4882312758060467256">මෙම වෙබ් අඩවියට පිවිස ඇත</translation> -<translation id="4882831918239250449">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය සෙවීම, වෙළඳ දැන්වීම් සහ තවත් දේ පෞද්ගලිකකරණය කිරීමට භාවිත කරන ආකාරය පාලනය කිරීම</translation> <translation id="4882919381756638075">අඩවි සාමාන්යයෙන් වීඩියෝ කතාබහ වැනි සන්නිවේදන විශේෂාංග සඳහා ඔබගේ මයික්රෆෝනය භාවිත කරයි</translation> <translation id="4883436287898674711">සියලු <ph name="WEBSITE_1" /> අඩවි</translation> <translation id="48838266408104654">&කාර්ය කළමනාකරු</translation> @@ -4332,7 +4329,6 @@ <translation id="5794414402486823030">සෑම විටම පද්ධති දර්ශකය සමග විවෘත කරන්න</translation> <translation id="5794700615121138172">ලිනක්ස් බෙදාගත් ෆෝල්ඩර</translation> <translation id="5794786537412027208">සියලු Chrome යෙදුම්වලින් ඉවත් වන්න</translation> -<translation id="5797070761912323120">සෙවීම, දැන්වීම් සහ අනෙකුත් Google සේවා පුද්ගලායන කිරීමට Google ඔබේ ඉතිහාසය භාවිත කළ හැක</translation> <translation id="5798079537501238810">අඩවිවලට ගෙවීම් හසුරු ස්ථාපනය කළ හැකිය</translation> <translation id="579907812742603813">ආරක්ෂිත අන්තර්ගතය</translation> <translation id="579915268381781820">ඔබේ ආරක්ෂක යතුර ඉවත් කරනු ලැබීය.</translation> @@ -4693,7 +4689,6 @@ <translation id="6208521041562685716">ජංගම දත්ත ක්රියාත්මක කරනු ලැබේ</translation> <translation id="6209838773933913227">සංඝටක යාවත්කාලීනය</translation> <translation id="6209908325007204267">ඔබේ උපාංගයට Chrome ව්යවසාය උත්ශ්රේණිගත කිරීමක් ඇතුළත් වේ, නමුත් ඔබේ පරිශීලක නම ව්යවසාය ගිණුමක් සමග ආශ්රිත නොවේ. ද්විතීයික උපාංගයක g.co/ChromeEnterpriseAccount කරා පිවිසීමෙන් ව්යවසාය ගිණුමක් සාදන්න.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: සමමුහුර්ත කිරීම ක්රියා නොකරයි</translation> <translation id="6212039847102026977">උසස් ජාල ගුණාංග පෙන්වන්න</translation> <translation id="6212168817037875041">සංදර්ශකය ක්රියා විරහිත කරන්න</translation> <translation id="6212752530110374741">සබැඳිය ඊ-තැපැල් කරන්න</translation> @@ -5780,6 +5775,7 @@ <translation id="7427348830195639090">පසුබිම් පිටුව: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> වෙතින් ඇමතුමක්</translation> <translation id="7431719494109538750">HID උපාංග කිසිවක් හමු නොවිය</translation> +<translation id="7431991332293347422">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය සෙවීම, සහ තවත් දේ පුද්ගලායන කිරීමට භාවිත කරන ආකාරය පාලන කිරීම</translation> <translation id="7433708794692032816">ඔබගේ <ph name="DEVICE_TYPE" /> භාවිත කිරීම දිගටම සිදු කිරීමට ස්මාර්ට් කාඩ්පත ඇතුළු කරන්න</translation> <translation id="7433957986129316853">එය තබා ගන්න</translation> <translation id="7434509671034404296">සංවර්ධක</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 92d48977..574ed326 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Ak chcete vymazať dáta prehliadania zo všetkých synchronizovaných zariadení a účtu Google, <ph name="BEGIN_LINK" />prejdite do nastavení synchronizácie<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Tlačiť...</translation> <translation id="1176471985365269981">Nie je povolená úprava súborov ani priečinkov v zariadení</translation> -<translation id="1177138678118607465">Google môže používať vašu históriu prehliadania na prispôsobenie vyhľadávania, reklám a ďalších služieb Googlu. Toto správanie môžete kedykoľvek zmeniť na adrese myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Vlastné</translation> <translation id="1178581264944972037">Pozastaviť</translation> <translation id="117916940443676133">Váš bezpečnostný kľúč nie je chránený kódom PIN. Ak chcete spravovať prihlasovacie údaje, najprv vytvorte PIN.</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Spúšťa sa virtuálny počítač</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Tlač zlyhala. Skontrolujte tlačiareň a skúste to znova.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: nefunguje synchronizácia hesiel</translation> <translation id="1607139524282324606">Vymazať záznam</translation> <translation id="1607499585984539560">Používateľ nie je spojený s doménou</translation> <translation id="1608626060424371292">Odstrániť tohto používateľa</translation> @@ -1759,6 +1757,7 @@ <translation id="2889064240420137087">Otvoriť odkaz pomocou...</translation> <translation id="2891922230654533301">Chcete sa pomocou svojho zariadenia prihlásiť do aplikácie <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Predvolený prehliadač</translation> +<translation id="2893180576842394309">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie a ďalšie služby Googlu</translation> <translation id="2894757982205307093">Nová karta v skupine</translation> <translation id="289695669188700754">Identifikácia kľúča: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Keď zavriete všetky okná inkognito, toto vlastné nastavenie bude odstránené</translation> @@ -2639,7 +2638,6 @@ <translation id="3856096718352044181">Overte, že ide o platného poskytovateľa, alebo to skúste znova</translation> <translation id="3856800405688283469">Výber časového pásma</translation> <translation id="3857807444929313943">Zdvihnite a opäť priložte</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: synchronizácia je pozastavená</translation> <translation id="3861638017150647085">Používateľské meno <ph name="USERNAME" /> nie je k dispozícii</translation> <translation id="3861977424605124250">Zobrazovať pri spustení</translation> <translation id="3862788408946266506">Aplikácia s atribútom manifestu „kiosk_only“ musí byť nainštalovaná v režime verejného terminálu systému Chrome OS</translation> @@ -3530,7 +3528,6 @@ <translation id="4881685975363383806">Nabudúce nepripomínať</translation> <translation id="4881695831933465202">Otvoriť</translation> <translation id="4882312758060467256">Má prístup k tomuto webu</translation> -<translation id="4882831918239250449">Ovládajte, ako sa pomocou histórie prehliadania prispôsobuje Vyhľadávanie, reklamy a ďalší obsah</translation> <translation id="4882919381756638075">Weby zvyčajne používajú váš mikrofón, aby mohli poskytovať komunikačné funkcie, ako sú videohovory</translation> <translation id="4883436287898674711">Všetky weby <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Správca úloh</translation> @@ -4329,7 +4326,6 @@ <translation id="5794414402486823030">Vždy otvárať pomocou systémového zobrazovača</translation> <translation id="5794700615121138172">Zdieľané priečinky v systéme Linux</translation> <translation id="5794786537412027208">Ukončiť všetky aplikácie Chrome</translation> -<translation id="5797070761912323120">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie, reklamy a ďalšie služby Googlu</translation> <translation id="5798079537501238810">Weby môžu inštalovať obslužné nástroje platieb</translation> <translation id="579907812742603813">chránený obsah</translation> <translation id="579915268381781820">Bezpečnostný kľúč bol odstránený.</translation> @@ -4690,7 +4686,6 @@ <translation id="6208521041562685716">Mobilné dáta sa aktivujú</translation> <translation id="6209838773933913227">Aktualizuje sa komponent</translation> <translation id="6209908325007204267">Vaše zariadenie zahŕňa inováciu Chrome Enterprise, ale vaše používateľské meno nie je spojené s účtom Enterprise. Vytvorte si účet Enterprise v druhom zariadení na g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: synchronizácia nefunguje</translation> <translation id="6212039847102026977">Zobraziť rozšírené vlastnosti siete</translation> <translation id="6212168817037875041">Vypnúť obrazovku</translation> <translation id="6212752530110374741">Odoslať odkaz e-mailom</translation> @@ -5779,6 +5774,7 @@ <translation id="7427348830195639090">Stránka na pozadí: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Volať zo zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Neboli nájdené žiadne zariadenia HID</translation> +<translation id="7431991332293347422">Ovládajte, ako sa história prehliadania používa na prispôsobenie Vyhľadávania a ďalšieho obsahu</translation> <translation id="7433708794692032816">Ak chcete naďalej používať zariadenie <ph name="DEVICE_TYPE" />, vložte čipovú kartu</translation> <translation id="7433957986129316853">Ponechať</translation> <translation id="7434509671034404296">Vývojár</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 725407f..0d8378b 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Če želite izbrisati podatke brskanja iz vseh sinhroniziranih naprav in Google Računa, <ph name="BEGIN_LINK" />odprite nastavitve sinhronizacije<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Natisni ...</translation> <translation id="1176471985365269981">Ni dovoljeno urejanje datotek ali map v napravi.</translation> -<translation id="1177138678118607465">Google lahko uporabi vašo zgodovino brskanja za prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev. To lahko kadar koli spremenite na myaccount.google.com/activitycontrols/search.</translation> <translation id="1177863135347784049">Po meri</translation> <translation id="1178581264944972037">Prekini</translation> <translation id="117916940443676133">Vaš varnostni ključ ni zaščiten s kodo PIN. Če želite upravljati podatke za prijavo, naprej ustvarite kodo PIN.</translation> @@ -558,7 +557,6 @@ <translation id="1602085790802918092">Zagon navideznega računalnika</translation> <translation id="1603914832182249871">(Anonimni način)</translation> <translation id="1604432177629086300">Ni bilo mogoče tiskati. Preverite tiskalnik in poskusite znova.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: sinhronizacija gesel ne deluje</translation> <translation id="1607139524282324606">Izbris vnosa</translation> <translation id="1607499585984539560">Uporabnik ni povezan z domeno.</translation> <translation id="1608626060424371292">Odstrani tega uporabnika</translation> @@ -1775,6 +1773,7 @@ <translation id="2889064240420137087">Odpri povezavo z ...</translation> <translation id="2891922230654533301">Ali se želite z napravo prijaviti v aplikacijo <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Privzeti brskalnik</translation> +<translation id="2893180576842394309">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google in drugih Googlovih storitev</translation> <translation id="2894757982205307093">Novi zavihek v skupini</translation> <translation id="289695669188700754">ID ključa: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ta nastavitev po meri bo odstranjena, ko zaprete vsa anonimna okna.</translation> @@ -2655,7 +2654,6 @@ <translation id="3856096718352044181">Preverite, ali je ponudnik veljaven, in poskusite pozneje znova</translation> <translation id="3856800405688283469">Izbira časovnega pasu</translation> <translation id="3857807444929313943">Dvignite in se spet dotaknite</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinhronizacija je zaustavljena</translation> <translation id="3861638017150647085">Uporabniško ime »<ph name="USERNAME" />« ni na voljo</translation> <translation id="3861977424605124250">Pokaži ob zagonu</translation> <translation id="3862788408946266506">Aplikacijo z atributom manifesta »kiosk_only« je treba namestiti v načinu kioska sistema OS Chrome</translation> @@ -3547,7 +3545,6 @@ <translation id="4881685975363383806">Ne opomni me naslednjič</translation> <translation id="4881695831933465202">Odpri</translation> <translation id="4882312758060467256">Ima dostop do tega spletnega mesta</translation> -<translation id="4882831918239250449">Nadziranje, kako se zgodovina brskanja uporabi za prilagajanje Iskanja Google, oglasov in drugega</translation> <translation id="4882919381756638075">Spletna mesta običajno uporabljajo mikrofon za komunikacijske funkcije, kot je videoklepet.</translation> <translation id="4883436287898674711">Vsa spletna mesta <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Upravitelj opravil</translation> @@ -4348,7 +4345,6 @@ <translation id="5794414402486823030">Vedno odpri s sistemskim pregledovalnikom</translation> <translation id="5794700615121138172">Mape Linux, deljene z drugimi</translation> <translation id="5794786537412027208">Zapri vse aplikacije za Chrome</translation> -<translation id="5797070761912323120">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev</translation> <translation id="5798079537501238810">Spletna mesta lahko namestijo rutine za obravnavo plačil.</translation> <translation id="579907812742603813">zaščitena vsebina</translation> <translation id="579915268381781820">Varnostni ključ je bil odstranjen.</translation> @@ -4709,7 +4705,6 @@ <translation id="6208521041562685716">Prenos podatkov v mobilnih omrežjih je v postopku aktiviranja</translation> <translation id="6209838773933913227">Posodabljanje komponente</translation> <translation id="6209908325007204267">Vaša naprava vključuje nadgradnjo za Chrome za podjetja, vendar vaše uporabniško ime ni povezano z računom za podjetje. Ustvarite račun za podjetje, tako da v drugi napravi obiščete g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinhronizacija ne deluje</translation> <translation id="6212039847102026977">Prikaži dodatne lastnosti omrežja</translation> <translation id="6212168817037875041">Izklop zaslona</translation> <translation id="6212752530110374741">Pošlji povezavo po e-pošti</translation> @@ -5798,6 +5793,7 @@ <translation id="7427348830195639090">Stran v ozadju: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Klic osebe <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Ni naprav HID</translation> +<translation id="7431991332293347422">Nadziranje, kako se zgodovina brskanja uporabi za prilagajanje Iskanja Google in drugega</translation> <translation id="7433708794692032816">Vstavite pametno kartico, če želite še naprej uporabljati napravo <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Ohrani</translation> <translation id="7434509671034404296">Razvijalec</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index a34ea8d..11e8b48 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Për të pastruar të dhënat e shfletimit nga të gjitha pajisjet e tua të sinkronizuara dhe nga "Llogaria e Google", <ph name="BEGIN_LINK" />vizito cilësimet e sinkronizimit<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Printo...</translation> <translation id="1176471985365269981">Nuk lejohen të modifikojnë skedarët ose dosjet në pajisjen tënde</translation> -<translation id="1177138678118607465">Google mund ta përdorë historikun tënd të shfletimit për të personalizuar "Kërko", reklamat dhe shërbime të tjera të Google. Këtë mund ta ndryshosh në çdo kohë te myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">E personalizuar</translation> <translation id="1178581264944972037">Pauzë</translation> <translation id="117916940443676133">Çelësi yt i sigurisë nuk është i mbrojtur me një kod PIN. Për të menaxhuar të dhënat e identifikimit, në fillim krijo një kod PIN.</translation> @@ -549,7 +548,6 @@ <translation id="1602085790802918092">Pajisja virtuale po niset</translation> <translation id="1603914832182249871">(I fshehtë)</translation> <translation id="1604432177629086300">Nuk mund të printohej. Kontrollo printerin dhe provo përsëri.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Sinkronizimi i fjalëkalimeve nuk po funksionon</translation> <translation id="1607139524282324606">Pastro regjistrimin</translation> <translation id="1607499585984539560">Përdoruesi nuk ka lidhje me domenin</translation> <translation id="1608626060424371292">Hiqe këtë përdorues</translation> @@ -1754,6 +1752,7 @@ <translation id="2889064240420137087">Hap lidhjen me...</translation> <translation id="2891922230654533301">Dëshiron ta përdorësh këtë pajisje për t'u identifikuar në <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Shfletuesi i parazgjedhur</translation> +<translation id="2893180576842394309">Google mund ta përdorë historikun tënd për të personalizuar "Kërko me Google" dhe shërbime të tjera të Google</translation> <translation id="2894757982205307093">Skedë e re në grup</translation> <translation id="289695669188700754">ID-ja e çelësit: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ky cilësim i parazgjedhur do të hiqet kur të mbyllësh të gjitha dritaret "e fshehta"</translation> @@ -2633,7 +2632,6 @@ <translation id="3856096718352044181">Verifiko që ky është një ofrues i vlefshëm ose provo përsëri më vonë</translation> <translation id="3856800405688283469">Zgjidh zonën orare</translation> <translation id="3857807444929313943">Ngrije dhe më pas prek përsëri</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Sinkronizimi u ndërpre</translation> <translation id="3861638017150647085">Emri i përdoruesit "<ph name="USERNAME" />" nuk ofrohet</translation> <translation id="3861977424605124250">Shfaq në momentin e nisjes</translation> <translation id="3862788408946266506">Aplikacioni me cilësinë e shfaqjes "kiosk_only" duhet të instalohet në modalitetin "kioskë" të sistemit operativ Chrome</translation> @@ -3524,7 +3522,6 @@ <translation id="4881685975363383806">Mos ma kujto herën tjetër</translation> <translation id="4881695831933465202">Hap</translation> <translation id="4882312758060467256">Ka qasje te ky sajt</translation> -<translation id="4882831918239250449">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin", reklamat dhe shumë të tjera</translation> <translation id="4882919381756638075">Sajtet përdorin zakonisht mikrofonin për veçoritë e komunikimit si biseda me video</translation> <translation id="4883436287898674711">Të gjitha sajtet <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Menaxheri i detyrave</translation> @@ -4322,7 +4319,6 @@ <translation id="5794414402486823030">Gjithmonë hape me shikuesin e sistemit</translation> <translation id="5794700615121138172">Skedarët e ndarë të Linux</translation> <translation id="5794786537412027208">Dil nga të gjitha aplikacionet e Chrome</translation> -<translation id="5797070761912323120">Google mund ta përdorë historikun tënd për të personalizuar "Kërko me Google", reklamat dhe shërbime të tjera të Google</translation> <translation id="5798079537501238810">Sajtet mund të instalojnë përpunuesit e pagesave</translation> <translation id="579907812742603813">përmbajtja e mbrojtur</translation> <translation id="579915268381781820">Çelësi yt i sigurisë është hequr.</translation> @@ -4683,7 +4679,6 @@ <translation id="6208521041562685716">Të dhënat celulare po aktivizohen</translation> <translation id="6209838773933913227">Përditësimi i përbërësit</translation> <translation id="6209908325007204267">Pajisja jote përfshin një përmirësim të Chrome Enterprise, por emri yt i përdoruesit nuk lidhet me llogarinë e ndërmarrjes. Krijo një llogari të ndërmarrjes duke vizituar g.co/ChromeEnterpriseAccount në një pajisje dytësore.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Sinkronizimi nuk po punon</translation> <translation id="6212039847102026977">Shfaq karakteristikat e përparuara të rrjetit</translation> <translation id="6212168817037875041">Fik ekranin</translation> <translation id="6212752530110374741">Dërgo me email lidhjen</translation> @@ -5771,6 +5766,7 @@ <translation id="7427348830195639090">Faqja në sfond: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Telefonatë nga <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nuk u gjetën pajisje HID</translation> +<translation id="7431991332293347422">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin" dhe shumë të tjera</translation> <translation id="7433708794692032816">Fut kartën smart për të vazhduar përdorimin e pajisjes sate <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Mbaje</translation> <translation id="7434509671034404296">Zhvilluesi</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index afbc15f..059054f8 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Da biste obrisali podatke pregledanja sa svih sinhronizovanih uređaja i sa Google naloga, <ph name="BEGIN_LINK" />idite u podešavanja sinhronizacije<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Odštampaj...</translation> <translation id="1176471985365269981">Nije im dozvoljeno da menjaju fajlove ili foldere na uređaju</translation> -<translation id="1177138678118607465">Google može da personalizuje Pretragu, oglase i druge Google usluge pomoću istorije pregledanja. To podešavanje možete da promenite u bilo kom trenutku na myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Prilagođeno</translation> <translation id="1178581264944972037">Pauziraj</translation> <translation id="117916940443676133">Bezbednosni ključ nije zaštićen PIN-om. Da biste upravljali podacima za prijavljivanje, prvo napravite PIN.</translation> @@ -551,7 +550,6 @@ <translation id="1602085790802918092">Pokreće se virtuelna mašina</translation> <translation id="1603914832182249871">(Bez arhiviranja)</translation> <translation id="1604432177629086300">Štampanje nije uspelo. Proverite štampač i probajte ponovo.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Sinhronizacija lozinki ne radi</translation> <translation id="1607139524282324606">Obriši unos</translation> <translation id="1607499585984539560">Korisnik nije povezan sa domenom</translation> <translation id="1608626060424371292">Ukloni ovog korisnika</translation> @@ -1756,6 +1754,7 @@ <translation id="2889064240420137087">Otvori link koristeći...</translation> <translation id="2891922230654533301">Želite da koristite uređaj za prijavljivanje u aplikaciju <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Podrazumevani pregledač</translation> +<translation id="2893180576842394309">Google može da koristi istoriju za personalizaciju Pretrage i drugih Google usluga</translation> <translation id="2894757982205307093">Nova kartica u grupi</translation> <translation id="289695669188700754">ID ključa: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ovo prilagođeno podešavanje se uklanja kada zatvorite sve prozore bez arhiviranja</translation> @@ -2636,7 +2635,6 @@ <translation id="3856096718352044181">Proverite da li je ovo važeći dobavljač usluge ili probajte ponovo kasnije</translation> <translation id="3856800405688283469">Izaberite vremensku zonu</translation> <translation id="3857807444929313943">Podignite, pa opet dodirnite</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinhronizacija je pauzirana</translation> <translation id="3861638017150647085">Korisničko ime <ph name="USERNAME" /> nije dostupno</translation> <translation id="3861977424605124250">Prikaži pri pokretanju</translation> <translation id="3862788408946266506">Aplikacija sa atributom manifesta „kiosk_only“ mora da se instalira u režimu kioska u Chrome OS-u</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">Ne podsećaj me sledeći put</translation> <translation id="4881695831933465202">Otvori</translation> <translation id="4882312758060467256">Može da pristupa ovom sajtu</translation> -<translation id="4882831918239250449">Kontrolišite način na koji se istorija pregledanja koristi za personalizaciju Pretrage, oglasa i drugih usluga</translation> <translation id="4882919381756638075">Sajtovi obično koriste mikrofon za potrebe funkcija za komunikaciju poput video ćaskanja</translation> <translation id="4883436287898674711">Svi <ph name="WEBSITE_1" /> sajtovi</translation> <translation id="48838266408104654">&Menadžer zadataka</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">Uvek otvaraj pomoću sistemskog prikazivača</translation> <translation id="5794700615121138172">Deljeni Linux direktorijumi</translation> <translation id="5794786537412027208">Izađi iz svih Chrome aplikacija</translation> -<translation id="5797070761912323120">Google može da koristi istoriju za personalizaciju Pretrage, oglasa i drugih Google usluga</translation> <translation id="5798079537501238810">Sajtovi mogu da instaliraju obrađivače plaćanja</translation> <translation id="579907812742603813">zaštićeni sadržaj</translation> <translation id="579915268381781820">Uklonili ste bezbednosni ključ.</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">Mobilni podaci se aktiviraju</translation> <translation id="6209838773933913227">Ažurira se komponenta</translation> <translation id="6209908325007204267">Uređaj sadrži nadogradnju na Chrome za preduzeća, ali vaše korisničko ime nije povezano sa nalogom preduzeća. Otvorite nalog za preduzeća tako što ćete posetiti g.co/ChromeEnterpriseAccount na sekundarnom uređaju.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: sinhronizacija ne radi</translation> <translation id="6212039847102026977">Prikaži napredna svojstva mreže</translation> <translation id="6212168817037875041">Isključi ekran</translation> <translation id="6212752530110374741">Pošalji link imejlom</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">Stranica u pozadini: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Poziv sa uređaja <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Nije pronađen nijedan uređaj sa interfejsom</translation> +<translation id="7431991332293347422">Kontrolišite kako se istorija pregledanja koristi za personalizovanje Pretrage i drugih usluga</translation> <translation id="7433708794692032816">Umetnite pametnu karticu da biste nastavili da koristite <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Zadrži</translation> <translation id="7434509671034404296">Programer</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index b9bf6066..ca0ea02b 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Да бисте обрисали податке прегледања са свих синхронизованих уређаја и са Google налога, <ph name="BEGIN_LINK" />идите у подешавања синхронизације<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Одштампај...</translation> <translation id="1176471985365269981">Није им дозвољено да мењају фајлове или фолдере на уређају</translation> -<translation id="1177138678118607465">Google може да персонализује Претрагу, огласе и друге Google услуге помоћу историје прегледања. То подешавање можете да промените у било ком тренутку на myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Прилагођено</translation> <translation id="1178581264944972037">Паузирај</translation> <translation id="117916940443676133">Безбедносни кључ није заштићен PIN-ом. Да бисте управљали подацима за пријављивање, прво направите PIN.</translation> @@ -551,7 +550,6 @@ <translation id="1602085790802918092">Покреће се виртуелна машина</translation> <translation id="1603914832182249871">(Без архивирања)</translation> <translation id="1604432177629086300">Штампање није успело. Проверите штампач и пробајте поново.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Синхронизација лозинки не ради</translation> <translation id="1607139524282324606">Обриши унос</translation> <translation id="1607499585984539560">Корисник није повезан са доменом</translation> <translation id="1608626060424371292">Уклони овог корисника</translation> @@ -1756,6 +1754,7 @@ <translation id="2889064240420137087">Отвори линк користећи...</translation> <translation id="2891922230654533301">Желите да користите уређај за пријављивање у апликацију <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Подразумевани прегледач</translation> +<translation id="2893180576842394309">Google може да користи историју за персонализацију Претраге и других Google услуга</translation> <translation id="2894757982205307093">Нова картица у групи</translation> <translation id="289695669188700754">ИД кључа: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Ово прилагођено подешавање се уклања када затворите све прозоре без архивирања</translation> @@ -2636,7 +2635,6 @@ <translation id="3856096718352044181">Проверите да ли је ово важећи добављач услуге или пробајте поново касније</translation> <translation id="3856800405688283469">Изаберите временску зону</translation> <translation id="3857807444929313943">Подигните, па опет додирните</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: синхронизација је паузирана</translation> <translation id="3861638017150647085">Корисничко име <ph name="USERNAME" /> није доступно</translation> <translation id="3861977424605124250">Прикажи при покретању</translation> <translation id="3862788408946266506">Апликација са атрибутом манифеста „kiosk_only“ мора да се инсталира у режиму киоска у Chrome ОС-у</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">Не подсећај ме следећи пут</translation> <translation id="4881695831933465202">Отвори</translation> <translation id="4882312758060467256">Може да приступа овом сајту</translation> -<translation id="4882831918239250449">Контролишите начин на који се историја прегледања користи за персонализацију Претраге, огласа и других услуга</translation> <translation id="4882919381756638075">Сајтови обично користе микрофон за потребе функција за комуникацију попут видео ћаскања</translation> <translation id="4883436287898674711">Сви <ph name="WEBSITE_1" /> сајтови</translation> <translation id="48838266408104654">&Менаџер задатака</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">Увек отварај помоћу системског приказивача</translation> <translation id="5794700615121138172">Дељени Linux директоријуми</translation> <translation id="5794786537412027208">Изађи из свих Chrome апликација</translation> -<translation id="5797070761912323120">Google може да користи историју за персонализацију Претраге, огласа и других Google услуга</translation> <translation id="5798079537501238810">Сајтови могу да инсталирају обрађиваче плаћања</translation> <translation id="579907812742603813">заштићени садржај</translation> <translation id="579915268381781820">Уклонили сте безбедносни кључ.</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">Мобилни подаци се активирају</translation> <translation id="6209838773933913227">Ажурира се компонента</translation> <translation id="6209908325007204267">Уређај садржи надоградњу на Chrome за предузећа, али ваше корисничко име није повезано са налогом предузећа. Отворите налог за предузећа тако што ћете посетити g.co/ChromeEnterpriseAccount на секундарном уређају.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: синхронизација не ради</translation> <translation id="6212039847102026977">Прикажи напредна својства мреже</translation> <translation id="6212168817037875041">Искључи екран</translation> <translation id="6212752530110374741">Пошаљи линк имејлом</translation> @@ -5774,6 +5769,7 @@ <translation id="7427348830195639090">Страница у позадини: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Позив са уређаја <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Није пронађен ниједан уређај са интерфејсом</translation> +<translation id="7431991332293347422">Контролишите како се историја прегледања користи за персонализовање Претраге и других услуга</translation> <translation id="7433708794692032816">Уметните паметну картицу да бисте наставили да користите <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Задржи</translation> <translation id="7434509671034404296">Програмер</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 216b634..349c775 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388"><ph name="BEGIN_LINK" />Besök inställningarna för synkronisering<ph name="END_LINK" /> om du vill rensa webbinformation från alla synkroniserade enheter och ditt Google-konto.</translation> <translation id="1175364870820465910">Skriv &ut...</translation> <translation id="1176471985365269981">Får inte redigera filer eller mappar på enheten</translation> -<translation id="1177138678118607465">Google kan använda webbhistoriken för att anpassa Sök och andra tjänster från Google. Du kan ändra detta på myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Anpassat</translation> <translation id="1178581264944972037">Paus</translation> <translation id="117916940443676133">Säkerhetsnyckeln skyddas inte av en pinkod. Skapa en pinkod först innan du hanterar inloggningsuppgifter.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Den virtuella maskinen startas</translation> <translation id="1603914832182249871">(Inkognito)</translation> <translation id="1604432177629086300">Utskriften misslyckades. Kontrollera skrivaren och försök igen.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Det går inte att synkronisera lösenord</translation> <translation id="1607139524282324606">Rensa post</translation> <translation id="1607499585984539560">Användaren saknar koppling till domänen</translation> <translation id="1608626060424371292">Ta bort denna användare</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Öppna länk med ...</translation> <translation id="2891922230654533301">Vill du logga in på <ph name="APP_NAME" /> med enheten?</translation> <translation id="2893168226686371498">Standardwebbläsare</translation> +<translation id="2893180576842394309">Google kan anpassa Sök och andra Google-tjänster utifrån historiken</translation> <translation id="2894757982205307093">Ny flik i grupp</translation> <translation id="289695669188700754">Nyckel-ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Den här anpassade inställningen tas bort när du stänger alla inkognitofönster</translation> @@ -2652,7 +2651,6 @@ <translation id="3856096718352044181">Verifiera att detta är en giltig leverantör eller försök igen senare</translation> <translation id="3856800405688283469">Välj tidszon</translation> <translation id="3857807444929313943">Lyft och tryck sedan igen</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Synkroniseringen har pausats</translation> <translation id="3861638017150647085">Användarnamnet <ph name="USERNAME" /> är inte tillgängligt</translation> <translation id="3861977424605124250">Visa vid start</translation> <translation id="3862788408946266506">En app med manifestattributet kiosk_only måste installeras i kioskläget i Chrome OS</translation> @@ -3544,7 +3542,6 @@ <translation id="4881685975363383806">Påminn mig inte nästa gång</translation> <translation id="4881695831933465202">Öppna</translation> <translation id="4882312758060467256">Har åtkomst till webbplatsen</translation> -<translation id="4882831918239250449">Styr hur Sök, annonser och annat ska anpassas utifrån webbhistoriken</translation> <translation id="4882919381756638075">Åtkomst till mikrofonen brukar kunna behövas för kommunikationsfunktioner på webbplatsen, t.ex. videochatt</translation> <translation id="4883436287898674711">Alla <ph name="WEBSITE_1" />-webbplatser</translation> <translation id="48838266408104654">&Aktivitetshanteraren</translation> @@ -4343,7 +4340,6 @@ <translation id="5794414402486823030">Öppna alltid med systemets visningsprogram</translation> <translation id="5794700615121138172">Delade mappar i Linux</translation> <translation id="5794786537412027208">Stäng alla Chrome-appar</translation> -<translation id="5797070761912323120">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån historiken</translation> <translation id="5798079537501238810">Webbplatser kan installera betalningshanterare</translation> <translation id="579907812742603813">skyddat innehåll</translation> <translation id="579915268381781820">Säkerhetsnyckeln har tagits bort.</translation> @@ -4704,7 +4700,6 @@ <translation id="6208521041562685716">Mobildata aktiveras</translation> <translation id="6209838773933913227">Komponenten uppdateras</translation> <translation id="6209908325007204267">Chrome Enterprise Upgrade ingår med enheten, men ditt användarnamn är inte kopplat till ett företagskonto. Skapa ett företagskonto genom att besöka g.co/ChromeEnterpriseAccount på en annan enhet.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Synkroniseringen fungerar inte</translation> <translation id="6212039847102026977">Visa avancerade nätverksinställningar</translation> <translation id="6212168817037875041">Stäng av skärmen</translation> <translation id="6212752530110374741">Skicka länk via e-post</translation> @@ -5793,6 +5788,7 @@ <translation id="7427348830195639090">Bakgrundssida: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Ring från <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Inga HID-enheter hittades</translation> +<translation id="7431991332293347422">Styr hur webbhistoriken får användas för att anpassa Sök med mera</translation> <translation id="7433708794692032816">Sätt i smartkort för att fortsätta använda din <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">Behåll den</translation> <translation id="7434509671034404296">Utvecklare</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 304089200..8c1102f 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Ili ufute data ya kuvinjari kwenye vifaa vyako vyote vilivyosawazishwa na Akaunti yako ya Google <ph name="BEGIN_LINK" />tembelea mipangilio ya usawazishaji<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Chapisha...</translation> <translation id="1176471985365269981">Zisizoruhusiwa kubadilisha faili au folda kwenye kifaa chako</translation> -<translation id="1177138678118607465">Google inaweza kutumia historia yako ya kuvinjari kuweka mapendeleo kwenye huduma za Tafuta, matangazo na huduma nyingine za Google. Unaweza kubadilisha hali hii wakati wowote katika myaccountgoogle.com/activitycontrols/search</translation> <translation id="1177863135347784049">Maalum</translation> <translation id="1178581264944972037">Sitisha</translation> <translation id="117916940443676133">Ufunguo wako wa usalama haujalindwa kwa PIN. Ili udhibiti data ya kuingia katika akaunti, tunga PIN kwanza.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Inawasha mashine pepe</translation> <translation id="1603914832182249871">(Hali fiche)</translation> <translation id="1604432177629086300">Imeshindwa kuchapisha. Angalia printa kisha ujaribu tena</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Kipengele cha usawazishaji wa manenosiri hakifanyi kazi</translation> <translation id="1607139524282324606">Futa kipengele</translation> <translation id="1607499585984539560">Mtumiaji si mshirika wa kikoa hiki</translation> <translation id="1608626060424371292">Ondoa mtumiaji huyu</translation> @@ -1768,6 +1766,7 @@ <translation id="2889064240420137087">Fungua kiungo kwa...</translation> <translation id="2891922230654533301">Ungependa kutumia kifaa chako kuingia katika akaunti kwenye <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Kivinjari chaguomsingi</translation> +<translation id="2893180576842394309">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google na huduma nyingine za Google.</translation> <translation id="2894757982205307093">Kichupo kipya katika kikundi</translation> <translation id="289695669188700754">Utambulisho wa Ufunguo: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Mipangilio hii maalum itaondolewa ukifunga madirisha fiche yako yote</translation> @@ -2648,7 +2647,6 @@ <translation id="3856096718352044181">Tafadhali thibitisha kuwa huyu ni mtoa huduma sahihi au ujaribu tena baadaye</translation> <translation id="3856800405688283469">Chagua saa za eneo</translation> <translation id="3857807444929313943">Inua, kisha uguse tena</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Umesitisha usawazishaji</translation> <translation id="3861638017150647085">Jina la mtumiaji "<ph name="USERNAME" />" halipatikani</translation> <translation id="3861977424605124250">Onyesha kifaa kinapowashwa</translation> <translation id="3862788408946266506">Ni lazima programu iliyo na sifa ya faili ya maelezo ya 'kiosk_only' isakinishwe katika skrini nzima ya Mfumo wa Uendeshaji wa Chrome</translation> @@ -3538,7 +3536,6 @@ <translation id="4881685975363383806">Usinikumbushe wakati mwingine</translation> <translation id="4881695831933465202">Fungua</translation> <translation id="4882312758060467256">Inaweza kufikia tovuti hii</translation> -<translation id="4882831918239250449">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo ya Kutafuta matangazo na zaidi</translation> <translation id="4882919381756638075">Tovuti hutumia maikrofoni yako kwa ajili ya vipengele vya mawasiliano kama vile kupiga gumzo la video</translation> <translation id="4883436287898674711">Tovuti zote <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Kidhibiti cha Shughuli</translation> @@ -4337,7 +4334,6 @@ <translation id="5794414402486823030">Fungua ukitumia kitazamaji cha mfumo wakati wowote</translation> <translation id="5794700615121138172">Folda zinazoshirikiwa za Linux</translation> <translation id="5794786537412027208">Ondoka kwenye Programu zote za Chrome</translation> -<translation id="5797070761912323120">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google</translation> <translation id="5798079537501238810">Tovuti zinaweza kusakinisha vidhibiti vya malipo</translation> <translation id="579907812742603813">maudhui yanayolindwa</translation> <translation id="579915268381781820">Ufunguo wako wa usalama umeondolewa.</translation> @@ -4698,7 +4694,6 @@ <translation id="6208521041562685716">Data ya mtandao wa simu inawashwa</translation> <translation id="6209838773933913227">Inasasisha vipengele</translation> <translation id="6209908325007204267">Kifaa chako kina Chrome Enterprise Upgrade, lakini jina lako la mtumiaji halijahusishwa na akaunti ya biashara. Tafadhali fungua akaunti ya biashara kwa kutembelea g.co/ChromeEnterpriseAccount kwenye kifaa kingine.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Kipengele cha kusawazisha hakifanyi kazi</translation> <translation id="6212039847102026977">Onyesha sifa za kina za mtandao</translation> <translation id="6212168817037875041">Izime skrini</translation> <translation id="6212752530110374741">Kiungo cha Barua pepe</translation> @@ -5787,6 +5782,7 @@ <translation id="7427348830195639090">Ukurasa wa Mandharinyuma: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Simu kutoka kwenye <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Hakuna vifaa vya HID vinavyopatikana</translation> +<translation id="7431991332293347422">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo kwenye huduma ya Tafuta na Google na zaidi</translation> <translation id="7433708794692032816">Weka kadi mahiri ili uendelee kutumia <ph name="DEVICE_TYPE" /> yako</translation> <translation id="7433957986129316853">Usibadilishe</translation> <translation id="7434509671034404296">Wasanidi Programu</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 73e4385..1470470 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -144,7 +144,7 @@ <translation id="1147991416141538220">அணுகலைக் கோர இந்தச் சாதனத்தின் நிர்வாகியைத் தொடர்பு கொள்ளவும்.</translation> <translation id="1148063863818152153">உங்கள் சாதனத்தின் EID</translation> <translation id="1149401351239820326">காலாவதியாகும் மாதம்</translation> -<translation id="1149725087019908252"><ph name="FILE_NAME" /> கோப்பினை ஸ்கேன் செய்கிறது</translation> +<translation id="1149725087019908252"><ph name="FILE_NAME" /> ஃபைலை ஸ்கேன் செய்கிறது</translation> <translation id="1150490752229770117"><ph name="DEVICE_TYPE" /> சாதனத்தின் மென்பொருளுக்கும் பாதுகாப்பிற்கும் தானாக செய்யப்படும் கடைசிப் புதுப்பிப்பு இதுதான். வருங்கால புதுப்பிப்புகளைப் பெற புதிய வகை சாதனங்களுக்கு மாறுங்கள். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="1150565364351027703">சன்கிளாசஸ்</translation> <translation id="1151917987301063366">சென்சார்களை அணுக, <ph name="HOST" />ஐ எப்போதும் அனுமதி</translation> @@ -169,7 +169,6 @@ <translation id="117445914942805388">உங்கள் ஒத்திசைக்கப்பட்ட சாதனங்கள் அனைத்திலிருந்தும் Google கணக்கிலிருந்தும் உலாவல் தரவை முழுமையாக அழிக்க, <ph name="BEGIN_LINK" />ஒத்திசைவு அமைப்புகளைப் பார்க்கவும்<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&அச்சிடு...</translation> <translation id="1176471985365269981">உங்கள் சாதனத்தில் உள்ள கோப்புகளிலோ கோப்புறைகளிலோ மாற்றம் செய்ய அனுமதி இல்லாத தளங்கள்</translation> -<translation id="1177138678118607465">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் உலாவல் வரலாற்றை Google பயன்படுத்தக்கூடும். myaccount.google.com/activitycontrols/search எனும் இணைப்பில் எப்போது வேண்டுமானாலும் இதை மாற்றலாம்</translation> <translation id="1177863135347784049">பிரத்தியேகம்</translation> <translation id="1178581264944972037">இடைநிறுத்து</translation> <translation id="117916940443676133">'பின்' மூலம் உங்கள் பாதுகாப்பு விசை பாதுகாக்கப்படவில்லை. உள்நுழைவுத் தரவை நிர்வகிக்க முதலில் 'பின்னை' அமைக்கவும்.</translation> @@ -199,7 +198,7 @@ <translation id="1203942045716040624">பகிரப்பட்ட வொர்க்கர்: <ph name="SCRIPT_URL" /></translation> <translation id="1211769675100312947">ஷார்ட்கட்களை நீங்களே தேர்வு செய்கிறீர்கள்</translation> <translation id="1213254615020057352">உபயோகம் மற்றும் பிழை கண்டறிதல் தரவை அனுப்பவும். பிழை கண்டறிதல் தரவு, சாதனம் மற்றும் ஆப்ஸ் உபயோகத் தரவு போன்றவற்றை Googleளுக்குத் தானாக அனுப்புவதன் மூலம் உங்கள் பிள்ளையின் Android அனுபவத்தை மேம்படுத்த உதவவும். இது உங்கள் பிள்ளையை அடையாளம் கண்டறிய பயன்படுத்தப்படாது, இது சிஸ்டம் மற்றும் ஆப்ஸின் நிலைத்தன்மையை மேம்படுத்தவும் பிற மேம்பாடுகளைச் செய்யவும் உதவும். ஒருங்கிணைக்கப்பட்ட சில தரவு, Google ஆப்ஸுக்கும் Android டெவெலப்பர்கள் போன்ற கூட்டாளர்களுக்கும் உதவும். உரிமையாளர் இந்த அமைப்பைச் செயல்படுத்தியுள்ளார். உரிமையாளர் இந்தச் சாதனத்தின் பிழை கண்டறிதல் தரவையும் உபயோகத் தரவையும் Googleளுக்கு அனுப்புவதற்குத் தேர்வுசெய்யக்கூடும். உங்கள் பிள்ளையின் கணக்கில் கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு அவரது Google கணக்கில் சேமிக்கப்படக்கூடும்.</translation> -<translation id="121384500095351701">இந்தக் கோப்பினைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது</translation> +<translation id="121384500095351701">இந்த ஃபைலைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது</translation> <translation id="1215411991991485844">புதிய பின்புல ஆப்ஸ் சேர்க்கப்பட்டது</translation> <translation id="1216542092748365687">கைரேகையை அகற்றுதல்</translation> <translation id="1217483152325416304">உங்கள் அகத் தரவு விரைவில் நீக்கப்படும்</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">விர்ச்சுவல் மெஷினைத் தொடங்குகிறது</translation> <translation id="1603914832182249871">(மறைநிலை)</translation> <translation id="1604432177629086300">அச்சிட முடியவில்லை. பிரிண்டரைச் சரிபார்த்து மீண்டும் முயலவும்.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: கடவுச்சொல் ஒத்திசைவு இயங்கவில்லை</translation> <translation id="1607139524282324606">உள்ளீட்டை அழி</translation> <translation id="1607499585984539560">டொமைனுடன் பயனர் இணைக்கப்படவில்லை</translation> <translation id="1608626060424371292">இவரை அகற்று</translation> @@ -916,7 +914,7 @@ <translation id="1969654639948595766">WebRTC உரைப் பதிவுகள் (<ph name="WEBRTC_TEXT_LOG_COUNT" />)</translation> <translation id="1970368523891847084">வீடியோ பயன்முறைக்குச் சென்றது</translation> <translation id="197288927597451399">வைத்திரு</translation> -<translation id="1973763416111613016"><ph name="FILE_NAME" /> கோப்பினைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது. பதிவிறக்கங்கள் பட்டிக்குச் செல்ல Shift+F6 விசைகளை அழுத்தவும்.</translation> +<translation id="1973763416111613016"><ph name="FILE_NAME" /> ஃபைலைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது. பதிவிறக்கங்கள் பட்டிக்குச் செல்ல Shift+F6 விசைகளை அழுத்தவும்.</translation> <translation id="1974043046396539880">CRL பகிர்வுப் புள்ளிகள்</translation> <translation id="1974060860693918893">மேம்பட்டவை</translation> <translation id="1974159333077206889">எல்லா ஸ்பீக்கர்களிலும் ஒரே ஆடியோ</translation> @@ -1265,7 +1263,7 @@ <translation id="2336376423977300504">சாளரங்கள் மூடப்படும்போது குக்கீகளை எப்போதும் அழி</translation> <translation id="2336381494582898602">பவர்வாஷ்</translation> <translation id="2337236196941929873">நீங்கள் பார்க்கக்கூடும் என நினைக்கும் பக்கங்களை Chrome முன்கூட்டியே ஏற்றும். குக்கீகளை நீங்கள் அனுமதித்தால் இதைச் செய்ய Chrome அவற்றைப் பயன்படுத்தக்கூடும், மேலும் தளங்களிலிருந்து உங்கள் அடையாளத்தை மறைக்க, பக்கங்களை என்கிரிப்ட் செய்து Google வழியாக அனுப்பக்கூடும்.</translation> -<translation id="2340239562261172947"><ph name="FILE_NAME" /> என்ற கோப்பினைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது</translation> +<translation id="2340239562261172947"><ph name="FILE_NAME" /> என்ற ஃபைலைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது</translation> <translation id="2342740338116612727">புக்மார்க்குகள் சேர்க்கப்பட்டன</translation> <translation id="2343747224442182863">இந்தத் தாவலை மையப்படுத்து</translation> <translation id="2345723121311404059">1 பக்கம் - <ph name="PRINTER_NAME" /></translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">இதைக் கொண்டு இணைப்பைத் திற...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> தளத்தில் உள்நுழைய உங்கள் சாதனத்தைப் பயன்படுத்த விரும்புகிறீர்களா?</translation> <translation id="2893168226686371498">இயல்புநிலை உலாவி</translation> +<translation id="2893180576842394309">‘தேடல்’ மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்</translation> <translation id="2894757982205307093">குழுவில் புதிய தாவல்</translation> <translation id="289695669188700754">விசை ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">மறைநிலைச் சாளரங்கள் அனைத்தையும் மூடினால் இந்தப் பிரத்தியேக அமைப்பு அகற்றப்படும்</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">இது சரியான வழங்குநர்தான் என்பதைச் சரிபார்க்கவும் அல்லது பிறகு முயலவும்</translation> <translation id="3856800405688283469">நேரமண்டலத்தைத் தேர்ந்தெடுக்கவும்</translation> <translation id="3857807444929313943">விரலை எடுத்துவிட்டு மீண்டும் தொடவும்</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: ஒத்திசைவு இடைநிறுத்தப்பட்டுள்ளது</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" என்ற பயனர்பெயரைப் பயன்படுத்த முடியாது</translation> <translation id="3861977424605124250">தொடங்கும்போது காட்டு</translation> <translation id="3862788408946266506">'kiosk_only' மெனிஃபெஸ்ட் பண்புக்கூறைக் கொண்ட ஆப்ஸை Chrome OS கியோஸ்க் பயன்முறையிலேயே நிறுவ வேண்டும்</translation> @@ -3543,7 +3541,6 @@ <translation id="4881685975363383806">அடுத்த முறை நினைவூட்டாதே</translation> <translation id="4881695831933465202">திற</translation> <translation id="4882312758060467256">இந்தத் தளத்திற்கு அணுகலைப் பெற்றுள்ளது</translation> -<translation id="4882831918239250449">தேடல், விளம்பரங்கள் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்துதல்</translation> <translation id="4882919381756638075">வழக்கமாக வீடியோ அரட்டை போன்ற தகவல்தொடர்பு அம்சங்களுக்காக மைக்ரோஃபோனைத் தளங்கள் பயன்படுத்தும்</translation> <translation id="4883436287898674711">எல்லா <ph name="WEBSITE_1" /> தளங்களும்</translation> <translation id="48838266408104654">&பணி நிர்வாகி</translation> @@ -3612,7 +3609,7 @@ <translation id="4943368462779413526">கால்பந்து</translation> <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" ஒரு சீரியல் போர்ட்டுடன் இணைக்க விரும்புகிறது</translation> <translation id="4944310289250773232"><ph name="SAML_DOMAIN" /> நிறுவனத்தின் மூலம் அடையாளச் சேவை ஹோஸ்ட் செய்யப்படுகிறது</translation> -<translation id="495164417696120157">{COUNT,plural, =1{ஒரு கோப்பினை}other{# கோப்புகளை}}</translation> +<translation id="495164417696120157">{COUNT,plural, =1{ஒரு ஃபைலை}other{# கோப்புகளை}}</translation> <translation id="495170559598752135">செயல்கள்</translation> <translation id="4953808748584563296">இயல்பு ஆரஞ்சுநிற அவதார்</translation> <translation id="4955710816792587366">பின்னைத் தேர்ந்தெடுக்கவும்</translation> @@ -4342,7 +4339,6 @@ <translation id="5794414402486823030">எப்போதும் சிஸ்டம் வியூவரைக் கொண்டு திற</translation> <translation id="5794700615121138172">Linux பகிர்ந்த கோப்புறைகள்</translation> <translation id="5794786537412027208">எல்லா Chrome பயன்பாடுகளையும் நிறுத்து</translation> -<translation id="5797070761912323120">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்</translation> <translation id="5798079537501238810">பேமெண்ட் ஹேண்ட்லர்களை நிறுவ தளங்கள் அனுமதி கேட்க வேண்டும்</translation> <translation id="579907812742603813">பாதுகாக்கப்பட்ட உள்ளடக்கம்</translation> <translation id="579915268381781820">உங்கள் பாதுகாப்பு விசை அகற்றப்பட்டது.</translation> @@ -4703,7 +4699,6 @@ <translation id="6208521041562685716">மொபைல் டேட்டா இயக்கப்படுகிறது</translation> <translation id="6209838773933913227">காம்பனென்ட் புதுப்பிப்பு</translation> <translation id="6209908325007204267">உங்கள் சாதனம் Chrome எண்டர்பிரைஸ் மேம்படுத்தலை உள்ளடக்கியதாகும், ஆனால் நிறுவனக் கணக்கு ஒன்றுடன் உங்கள் பயனர்பெயர் தொடர்புடையதாக இல்லை. வேறு சாதனத்தில் g.co/ChromeEnterpriseAccount என்பதற்குச் சென்று நிறுவனக் கணக்கு ஒன்றை உருவாக்கவும்.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: ஒத்திசைவு வேலை செய்யவில்லை</translation> <translation id="6212039847102026977">மேம்பட்ட நெட்வொர்க் பண்புகளைக் காட்டு</translation> <translation id="6212168817037875041">திரையை அணை</translation> <translation id="6212752530110374741">இணைப்பை மின்னஞ்சல் செய்</translation> @@ -4740,7 +4735,7 @@ <translation id="6242852299490624841">இந்தத் தாவலை மையப்படுத்து</translation> <translation id="6243280677745499710">தற்போது அமைக்கப்பட்டுள்ளது</translation> <translation id="6243774244933267674">சேவையகம் கிடைக்கவில்லை</translation> -<translation id="6244245036423700521">ONC கோப்பினை இறக்கு</translation> +<translation id="6244245036423700521">ONC ஃபைலை இறக்கு</translation> <translation id="6246790815526961700">சாதனத்திலிருந்து பதிவேற்று</translation> <translation id="6247620186971210352">ஆப்ஸ் எதுவும் கண்டறியப்படவில்லை</translation> <translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation> @@ -4783,7 +4778,7 @@ <translation id="628352644014831790">4 வினாடிகள்</translation> <translation id="6285120108426285413">பொதுவாக <ph name="FILE_NAME" /> பதிவிறக்கப்படாது, அத்துடன் இது ஆபத்துக்குரியதாக இருக்கலாம்.</translation> <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர் உள்ளது}other{உங்கள் நெட்வொர்க்கில் புதிய பிரிண்டர்கள் உள்ளன}}</translation> -<translation id="6285770818046456882">உங்களுடன் கோப்பினைப் பகிர்ந்து கொண்டிருந்த சாதனம் பரிமாற்றத்தை ரத்துசெய்தது</translation> +<translation id="6285770818046456882">உங்களுடன் ஃபைலைப் பகிர்ந்து கொண்டிருந்த சாதனம் பரிமாற்றத்தை ரத்துசெய்தது</translation> <translation id="6290613030083731160">அருகிலுள்ள சாதனங்கள் எதுவும் பகிரவில்லை. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="6291086328725007688">செயல்படுத்தல் குறியீட்டைச் சரிபார்க்கிறது. இதற்குச் சில நிமிடங்கள் ஆகலாம்.</translation> <translation id="6291741848715722067">உறுதிப்படுத்தல் குறியீடு</translation> @@ -5791,6 +5786,7 @@ <translation id="7427348830195639090">பின்புல பக்கம்: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> சாதனத்திலிருந்து அழை</translation> <translation id="7431719494109538750">HID சாதனங்கள் இல்லை</translation> +<translation id="7431991332293347422">தேடல் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> சாதனத்தைத் தொடர்ந்து பயன்படுத்த ஸ்மார்ட் கார்டைச் செருகுங்கள்</translation> <translation id="7433957986129316853">ரத்துசெய்ய வேண்டாம்</translation> <translation id="7434509671034404296">டெவலப்பர்</translation> @@ -6752,7 +6748,7 @@ <translation id="8477241577829954800">இடமாற்றப்பட்டது</translation> <translation id="8477384620836102176">&பொது</translation> <translation id="8479176401914456949">தவறான குறியீடு. மீண்டும் முயலவும்.</translation> -<translation id="8480082892550707549">இந்தத் தளத்திலிருந்து ஏற்கனவே கோப்புகளைப் பதிவிறக்கியிருந்தாலும், அது தற்காலிகமாகப் பாதுகாப்பற்றதாக இருக்கக்கூடும் (ஹேக் செய்யப்பட்டிருக்கலாம்). இந்தக் கோப்பைப் பின்னர் பதிவிறக்கவும்.</translation> +<translation id="8480082892550707549">இந்தத் தளத்திலிருந்து ஏற்கனவே கோப்புகளைப் பதிவிறக்கியிருந்தாலும், அது தற்காலிகமாகப் பாதுகாப்பற்றதாக இருக்கக்கூடும் (ஹேக் செய்யப்பட்டிருக்கலாம்). இந்த ஃபைலைப் பின்னர் பதிவிறக்கவும்.</translation> <translation id="8480869669560681089"><ph name="VENDOR_NAME" /> இடமிருந்து தெரியாத சாதனம்</translation> <translation id="8481187309597259238">USB அனுமதியை உறுதிப்படுத்தவும்</translation> <translation id="8481980314595922412">சோதனையிலுள்ள அம்சங்கள் இயக்கப்பட்டுள்ளன</translation> @@ -7193,7 +7189,7 @@ <translation id="895347679606913382">தொடங்குகிறது...</translation> <translation id="8957757410289731985">சுயவிவரத்தைப் பிரத்தியேகமாக்கலாம்</translation> <translation id="895944840846194039">JavaScript நினைவகம்</translation> -<translation id="8962051932294470566">ஒரே நேரத்தில் ஒரு கோப்பினை மட்டுமே பகிர முடியும். தற்போதைய பகிர்வு முடிந்த பிறகு மீண்டும் முயலவும்.</translation> +<translation id="8962051932294470566">ஒரே நேரத்தில் ஒரு ஃபைலை மட்டுமே பகிர முடியும். தற்போதைய பகிர்வு முடிந்த பிறகு மீண்டும் முயலவும்.</translation> <translation id="8962083179518285172">விவரங்களை மறை</translation> <translation id="8962918469425892674">நகர்வு அல்லது ஒளி சென்சார்களை இந்தத் தளம் பயன்படுத்துகிறது.</translation> <translation id="8965037249707889821">பழைய கடவுச்சொல்லை உள்ளிடு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index eda3724..2b854cec 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">మీ అన్ని సమకాలీకరించబడుతున్న పరికరాలతో సహా, మీ Google ఖాతా నుండి బ్రౌజింగ్ డేటాను తీసివేయడానికి, <ph name="BEGIN_LINK" />సమకాలీకరణ సెట్టింగ్లను సందర్శించండి<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&ముద్రించు...</translation> <translation id="1176471985365269981">మీ పరికరంలోని ఫైల్లు లేదా ఫోల్డర్లను ఎడిట్ చేయడానికి అనుమతించబడలేదు</translation> -<translation id="1177138678118607465">శోధన, ప్రకటనలు మరియు ఇతర Google సేవలను వ్యక్తిగతీకరించడం కోసం Google మీ బ్రౌజింగ్ చరిత్రను ఉపయోగించవచ్చు. మీరు ఏ సమయంలో అయినా myaccount.google.com/activitycontrols/searchలో దీనిని మార్చవచ్చు</translation> <translation id="1177863135347784049">అనుకూల</translation> <translation id="1178581264944972037">పాజ్ చేయి</translation> <translation id="117916940443676133">మీ 'సెక్యూరిటీ కీ'కి పిన్ రక్షణ లేదు. సైన్-ఇన్ డేటాను నిర్వహించడానికి, ముందు పిన్ను సృష్టించండి.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">వర్చువల్ మెషిన్ను ప్రారంభిస్తోంది</translation> <translation id="1603914832182249871">(అజ్ఞాతంగా)</translation> <translation id="1604432177629086300">ముద్రించడం సాధ్యపడలేదు. ప్రింటర్ను పరిశీలించి, మళ్ళీ ప్రయత్నించండి.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: పాస్వర్డ్ సింక్ పనిచేయడం లేదు</translation> <translation id="1607139524282324606">నమోదును తీసివేయండి</translation> <translation id="1607499585984539560">యూజర్ డొమైన్తో అనుబంధించబడలేదు</translation> <translation id="1608626060424371292">ఈ వినియోగదారును తీసివేయండి</translation> @@ -1771,6 +1769,7 @@ <translation id="2889064240420137087">దీనితో లింక్ తెరువు...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" />కు సైన్ ఇన్ చేయడానికి మీ పరికరాన్ని ఉపయోగించాలా?</translation> <translation id="2893168226686371498">ఆటోమేటిక్ బ్రౌజర్</translation> +<translation id="2893180576842394309">శోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation> <translation id="2894757982205307093">సమూహంలో కొత్త ట్యాబ్</translation> <translation id="289695669188700754">కీ ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">మీరు మీ అన్ని అజ్ఞాత విండోలను మూసివేసినప్పుడు, ఈ అనుకూల సెట్టింగ్ తీసివేయబడుతుంది</translation> @@ -2650,7 +2649,6 @@ <translation id="3856096718352044181">దయచేసి ఇది చెల్లుబాటు అయ్యే ప్రొవైడర్ అని వెరిఫై చేయండి లేదా తర్వాత మళ్లీ ట్రై చేయండి</translation> <translation id="3856800405688283469">సమయ మండలిని ఎంచుకోండి</translation> <translation id="3857807444929313943">పైకి ఎత్తి, మళ్లీ తాకండి</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: సమకాలీకరణ పాజ్ అయింది</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" యూజర్నేమ్ అందుబాటులో లేదు</translation> <translation id="3861977424605124250">ప్రారంభంలో చూపించు</translation> <translation id="3862788408946266506">'kiosk_only' మానిఫెస్ట్ ఫీచర్ ఉన్న యాప్ను తప్పనిసరిగా Chrome OS కియోస్క్ మోడ్లో ఇన్స్టాల్ చేయాలి</translation> @@ -3542,7 +3540,6 @@ <translation id="4881685975363383806">నాకు మళ్లీ గుర్తు చేయవద్దు</translation> <translation id="4881695831933465202">తెరువు</translation> <translation id="4882312758060467256">ఈ సైట్కు యాక్సెస్ను కలిగి ఉంది</translation> -<translation id="4882831918239250449">Search, యాడ్స్లతో పాటు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ హిస్టరీ ఎలా ఉపయోగించబడుతుందో నియంత్రించండి</translation> <translation id="4882919381756638075">వీడియో చాటింగ్ వంటి కమ్యూనికేషన్ ఫీచర్ల కోసం సాధారణంగా సైట్లు మీ మైక్రోఫోన్ను ఉపయోగించుకుంటాయి</translation> <translation id="4883436287898674711">అన్ని <ph name="WEBSITE_1" /> వెబ్సైట్లు</translation> <translation id="48838266408104654">విధి సంచాలకులు</translation> @@ -4340,7 +4337,6 @@ <translation id="5794414402486823030">ఎల్లప్పుడూ సిస్టమ్ వ్యూయర్తో తెరువు</translation> <translation id="5794700615121138172">Linux షేర్ చేసిన ఫోల్డర్లు</translation> <translation id="5794786537412027208">అన్ని Chrome యాప్ల నుండి నిష్క్రమించు</translation> -<translation id="5797070761912323120">శోధన, ప్రకటనలు, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation> <translation id="5798079537501238810">సైట్లు పేమెంట్ హ్యాండ్లర్లను ఇన్స్టాల్ చేయగలవు</translation> <translation id="579907812742603813">రక్షించబడిన కంటెంట్</translation> <translation id="579915268381781820">మీ 'సెక్యూరిటీ కీ' తీసివేయబడింది.</translation> @@ -4701,7 +4697,6 @@ <translation id="6208521041562685716">మొబైల్ డేటా యాక్టివేట్ చేయబడుతోంది</translation> <translation id="6209838773933913227">కాంపొనెంట్ అప్డేట్ అవుతోంది</translation> <translation id="6209908325007204267">మీ పరికరంలో Chrome ఎంటర్ప్రైజ్ అప్గ్రేడ్ ఉంది, కానీ మీ యూజర్నేమ్ ఏ ఎంటర్ప్రైజ్ ఖాతాకు అనుబంధించబడి లేదు. వేరొక పరికరంలో g.co/ChromeEnterpriseAccountను సందర్శించడం ద్వారా దయచేసి ఒక ఎంటర్ప్రైజ్ ఖాతాను సృష్టించండి.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: సమకాలీకరణ పని చేయడం లేదు</translation> <translation id="6212039847102026977">అధునాతన నెట్వర్క్ లక్షణాలను చూపు</translation> <translation id="6212168817037875041">ప్రదర్శనను ఆఫ్ చేయండి</translation> <translation id="6212752530110374741">లింక్ను ఇమెయిల్ చేయి</translation> @@ -5789,6 +5784,7 @@ <translation id="7427348830195639090">నేపథ్య పేజీ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> నుండి కాల్ చేయండి</translation> <translation id="7431719494109538750">HID పరికరాలు ఏవీ కనుగొనబడలేదు</translation> +<translation id="7431991332293347422">శోధనలు మరియు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ చరిత్ర ఎలా ఉపయోగించబడుతుందో నియంత్రించండి</translation> <translation id="7433708794692032816">మీ <ph name="DEVICE_TYPE" />ను ఉపయోగిస్తూ ఉండటానికి స్మార్ట్ కార్డ్ను ఇన్సర్ట్ చేయండి</translation> <translation id="7433957986129316853">అలాగే ఉంచండి</translation> <translation id="7434509671034404296">డెవలపర్</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 039944e..938f729 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388"><ph name="BEGIN_LINK" />ไปที่การตั้งค่าการซิงค์<ph name="END_LINK" />เพื่อล้างข้อมูลการท่องเว็บในอุปกรณ์ทุกเครื่องที่ซิงค์และบัญชี Google</translation> <translation id="1175364870820465910">&พิมพ์...</translation> <translation id="1176471985365269981">ไม่ได้รับอนุญาตให้แก้ไขไฟล์หรือโฟลเดอร์ในอุปกรณ์ของคุณ</translation> -<translation id="1177138678118607465">Google อาจใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหา โฆษณา และบริการอื่นๆ ของ Google ให้เหมาะกับคุณ โดยคุณเปลี่ยนการตั้งค่านี้ได้ทุกเมื่อที่ myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">ที่กำหนดเอง</translation> <translation id="1178581264944972037">หยุดชั่วคราว</translation> <translation id="117916940443676133">คีย์ความปลอดภัยไม่มีการป้องกันด้วย PIN หากต้องการจัดการข้อมูลการลงชื่อเข้าใช้ ให้สร้าง PIN ขึ้นมาก่อน</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">กำลังเริ่มเครื่องเสมือน</translation> <translation id="1603914832182249871">(โหมดไม่ระบุตัวตน)</translation> <translation id="1604432177629086300">พิมพ์ไม่สำเร็จ ตรวจสอบเครื่องพิมพ์แล้วลองอีกครั้ง</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: การซิงค์รหัสผ่านไม่ทำงาน</translation> <translation id="1607139524282324606">ล้างรายการ</translation> <translation id="1607499585984539560">ผู้ใช้ไม่ได้เชื่อมโยงกับโดเมน</translation> <translation id="1608626060424371292">ลบผู้ใช้รายนี้</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">เปิดลิงก์ด้วย...</translation> <translation id="2891922230654533301">ใช้อุปกรณ์เพื่อลงชื่อเข้าใช้ <ph name="APP_NAME" /> ไหม</translation> <translation id="2893168226686371498">เบราว์เซอร์เริ่มต้น</translation> +<translation id="2893180576842394309">Google อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ของ Google ให้เข้ากับคุณ</translation> <translation id="2894757982205307093">แท็บใหม่ในกลุ่ม</translation> <translation id="289695669188700754">รหัสคีย์: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">ระบบจะนำการตั้งค่าที่กำหนดเองนี้ออกเมื่อคุณปิดหน้าต่างที่ไม่ระบุตัวตนทั้งหมด</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">โปรดยืนยันว่านี่เป็นผู้ให้บริการที่ถูกต้องหรือลองอีกครั้งภายหลัง</translation> <translation id="3856800405688283469">เลือกเขตเวลา</translation> <translation id="3857807444929313943">ยกนิ้วขึ้นแล้วแตะอีกครั้ง</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: การซิงค์หยุดชั่วคราว</translation> <translation id="3861638017150647085">ใช้ชื่อผู้ใช้ "<ph name="USERNAME" />" ไม่ได้</translation> <translation id="3861977424605124250">แสดงเมื่อเริ่มต้นใช้งาน</translation> <translation id="3862788408946266506">ต้องติดตั้งแอปที่มีแอตทริบิวต์ไฟล์ Manifest ที่ชื่อ "kiosk_only" ในโหมดคีออสก์ของ Chrome OS</translation> @@ -3528,7 +3526,6 @@ <translation id="4881685975363383806">ไม่ต้องเตือนฉันอีก</translation> <translation id="4881695831933465202">เปิด</translation> <translation id="4882312758060467256">มีสิทธิ์เข้าถึงเว็บไซต์นี้</translation> -<translation id="4882831918239250449">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="4882919381756638075">โดยปกติแล้วเว็บไซต์จะใช้ไมโครโฟนเพื่อดำเนินการตามฟีเจอร์ในการสื่อสาร เช่น วิดีโอแชท</translation> <translation id="4883436287898674711">ไซต์ <ph name="WEBSITE_1" /> ทั้งหมด</translation> <translation id="48838266408104654">&ตัวจัดการงาน</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">เปิดด้วยโปรแกรมดูของระบบทุกครั้ง</translation> <translation id="5794700615121138172">โฟลเดอร์ที่แชร์ใน Linux</translation> <translation id="5794786537412027208">ปิดแอป Chrome ทั้งหมด</translation> -<translation id="5797070761912323120">Google อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ของ Google ให้เข้ากับคุณ</translation> <translation id="5798079537501238810">เว็บไซต์ติดตั้งเครื่องจัดการการชำระเงินได้</translation> <translation id="579907812742603813">เนื้อหาที่มีการคุ้มครอง</translation> <translation id="579915268381781820">นำคีย์ความปลอดภัยออกแล้ว</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">กำลังเปิดใช้งานอินเทอร์เน็ตมือถือ</translation> <translation id="6209838773933913227">กำลังอัปเดตคอมโพเนนต์</translation> <translation id="6209908325007204267">อุปกรณ์ของคุณมี Chrome Enterprise Upgrade แต่ชื่อผู้ใช้ไม่ตรงกับบัญชีองค์กร โปรดสร้างบัญชีองค์กรโดยไปที่ g.co/ChromeEnterpriseAccount ในอุปกรณ์รอง</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: การซิงค์ไม่ทำงาน</translation> <translation id="6212039847102026977">แสดงคุณสมบัติเครือข่ายขั้นสูง</translation> <translation id="6212168817037875041">ปิดจอแสดงผล</translation> <translation id="6212752530110374741">ส่งลิงก์ทางอีเมล</translation> @@ -5777,6 +5772,7 @@ <translation id="7427348830195639090">หน้าเว็บพื้นหลัง: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">โทรจาก <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">ไม่พบอุปกรณ์ HID</translation> +<translation id="7431991332293347422">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="7433708794692032816">เสียบสมาร์ทการ์ดเพื่อให้ใช้ <ph name="DEVICE_TYPE" /> ได้ต่อไป</translation> <translation id="7433957986129316853">เก็บไว้</translation> <translation id="7434509671034404296">นักพัฒนา</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 7d9bfe5b..b3130438 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">Tarama verilerini senkronize edilmiş tüm cihazlarınızdan ve Google Hesabınızdan temizlemek için <ph name="BEGIN_LINK" />senkronizasyon ayarlarına gidin<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">Ya&zdır...</translation> <translation id="1176471985365269981">Cihazınızdaki dosyaları veya klasörleri düzenlemesine izin verilmeyen siteler</translation> -<translation id="1177138678118607465">Google; Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi kullanabilir. Bunu istediğiniz zaman myaccount.google.com/activitycontrols/search adresinden değiştirebilirsiniz</translation> <translation id="1177863135347784049">Özel</translation> <translation id="1178581264944972037">Duraklat</translation> <translation id="117916940443676133">Güvenlik anahtarınız PIN ile korunmuyor. Oturum açma verilerini yönetmek için önce PIN oluşturun.</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">Sanal makine başlatılıyor</translation> <translation id="1603914832182249871">(Gizli mod)</translation> <translation id="1604432177629086300">Yazdırılamadı. Yazıcıyı kontrol edip tekrar deneyin.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Şifre senkronizasyonu çalışmıyor</translation> <translation id="1607139524282324606">Girişi temizle</translation> <translation id="1607499585984539560">Kullanıcı, alanla ilişkili değil</translation> <translation id="1608626060424371292">Bu kullanıcıyı kaldır</translation> @@ -1756,6 +1754,7 @@ <translation id="2889064240420137087">Bağlantıyı şununla aç...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> üzerinde oturum açmak için cihazınız kullanılsın mı?</translation> <translation id="2893168226686371498">Varsayılan tarayıcı</translation> +<translation id="2893180576842394309">Google; Arama ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation> <translation id="2894757982205307093">Grupta yeni sekme</translation> <translation id="289695669188700754">Anahtar Kimliği: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Tüm Gizli pencerelerinizi kapattığınızda bu özel ayar kaldırılır</translation> @@ -2636,7 +2635,6 @@ <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="3856800405688283469">Saat dilimi seçin</translation> <translation id="3857807444929313943">Kaldırın, tekrar dokunun</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Senkronizasyon duraklatıldı</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" kullanıcı adı kullanılamıyor</translation> <translation id="3861977424605124250">Başlangıçta göster</translation> <translation id="3862788408946266506">"kiosk_only" manifest özelliğine sahip uygulamalar ChromeOS kiosk modunda yüklenmelidir</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">Bir daha hatırlatma</translation> <translation id="4881695831933465202">Aç</translation> <translation id="4882312758060467256">Bu siteye erişimi var</translation> -<translation id="4882831918239250449">Göz atma geçmişinizin Arama, reklamlar ve diğer hizmetleri kişiselleştirmek için nasıl kullanıldığını kontrol edin</translation> <translation id="4882919381756638075">Görüntülü sohbet gibi iletişim özellikleri için siteler genellikle mikrofonunuzu kullanır</translation> <translation id="4883436287898674711">Tüm <ph name="WEBSITE_1" /> siteleri</translation> <translation id="48838266408104654">&Görev Yöneticisi</translation> @@ -4327,7 +4324,6 @@ <translation id="5794414402486823030">Daima sistem görüntüleyici ile açın</translation> <translation id="5794700615121138172">Linux paylaşılan klasörler</translation> <translation id="5794786537412027208">Tüm Chrome Uygulamalarından Çık</translation> -<translation id="5797070761912323120">Google; Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation> <translation id="5798079537501238810">Siteler ödeme işleyici yükleyebilir</translation> <translation id="579907812742603813">korunan içerik</translation> <translation id="579915268381781820">Güvenlik anahtarınız takılı değil.</translation> @@ -4688,7 +4684,6 @@ <translation id="6208521041562685716">Mobil veri etkinleştiriliyor</translation> <translation id="6209838773933913227">Bileşen güncelleme</translation> <translation id="6209908325007204267">Cihazınız Chrome Enterprise Yükseltme içeriyor anca kullanıcı adınız kurumsal hesapla ilişkilendirilmemiş. Lütfen ikinci bir cihazda g.co/ChromeEnterpriseAccount adresini ziyaret ederek kurumsal bir hesap oluşturun.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Senkronizasyon çalışmıyor</translation> <translation id="6212039847102026977">Gelişmiş ağ özelliklerini göster</translation> <translation id="6212168817037875041">Ekranı kapat</translation> <translation id="6212752530110374741">Bağlantıyı E-posta ile Gönder</translation> @@ -5776,6 +5771,7 @@ <translation id="7427348830195639090">Arka Plan Sayfası: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> adlı cihazdan çağrı</translation> <translation id="7431719494109538750">HID cihaz bulunamadı</translation> +<translation id="7431991332293347422">Göz atma geçmişinizin Arama ve diğer hizmetleri kişiselleştirmek için nasıl kullanıldığını kontrol edin</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> cihazınızı kullanmaya devam etmek için akıllı kartı takın</translation> <translation id="7433957986129316853">Değişiklikleri koru</translation> <translation id="7434509671034404296">Geliştirici</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 39b2a5d8a..ed89d04b 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Щоб очистити дані веб-перегляду на всіх синхронізованих пристроях і в обліковому записі Google, <ph name="BEGIN_LINK" />перейдіть у налаштування синхронізації<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Друк...</translation> <translation id="1176471985365269981">Заборонено змінювати файли або папки на пристрої</translation> -<translation id="1177138678118607465">Google може використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук, рекламні оголошення й інші сервіси Google. Це налаштування можна змінити на сторінці myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Спеціальне</translation> <translation id="1178581264944972037">Пауза</translation> <translation id="117916940443676133">Ваш ключ безпеки не захищено PIN-кодом. Щоб керувати даними для входу, спершу створіть PIN-код.</translation> @@ -558,7 +557,6 @@ <translation id="1602085790802918092">Запуск віртуальної машини</translation> <translation id="1603914832182249871">(Анонімний перегляд)</translation> <translation id="1604432177629086300">Не вдається роздрукувати. Перевірте принтер і повторіть спробу.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: синхронізація паролів не працює</translation> <translation id="1607139524282324606">Очистити введені дані</translation> <translation id="1607499585984539560">Користувач не зв’язаний із цим доменом</translation> <translation id="1608626060424371292">Вилучити цього користувача</translation> @@ -1775,6 +1773,7 @@ <translation id="2889064240420137087">Відкрити посилання за допомогою...</translation> <translation id="2891922230654533301">Увійти в додаток <ph name="APP_NAME" /> за допомогою пристрою?</translation> <translation id="2893168226686371498">Веб-переглядач за умовчанням</translation> +<translation id="2893180576842394309">Google може використовувати вашу історію, щоб персоналізувати Пошук та інші сервіси Google</translation> <translation id="2894757982205307093">Нова вкладка в групі</translation> <translation id="289695669188700754">Ідентифікатор ключа: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Це спеціальне налаштування буде вилучено, коли ви закриєте всі вікна в режимі анонімного перегляду</translation> @@ -2655,7 +2654,6 @@ <translation id="3856096718352044181">Підтвердьте, що цей постачальник активний, або повторіть спробу пізніше</translation> <translation id="3856800405688283469">Виберіть часовий пояс</translation> <translation id="3857807444929313943">Підніміть і опустіть палець</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: синхронізацію призупинено</translation> <translation id="3861638017150647085">Ім'я користувача "<ph name="USERNAME" />" недоступне</translation> <translation id="3861977424605124250">Показувати під час запуску</translation> <translation id="3862788408946266506">Додаток з атрибутом маніфесту "kiosk_only" потрібно встановлювати в режимі термінала ОС Chrome</translation> @@ -3547,7 +3545,6 @@ <translation id="4881685975363383806">Більше не нагадувати</translation> <translation id="4881695831933465202">Відкрити</translation> <translation id="4882312758060467256">Може запускатися на цьому сайті</translation> -<translation id="4882831918239250449">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку, оголошень тощо</translation> <translation id="4882919381756638075">Сайти зазвичай використовують мікрофон для роботи функцій спілкування, як-от відеочати</translation> <translation id="4883436287898674711">Усі сайти <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Диспетчер завдань</translation> @@ -4346,7 +4343,6 @@ <translation id="5794414402486823030">Завжди відкривати за допомогою системного переглядача</translation> <translation id="5794700615121138172">Спільні папки Linux</translation> <translation id="5794786537412027208">Вийти з усіх додатків Chrome</translation> -<translation id="5797070761912323120">Google може використовувати вашу історію, щоб персоналізувати Пошук, оголошення й інші сервіси Google</translation> <translation id="5798079537501238810">Сайти можуть установлювати обробники платежів</translation> <translation id="579907812742603813">захищений контент</translation> <translation id="579915268381781820">Ключ безпеки вилучено.</translation> @@ -4707,7 +4703,6 @@ <translation id="6208521041562685716">Мобільне передавання даних активується</translation> <translation id="6209838773933913227">Оновлення компонента</translation> <translation id="6209908325007204267">На цьому пристрої є ліцензія Chrome Enterprise Upgrade, але ваше ім'я користувача не зв'язане з жодним корпоративним обліковим записом. Створіть його, перейшовши на додатковому пристрої на сторінку g.co/ChromeEnterpriseAccount.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: синхронізація не працює</translation> <translation id="6212039847102026977">Показати розширені параметри мережі</translation> <translation id="6212168817037875041">Вимкнути дисплей</translation> <translation id="6212752530110374741">Надіслати посилання електронною поштою</translation> @@ -5796,6 +5791,7 @@ <translation id="7427348830195639090">Фонова сторінка: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Телефонувати з пристрою <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Пристроїв HID не знайдено</translation> +<translation id="7431991332293347422">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку тощо</translation> <translation id="7433708794692032816">Щоб далі використовувати <ph name="DEVICE_TYPE" />, вставте розумну картку</translation> <translation id="7433957986129316853">Залишити</translation> <translation id="7434509671034404296">Для розробників</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 6d5e78f..1ac6889 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -167,8 +167,6 @@ <translation id="117445914942805388">اپنے سبھی مطابقت پذیر آلات اور اپنے Google اکاؤنٹ سے براؤزنگ ڈیٹا صاف کرنے کیلئے، <ph name="BEGIN_LINK" />مطابقت پذیری کی ترتیبات ملاحظہ کریں<ph name="END_LINK" />۔</translation> <translation id="1175364870820465910">&پرنٹ کریں…</translation> <translation id="1176471985365269981">آپ کے آلے پر موجود فائلز یا فولڈرز میں ترمیم کرنے کی اجازت نہیں ہے</translation> -<translation id="1177138678118607465">تلاش، اشتہارات اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کیلئے Google آپ کی براؤزنگ سرگزشت استعمال کر سکتا ہے۔ آپ اسے کسی بھی وقت -myaccount.google.com/activitycontrols/search پر تبدیل کر سکتے ہيں</translation> <translation id="1177863135347784049">حسب ضرورت</translation> <translation id="1178581264944972037">موقوف کریں</translation> <translation id="117916940443676133">آپ کی سیکیورٹی کلید PIN کے ذریعے محفوظ نہیں ہے۔ سائن ان ڈیٹا کا نظم کرنے کے لیے پہلے ایک PIN تخلیق کریں۔</translation> @@ -553,7 +551,6 @@ <translation id="1602085790802918092">ورچوئل مشین شروع ہو رہی ہے</translation> <translation id="1603914832182249871">(پوشیدگی)</translation> <translation id="1604432177629086300">پرنٹ نہیں کیا جا سکا۔ پرنٹر چیک کریں اور دوبارہ کوشش کریں۔</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: پاس ورڈ کی مطابقت پذیری کام نہیں کر رہی ہے</translation> <translation id="1607139524282324606">داخلہ صاف کریں</translation> <translation id="1607499585984539560">صارف ڈومین کے ساتھ الحاق یافتہ نہیں ہے</translation> <translation id="1608626060424371292">اس صارف کو ہٹائیں</translation> @@ -1757,6 +1754,7 @@ <translation id="2889064240420137087">اس کے ساتھ لنک کھولیں…</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> میں سائن ان کرنے کیلئے آپ کے آلے کا استعمال کریں؟</translation> <translation id="2893168226686371498">ڈیفالٹ براؤزر</translation> +<translation id="2893180576842394309">تلاش اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کے لیے Google آپ کی سرگزشت کا استعمال کر سکتا ہے</translation> <translation id="2894757982205307093">گروپ میں نیا ٹیب</translation> <translation id="289695669188700754">کلید ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">آپ کے اپنی سبھی پوشیدگی ونڈوز بند کرنے پر اس حسب ضرورت ترتیب کو ہٹا دیا جائے گا</translation> @@ -2636,7 +2634,6 @@ <translation id="3856096718352044181">براہ کرم توثیق کریں کہ یہ درست فراہم کنندہ ہے یا بعد میں دوبارہ کوشش کریں</translation> <translation id="3856800405688283469">ٹائم زون منتخب کریں</translation> <translation id="3857807444929313943">اٹھائیں، پھر دوبارہ ٹچ کریں</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: مطابقت پذیری موقوف کر دی گئی</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" صارف نام دستیاب نہیں ہے</translation> <translation id="3861977424605124250">اسٹارٹ اپ پر دکھائیں</translation> <translation id="3862788408946266506">'kiosk_only' مینی فیسٹ انتساب والی ایپ کا Chrome OS کیوسک وضع میں انسٹال ہونا ضروری ہے</translation> @@ -3527,7 +3524,6 @@ <translation id="4881685975363383806">اگلی بار مجھے یاد دہانی نہ کرائیں</translation> <translation id="4881695831933465202">کھولیں</translation> <translation id="4882312758060467256">اس سائٹ تک رسائی ہے</translation> -<translation id="4882831918239250449">تلاش، اشتہارات وغیرہ کو ذاتی نوعیت کا بنانے کیلئے آپ کی براؤزنگ کی سرگزشت جس طریقے سے استعمال کی جاتی ہے اس کو کنٹرول کریں</translation> <translation id="4882919381756638075">سائٹس عام طور پر ویڈیو چیٹ جیسی کمیونیکشن کی خصوصیات کے لیے آپ کا مائيکروفون استعمال کرتی ہیں</translation> <translation id="4883436287898674711">سبھی <ph name="WEBSITE_1" /> سائٹس</translation> <translation id="48838266408104654">&ٹاسک مینیجر</translation> @@ -4325,7 +4321,6 @@ <translation id="5794414402486823030">ہمیشہ سسٹم ویور کے ساتھ کھولیں</translation> <translation id="5794700615121138172">Linux کے اشتراک کردہ فولڈرز</translation> <translation id="5794786537412027208">سبھی Chrome ایپس چھوڑ دیں</translation> -<translation id="5797070761912323120">تلاش، اشتہارات اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کے لیے Google آپ کی سرگزشت کا استعمال کر سکتا ہے</translation> <translation id="5798079537501238810">سائٹس ادائیگی کے ہینڈلرز کو انسٹال کر سکتی ہیں</translation> <translation id="579907812742603813">تحفظ یافتہ مواد</translation> <translation id="579915268381781820">آپ کی سیکیورٹی کلید ہٹا دی گئی۔</translation> @@ -4686,7 +4681,6 @@ <translation id="6208521041562685716">موبائل ڈیٹا فعال کیا جا رہا ہے</translation> <translation id="6209838773933913227">کمپونینٹ اپ ڈیٹ ہو رہا ہے</translation> <translation id="6209908325007204267">آپ کے آلے میں Chrome انٹرپرائز اپ گریڈ شامل ہے، لیکن آپ کا صارف نام انٹرپرائز اکاؤنٹ سے وابستہ نہیں ہے۔ براہ کرم کسی ثانوی آلہ پر g.co/ChromeEnterpriseAccount ملاحظہ کرکے انٹرپرائز اکاؤنٹ بنائیں۔</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: مطابقت پذیری کام نہیں کر رہی ہے</translation> <translation id="6212039847102026977">جدید ترین نیٹ ورک کی خصوصیات دکھائیں</translation> <translation id="6212168817037875041">ڈسپلے آف کریں</translation> <translation id="6212752530110374741">ای میل کا لنک</translation> @@ -5774,6 +5768,7 @@ <translation id="7427348830195639090">پس منظر کا صفحہ: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> سے کال کریں</translation> <translation id="7431719494109538750">کوئی HID آلہ نہیں ملا</translation> +<translation id="7431991332293347422">تلاش کو ذاتی نوعیت کا بنانے کیلئے آپ کی براؤزنگ کی سرگزشت جس طریقے سے استعمال کی جاتی ہے اسے کنٹرول کریں اور مزید بہت کچھ</translation> <translation id="7433708794692032816">اپنے <ph name="DEVICE_TYPE" /> کا استعمال جاری رکھنے کیلئے سمارٹ کارڈ داخل کریں</translation> <translation id="7433957986129316853">اسے رکھیں</translation> <translation id="7434509671034404296">ڈویلپر</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index f70975c..0b06f3d0 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -167,8 +167,6 @@ <translation id="117445914942805388">Brauzer tarixini Google hisobingizga sinxronlangan barcha qurilmalardan tozalash uchun <ph name="BEGIN_LINK" />sinxronizatsiya sozlamalarini oching<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Chop etish...</translation> <translation id="1176471985365269981">Qurilmangizdagi fayl yoki jildlarni tahrirlash taqiqlangan</translation> -<translation id="1177138678118607465">Google brauzer tarixidan qidiruv, reklama va boshqa Google -xizmatlarini sizga moslashtirish maqsadlarida foydalanishi mumkin. Bu ruxsatni myaccount.google.com/activitycontrols/search sahifasidan boshqarishingiz mumkin.</translation> <translation id="1177863135347784049">Boshqa</translation> <translation id="1178581264944972037">Pauza</translation> <translation id="117916940443676133">Elektron kalit PIN kod bilan himoyalanmagan. Kirish maʼlumotlarini boshqarish uchun avval PIN kod yarating.</translation> @@ -551,7 +549,6 @@ <translation id="1602085790802918092">Virtual mashina ishga tushirilmoqda</translation> <translation id="1603914832182249871">(inkognito)</translation> <translation id="1604432177629086300">Chop etilmadi. Printerni tekshiring va qayta urining.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: parollar sinxronizatsiyasi ishlamayapti</translation> <translation id="1607139524282324606">Tozalash</translation> <translation id="1607499585984539560">Bu domendan tashqari foydalanuvchi</translation> <translation id="1608626060424371292">Profilni o‘chirish</translation> @@ -1760,6 +1757,7 @@ <translation id="2889064240420137087">Havolani ochish...</translation> <translation id="2891922230654533301"><ph name="APP_NAME" /> ilovasiga qurilma orqali kirilsinmi?</translation> <translation id="2893168226686371498">Standart brauzer</translation> +<translation id="2893180576842394309">Qidiruv va boshqa xizmatlarni sizga moslashtirish uchun Google tarix maʼlumotlaringizdan foydalanishi mumkin</translation> <translation id="2894757982205307093">Joriy guruhda yangi varaq ochish</translation> <translation id="289695669188700754">Kalit identifikatori: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Bu maxsus sozlama barcha Inkognito oynalar yopilganda olib tashlanadi</translation> @@ -2640,7 +2638,6 @@ <translation id="3856096718352044181">Bu ishonchli xizmat ekanini tekshiring yoki keyinroq qayta urining</translation> <translation id="3856800405688283469">Vaqt mintaqasini tanlang</translation> <translation id="3857807444929313943">Barmoqni oling va qaytadan tekkizing</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: sinxronizatsiya to‘xtatilgan</translation> <translation id="3861638017150647085">“<ph name="USERNAME" />” nomi band</translation> <translation id="3861977424605124250">Boshlanishida koʻrsatilsin</translation> <translation id="3862788408946266506">Manifest faylida “kiosk_only” atributi mavjud ilovalarni Chrome OS‘da faqatgina kiosk rejimida o‘rnatish mumkin</translation> @@ -3532,7 +3529,6 @@ <translation id="4881685975363383806">Boshqa eslatilmasin</translation> <translation id="4881695831933465202">Ochish</translation> <translation id="4882312758060467256">Bu saytga ruxsati bor</translation> -<translation id="4882831918239250449">Moslashtirilgan qidiruv, reklama va boshqa tashriflar tarixi parametrlarini tanlang</translation> <translation id="4882919381756638075">Saytlar odatda video chat kabi aloqa xizmatlarida mikrofondan foydalanadi</translation> <translation id="4883436287898674711">Barcha <ph name="WEBSITE_1" /> saytlari</translation> <translation id="48838266408104654">&Vazifalar menejeri</translation> @@ -4331,7 +4327,6 @@ <translation id="5794414402486823030">Doim tizimdagi birlamchi ko‘rish dasturida ochish</translation> <translation id="5794700615121138172">Linux umumiy jildlari</translation> <translation id="5794786537412027208">Barcha Chrome ilovalarini yopish</translation> -<translation id="5797070761912323120">Qidiruv, rekama va boshqa xizmatlarni sizga moslashtirish uchun Google tarix maʼlumotlaringizdan foydalanishi mumkin</translation> <translation id="5798079537501238810">Saytlar toʻlov vositalarini oʻrnatishi mumkin</translation> <translation id="579907812742603813">himoyalangan kontent</translation> <translation id="579915268381781820">Elektron kalitingiz chiqarib olindi.</translation> @@ -4692,7 +4687,6 @@ <translation id="6208521041562685716">Mobil tarmoq faollashtirilmoqda</translation> <translation id="6209838773933913227">Komponent yangilanmoqda</translation> <translation id="6209908325007204267">Bu qurilmada Chrome korporativ litsenziyasi bor, lekin qurilmadagi foydalanuvchi nomi korporativ hisobga tegishli emas. Boshqa qurilma orqali g.co/ChromeEnterpriseAccount sahifasidan korporativ hisob oching.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Sinxronizatsiya ishlamayapti</translation> <translation id="6212039847102026977">Qo‘shimcha tarmoq parametrlari</translation> <translation id="6212168817037875041">Ekranni o‘chirish</translation> <translation id="6212752530110374741">Email Link</translation> @@ -5781,6 +5775,7 @@ <translation id="7427348830195639090">Orqa fon sahifasi: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129"><ph name="DEVICE_NAME" /> orqali telefon qilish</translation> <translation id="7431719494109538750">Hech qanday HID qurilmasi topilmadi</translation> +<translation id="7431991332293347422">Moslashtirilgan qidiruv, reklama va boshqa tashriflar tarixi parametrlarini tanlang</translation> <translation id="7433708794692032816"><ph name="DEVICE_TYPE" /> qurilmasidan foydalanishda davom etish uchun smart kartani kiriting</translation> <translation id="7433957986129316853">Saqlab qolinsin</translation> <translation id="7434509671034404296">Dasturchilar uchun</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 7ba2099..1b6cf62 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Để xóa dữ liệu duyệt web khỏi tất cả các thiết bị đã đồng bộ hóa và Tài khoản Google của bạn, hãy <ph name="BEGIN_LINK" />truy cập vào các tùy chọn cài đặt đồng bộ hóa<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&In...</translation> <translation id="1176471985365269981">Không được phép chỉnh sửa tệp hoặc thư mục trên thiết bị của bạn</translation> -<translation id="1177138678118607465">Google có thể sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm, quảng cáo và các dịch vụ khác của Google. Bạn có thể thay đổi cài đặt này bất cứ lúc nào tại myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Tùy chỉnh</translation> <translation id="1178581264944972037">Tạm dừng</translation> <translation id="117916940443676133">Bạn chưa thiết lập mã PIN để bảo vệ khóa bảo mật. Để quản lý dữ liệu đăng nhập, trước tiên, hãy tạo một mã PIN.</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">Đang khởi động máy ảo</translation> <translation id="1603914832182249871">(Ẩn danh)</translation> <translation id="1604432177629086300">Không in được. Vui lòng kiểm tra máy in rồi thử lại.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Tính năng đồng bộ hóa mật khẩu hiện không hoạt động</translation> <translation id="1607139524282324606">Xóa mục nhập</translation> <translation id="1607499585984539560">Người dùng không được liên kết với miền</translation> <translation id="1608626060424371292">Xóa người dùng này</translation> @@ -1772,6 +1770,7 @@ <translation id="2889064240420137087">Mở đường liên kết bằng...</translation> <translation id="2891922230654533301">Dùng thiết bị của bạn để đăng nhập vào <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Trình duyệt mặc định</translation> +<translation id="2893180576842394309">Google có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm và các dịch vụ khác của Google cho phù hợp với bạn</translation> <translation id="2894757982205307093">Thẻ mới trong nhóm</translation> <translation id="289695669188700754">ID Khoá: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Chế độ cài đặt tùy chỉnh này sẽ bị xóa khi bạn đóng tất cả Cửa sổ ẩn danh</translation> @@ -1908,6 +1907,7 @@ <translation id="3027296729579831126">Bật tính năng Chia sẻ lân cận</translation> <translation id="3029466929721441205">Hiển thị các công cụ bút cảm ứng trong giá</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> yêu cầu bạn tải bản cập nhật xuống ngay hôm nay. Bản cập nhật sẽ tự động tải xuống khi bạn kết nối Internet.}other{<ph name="MANAGER" /> yêu cầu bạn tải bản cập nhật xuống trước thời hạn. Bản cập nhật sẽ tự động tải xuống khi bạn kết nối Internet.}}</translation> +<translation id="3030967311408872958">Từ tối đến sáng</translation> <translation id="3031417829280473749">Đặc vụ X</translation> <translation id="3031557471081358569">Chọn các mục cần nhập:</translation> <translation id="3036327949511794916">Đã quá thời hạn trả lại thiết bị <ph name="DEVICE_TYPE" /> này.</translation> @@ -2104,7 +2104,7 @@ <translation id="3275778913554317645">Mở dưới dạng cửa sổ</translation> <translation id="3277691515294482687">Sao lưu ứng dụng và tệp vào thư mục Tệp của tôi trước khi nâng cấp Linux.</translation> <translation id="3278001907972365362">Bạn cần chú ý đến Tài khoản Google của mình</translation> -<translation id="3279092821516760512">Những người liên hệ mà bạn đã chọn có thể chia sẻ với bạn khi họ ở gần. Quá trình chuyển sẽ bắt đầu khi bạn chấp nhận.</translation> +<translation id="3279092821516760512">Những người liên hệ mà bạn đã chọn có thể chia sẻ với bạn khi họ ở gần. Quá trình truyền tệp sẽ bắt đầu khi bạn chấp nhận.</translation> <translation id="3279230909244266691">Quá trình này có thể mất vài phút. Đang khởi động máy ảo.</translation> <translation id="3280237271814976245">Lưu &thành...</translation> <translation id="3280243678470289153">Tiếp tục điều hướng trong Chrome</translation> @@ -2651,7 +2651,6 @@ <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="3856800405688283469">Chọn múi giờ</translation> <translation id="3857807444929313943">Nhấc ngón tay lên rồi chạm lại</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Đã tạm dừng đồng bộ hóa</translation> <translation id="3861638017150647085">Tên người dùng "<ph name="USERNAME" />" không có sẵn</translation> <translation id="3861977424605124250">Hiển thị khi khởi động</translation> <translation id="3862788408946266506">Phải cài đặt ứng dụng có thuộc tính tệp kê khai 'kiosk_only' ở chế độ kiosk Chrome OS</translation> @@ -3543,7 +3542,6 @@ <translation id="4881685975363383806">Không nhắc tôi vào lần tới</translation> <translation id="4881695831933465202">Mở</translation> <translation id="4882312758060467256">Có quyền truy cập vào trang web này</translation> -<translation id="4882831918239250449">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm, quảng cáo và các dịch vụ khác</translation> <translation id="4882919381756638075">Các trang web thường sử dụng micrô cho các tính năng giao tiếp như trò chuyện video</translation> <translation id="4883436287898674711">Tất cả trang web <ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Trình quản lý Tác vụ</translation> @@ -4090,6 +4088,7 @@ <translation id="5502500733115278303">Đã nhập từ Firefox</translation> <translation id="5502915260472117187">Một trẻ</translation> <translation id="5503982651688210506">Tiếp tục cho phép <ph name="HOST" /> dùng và di chuyển máy ảnh, cũng như sử dụng micrô</translation> +<translation id="5504909642107847870">Kiểm tra quyền riêng tư và tính bảo mật</translation> <translation id="5505264765875738116">Các trang web không thể xin phép gửi thông báo</translation> <translation id="5505307013568720083">Hết mực</translation> <translation id="5505794066310932198">Bật/tắt tính năng Commander</translation> @@ -4341,7 +4340,6 @@ <translation id="5794414402486823030">Luôn mở bằng trình xem hệ thống</translation> <translation id="5794700615121138172">Thư mục do Linux chia sẻ</translation> <translation id="5794786537412027208">Thoát khỏi tất cả các ứng dụng Chrome</translation> -<translation id="5797070761912323120">Google có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm, quảng cáo và các dịch vụ khác của Google cho phù hợp với bạn</translation> <translation id="5798079537501238810">Các trang web có thể cài đặt trình xử lý thanh toán</translation> <translation id="579907812742603813">nội dung được bảo vệ</translation> <translation id="579915268381781820">Khóa bảo mật của bạn đã bị rút ra.</translation> @@ -4702,7 +4700,6 @@ <translation id="6208521041562685716">Đang kích hoạt dữ liệu di động</translation> <translation id="6209838773933913227">Đang cập nhật thành phần</translation> <translation id="6209908325007204267">Thiết bị của bạn có Bản nâng cấp Chrome Enterprise, nhưng tên người dùng lại chưa được liên kết với một tài khoản doanh nghiệp. Vui lòng truy cập vào g.co/ChromeEnterpriseAccount để tạo một tài khoản doanh nghiệp trên thiết bị phụ.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Tính năng đồng bộ hóa hiện không hoạt động</translation> <translation id="6212039847102026977">Hiển thị thuộc tính mạng nâng cao</translation> <translation id="6212168817037875041">Tắt màn hình</translation> <translation id="6212752530110374741">Gửi liên kết qua email</translation> @@ -4919,6 +4916,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> – Đang tích cực quét tìm thiết bị Bluetooth</translation> <translation id="6445450263907939268">Nếu không thích những thay đổi này, bạn có thể khôi phục cài đặt trước của mình.</translation> <translation id="6446213738085045933">Tạo lối tắt trên màn hình</translation> +<translation id="6447210166804596538">Kiểm tra các chế độ kiểm soát quan trọng nhất về quyền riêng tư và tính bảo mật tại cùng một nơi</translation> <translation id="6447842834002726250">Cookie</translation> <translation id="6450876761651513209">Thay đổi các cài đặt liên quan đến bảo mật của bạn</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> và 1 thẻ khác}other{<ph name="PAGE_TITLE" /> và # thẻ khác}}</translation> @@ -5713,7 +5711,7 @@ <translation id="7348093485538360975">Bàn phím ảo</translation> <translation id="7349010927677336670">Độ mượt của video</translation> <translation id="7352651011704765696">Đã xảy ra lỗi</translation> -<translation id="7353261921908507769">Người liên hệ của bạn có thể chia sẻ với bạn khi họ ở gần. Quá trình chuyển sẽ bắt đầu khi bạn chấp nhận.</translation> +<translation id="7353261921908507769">Những người liên hệ của bạn có thể chia sẻ với bạn khi họ ở gần. Quá trình truyền tệp sẽ bắt đầu khi bạn chấp nhận.</translation> <translation id="735361434055555355">Đang cài đặt Linux...</translation> <translation id="7354341762311560488">Cảm biến vân tay là phím dưới cùng bên trái của bàn phím. Hãy chạm nhẹ ngón tay bất kỳ vào đó.</translation> <translation id="7356908624372060336">Nhật ký mạng</translation> @@ -5790,6 +5788,7 @@ <translation id="7427348830195639090">Trang nền: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Gọi từ <ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Không tìm thấy thiết bị HID</translation> +<translation id="7431991332293347422">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm và các dịch vụ khác</translation> <translation id="7433708794692032816">Lắp thẻ thông minh để tiếp tục sử dụng <ph name="DEVICE_TYPE" /> của bạn</translation> <translation id="7433957986129316853">Giữ nguyên</translation> <translation id="7434509671034404296">Nhà phát triển</translation> @@ -6900,6 +6899,7 @@ <translation id="8655972064210167941">Đăng nhập không thành công vì không thể xác minh mật khẩu của bạn. Vui lòng liên hệ với quản trị viên của bạn hoặc thử lại.</translation> <translation id="8657393004602556571">Bạn có muốn loại bỏ ý kiến phản hồi này không?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> đang chia sẻ màn hình và âm thanh của bạn với <ph name="TAB_NAME" />.</translation> +<translation id="8660073998956001352">Công cụ tìm kiếm của bạn</translation> <translation id="8661290697478713397">Mở Liên kết bằn&g Cửa sổ Ẩn danh</translation> <translation id="8662671328352114214">Kết nối mạng <ph name="TYPE" /></translation> <translation id="8662795692588422978">Mọi người</translation> @@ -7086,6 +7086,7 @@ <translation id="8845001906332463065">Nhận trợ giúp</translation> <translation id="8846132060409673887">Đọc thông tin về nhà sản xuất và kiểu máy của máy tính này</translation> <translation id="8846163936679269230">Đặt lại hồ sơ eSIM</translation> +<translation id="8846746259444262774">Cài đặt không thành công</translation> <translation id="8847523528195140327">Đăng xuất khi đóng nắp màn hình</translation> <translation id="8847988622838149491">USB</translation> <translation id="8849001918648564819">Đã ẩn</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 1b7548d..3513d1b3 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">要想清除您的所有已同步设备中的浏览数据以及您的 Google 帐号中的浏览数据,请<ph name="BEGIN_LINK" />访问同步设置<ph name="END_LINK" />。</translation> <translation id="1175364870820465910">打印(&P)...</translation> <translation id="1176471985365269981">不得修改您设备上的文件或文件夹</translation> -<translation id="1177138678118607465">Google 可能会使用您的浏览记录为您量身定制 Google 搜索、广告和其他 Google 服务。您随时可通过 myaccount.google.com/activitycontrols/search 更改此设置</translation> <translation id="1177863135347784049">自定义</translation> <translation id="1178581264944972037">暂停</translation> <translation id="117916940443676133">您尚未设置 PIN 码来保护您的安全密钥。要管理登录数据,请先创建一个 PIN 码。</translation> @@ -549,7 +548,6 @@ <translation id="1602085790802918092">正在启动虚拟机</translation> <translation id="1603914832182249871">(无痕)</translation> <translation id="1604432177629086300">无法打印。请检查打印机,然后重试。</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />:无法同步密码</translation> <translation id="1607139524282324606">清除此条目</translation> <translation id="1607499585984539560">此用户未与网域关联</translation> <translation id="1608626060424371292">移除此用户</translation> @@ -1753,6 +1751,7 @@ <translation id="2889064240420137087">链接打开方式...</translation> <translation id="2891922230654533301">使用您的设备登录 <ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">默认浏览器</translation> +<translation id="2893180576842394309">Google 可能会利用您的历史记录为您提供个性化的 Google 搜索和其他 Google 服务</translation> <translation id="2894757982205307093">在组内添加新标签页</translation> <translation id="289695669188700754">密钥 ID:<ph name="KEY_ID" /></translation> <translation id="2897713966423243833">当您关闭所有无痕式窗口后,系统将会撤消这项自定义设置</translation> @@ -2633,7 +2632,6 @@ <translation id="3856096718352044181">请检查并确保这是一个有效的提供商,或者稍后重试</translation> <translation id="3856800405688283469">选择时区</translation> <translation id="3857807444929313943">移开手指,然后再次触摸传感器</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />:已暂停同步</translation> <translation id="3861638017150647085">用户名“<ph name="USERNAME" />”不可用</translation> <translation id="3861977424605124250">在 Chrome 启动时显示</translation> <translation id="3862788408946266506">具有“kiosk_only”这项清单属性的应用必须在 Chrome 操作系统自助服务终端模式下进行安装</translation> @@ -3523,7 +3521,6 @@ <translation id="4881685975363383806">下次不再提醒我</translation> <translation id="4881695831933465202">打开</translation> <translation id="4882312758060467256">可以访问此网站</translation> -<translation id="4882831918239250449">控制 Google 如何利用您的浏览记录为您提供个性化的搜索、广告和其他服务</translation> <translation id="4882919381756638075">网站通常会使用您的麦克风以实现通信功能(例如视频聊天)</translation> <translation id="4883436287898674711">所有<ph name="WEBSITE_1" />网站</translation> <translation id="48838266408104654">任务管理器(&T)</translation> @@ -4322,7 +4319,6 @@ <translation id="5794414402486823030">始终使用系统查看器打开</translation> <translation id="5794700615121138172">Linux 共享文件夹</translation> <translation id="5794786537412027208">退出所有Chrome应用</translation> -<translation id="5797070761912323120">Google 可能会利用您的历史记录为您提供个性化的 Google 搜索、广告和其他 Google 服务</translation> <translation id="5798079537501238810">网站可以安装付款处理程序</translation> <translation id="579907812742603813">受保护的内容</translation> <translation id="579915268381781820">您的安全密钥已被拔出。</translation> @@ -4683,7 +4679,6 @@ <translation id="6208521041562685716">正在激活移动数据</translation> <translation id="6209838773933913227">正在更新组件</translation> <translation id="6209908325007204267">您的设备随附了一份 Chrome 企业版升级许可,但您的用户名并未与任何企业帐号关联。请先在辅助设备上前往 g.co/ChromeEnterpriseAccount 创建一个企业帐号。</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />:同步功能无法正常运行</translation> <translation id="6212039847102026977">显示高级网络属性</translation> <translation id="6212168817037875041">关闭显示屏</translation> <translation id="6212752530110374741">通过电子邮件发送链接</translation> @@ -5772,6 +5767,7 @@ <translation id="7427348830195639090">后台网页:<ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">通过<ph name="DEVICE_NAME" />拨打电话</translation> <translation id="7431719494109538750">找不到任何 HID 设备</translation> +<translation id="7431991332293347422">控制 Google 如何利用您的浏览记录为您提供个性化的 Google 搜索和其他 Google 服务</translation> <translation id="7433708794692032816">插入智能卡以继续使用您的 <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">保持现状</translation> <translation id="7434509671034404296">开发者</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 434fac9..a951487 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">如要從所有已同步的裝置和 Google 帳戶中清除瀏覽資料,請<ph name="BEGIN_LINK" />前往同步處理設定<ph name="END_LINK" />。</translation> <translation id="1175364870820465910">列印(&P)…</translation> <translation id="1176471985365269981">不允許編輯裝置上的檔案或資料夾</translation> -<translation id="1177138678118607465">Google 可能會使用您的瀏覽記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務。您可以前往 myaccount.google.com/activitycontrols/search 變更此設定。</translation> <translation id="1177863135347784049">自訂</translation> <translation id="1178581264944972037">暫停</translation> <translation id="117916940443676133">您的安全密鑰並未受 PIN 保護。請先建立 PIN 以管理登入資料。</translation> @@ -555,7 +554,6 @@ <translation id="1602085790802918092">正在啟動虛擬機器</translation> <translation id="1603914832182249871">(無痕模式)</translation> <translation id="1604432177629086300">無法列印。請檢查打印機,然後再試一次</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />:密碼同步功能無法正常運作</translation> <translation id="1607139524282324606">清除項目</translation> <translation id="1607499585984539560">使用者並未與網域建立關聯</translation> <translation id="1608626060424371292">移除這個使用者</translation> @@ -1771,6 +1769,7 @@ <translation id="2889064240420137087">使用其他程式開啟連結…</translation> <translation id="2891922230654533301">要使用裝置登入 <ph name="APP_NAME" /> 嗎?</translation> <translation id="2893168226686371498">預設瀏覽器</translation> +<translation id="2893180576842394309">Google 可能會使用您的記錄,為您提供個人化的搜尋服務和其他 Google 服務</translation> <translation id="2894757982205307093">在群組中新增分頁</translation> <translation id="289695669188700754">金鑰識別碼:<ph name="KEY_ID" /></translation> <translation id="2897713966423243833">當您關閉所有無痕式視窗時,系統將會移除此自訂設定</translation> @@ -1907,7 +1906,7 @@ <translation id="3027296729579831126">開啟「咫尺共享」功能</translation> <translation id="3029466929721441205">顯示捷徑列中的觸控筆工具</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> 要求您在今天內下載更新。系統將在您連接互聯網時自動下載更新。}other{<ph name="MANAGER" /> 要求您在期限前下載更新。系統將在您連接互聯網時自動下載更新。}}</translation> -<translation id="3030967311408872958">日落到日出</translation> +<translation id="3030967311408872958">日落至日出</translation> <translation id="3031417829280473749">特務 X</translation> <translation id="3031557471081358569">選取要匯入的項目:</translation> <translation id="3036327949511794916">此 <ph name="DEVICE_TYPE" /> 的退貨期限已過。</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">請驗證供應商的有效性,或稍後再試</translation> <translation id="3856800405688283469">選取時區</translation> <translation id="3857807444929313943">提起手指,然後再次輕觸</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />:已暫停同步處理</translation> <translation id="3861638017150647085">使用者名稱「<ph name="USERNAME" />」無法使用</translation> <translation id="3861977424605124250">啟動時顯示</translation> <translation id="3862788408946266506">含有 "kiosk_only" 資訊清單屬性的應用程式只能在 ChromeOS Kiosk 模式中安裝</translation> @@ -3543,7 +3541,6 @@ <translation id="4881685975363383806">下次不要提醒我</translation> <translation id="4881695831933465202">開啟</translation> <translation id="4882312758060467256">可以在此網站上執行</translation> -<translation id="4882831918239250449">控制系統如何使用您的瀏覽記錄為您提供個人化的搜尋內容、廣告和其他服務</translation> <translation id="4882919381756638075">網站通常會使用麥克風來提供視像通訊等通訊功能</translation> <translation id="4883436287898674711">所有 <ph name="WEBSITE_1" /> 網站</translation> <translation id="48838266408104654">工作管理員(&T)</translation> @@ -4090,7 +4087,7 @@ <translation id="5502500733115278303">從 Firefox 匯入的書籤</translation> <translation id="5502915260472117187">兒童</translation> <translation id="5503982651688210506">繼續允許 <ph name="HOST" /> 使用和移動相機,以及使用麥克風</translation> -<translation id="5504909642107847870">隱私權和安全性檢查</translation> +<translation id="5504909642107847870">查看私隱和安全性</translation> <translation id="5505264765875738116">網站將無法要求向您傳送通知</translation> <translation id="5505307013568720083">墨水用完</translation> <translation id="5505794066310932198">切換指令工具</translation> @@ -4342,7 +4339,6 @@ <translation id="5794414402486823030">一律使用系統檢視器開啟</translation> <translation id="5794700615121138172">Linux 共用資料夾</translation> <translation id="5794786537412027208">結束所有 Chrome 應用程式</translation> -<translation id="5797070761912323120">Google 可能會使用您的記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務</translation> <translation id="5798079537501238810">網站可安裝付款處理常式</translation> <translation id="579907812742603813">受保護的內容</translation> <translation id="579915268381781820">您的安全密鑰已被移除。</translation> @@ -4703,7 +4699,6 @@ <translation id="6208521041562685716">正在啟用流動數據</translation> <translation id="6209838773933913227">正在更新組件</translation> <translation id="6209908325007204267">您的裝置包含一項 Chrome Enterprise 升級,但您的使用者名稱尚未連結企業賬戶。請透過另一部裝置前往 g.co/ChromeEnterpriseAccount 建立企業帳戶。</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />:同步處理無法正常運作</translation> <translation id="6212039847102026977">顯示進階網絡屬性</translation> <translation id="6212168817037875041">關閉螢幕</translation> <translation id="6212752530110374741">透過電郵傳送連結</translation> @@ -4920,7 +4915,7 @@ <translation id="6444909401984215022"><ph name="WINDOW_TITLE" /> - 啟用緊藍牙掃瞄</translation> <translation id="6445450263907939268">如果您不想套用這些變更,可以還原為先前的設定。</translation> <translation id="6446213738085045933">建立桌面捷徑</translation> -<translation id="6447210166804596538">集中檢查最重要的隱私權和安全性控制項</translation> +<translation id="6447210166804596538">集中查看最重要的私隱和安全控制項</translation> <translation id="6447842834002726250">Cookie</translation> <translation id="6450876761651513209">變更私隱權相關設定</translation> <translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> 和另外 1 個分頁}other{<ph name="PAGE_TITLE" /> 和另外 # 個分頁}}</translation> @@ -5792,6 +5787,7 @@ <translation id="7427348830195639090">背景頁面:<ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">透過 <ph name="DEVICE_NAME" /> 撥打電話</translation> <translation id="7431719494109538750">找不到 HID 裝置</translation> +<translation id="7431991332293347422">控制系統如何使用您的瀏覽記錄,為您提供個人化的搜尋內容和其他服務</translation> <translation id="7433708794692032816">插入智能卡才能繼續使用 <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">保留</translation> <translation id="7434509671034404296">開發人員</translation> @@ -6901,7 +6897,7 @@ <translation id="8655972064210167941">系統無法驗證您的密碼,導致登入失敗。請與您的管理員聯絡或再試一次。</translation> <translation id="8657393004602556571">您要捨棄這則意見嗎?</translation> <translation id="8658645149275195032"><ph name="APP_NAME" /> 正與 <ph name="TAB_NAME" /> 共用您的螢幕和音效。</translation> -<translation id="8660073998956001352">你的搜尋引擎</translation> +<translation id="8660073998956001352">您的搜尋引擎</translation> <translation id="8661290697478713397">在無痕式視窗中開啟連結(&G)</translation> <translation id="8662671328352114214">加入 <ph name="TYPE" /> 網絡</translation> <translation id="8662795692588422978">人員</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index a487318..619257d 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -167,7 +167,6 @@ <translation id="117445914942805388">如要從所有同步的裝置和 Google 帳戶中清除瀏覽資料,請<ph name="BEGIN_LINK" />前往同步處理設定<ph name="END_LINK" />。</translation> <translation id="1175364870820465910">列印(&P)...</translation> <translation id="1176471985365269981">不得編輯裝置上的檔案或資料夾</translation> -<translation id="1177138678118607465">Google 可能會使用你的瀏覽記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務。你隨時可以前往 myaccount.google.com/activitycontrols/search 變更這項設定</translation> <translation id="1177863135347784049">自訂</translation> <translation id="1178581264944972037">暫停</translation> <translation id="117916940443676133">你的安全金鑰未受 PIN 碼保護。如要管理登入資料,請先建立 PIN 碼。</translation> @@ -552,7 +551,6 @@ <translation id="1602085790802918092">正在啟動虛擬機器</translation> <translation id="1603914832182249871">(無痕模式)</translation> <translation id="1604432177629086300">無法列印。請檢查印表機,然後再試一次。</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />:密碼同步功能無法正常運作</translation> <translation id="1607139524282324606">清除項目</translation> <translation id="1607499585984539560">使用者並未與網域建立關聯</translation> <translation id="1608626060424371292">移除這位使用者</translation> @@ -1757,6 +1755,7 @@ <translation id="2889064240420137087">使用其他程式開啟連結...</translation> <translation id="2891922230654533301">要從這部裝置登入「<ph name="APP_NAME" />」嗎?</translation> <translation id="2893168226686371498">預設瀏覽器</translation> +<translation id="2893180576842394309">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務和其他各項 Google 服務</translation> <translation id="2894757982205307093">在群組中新增分頁</translation> <translation id="289695669188700754">金鑰識別碼:<ph name="KEY_ID" /></translation> <translation id="2897713966423243833">所有無痕式視窗關閉後,這項自訂設定將會移除</translation> @@ -2090,7 +2089,7 @@ <translation id="3275778913554317645">在視窗中開啟</translation> <translation id="3277691515294482687">先將我的應用程式和檔案備份至「我的檔案」資料夾,再升級 Linux。</translation> <translation id="3278001907972365362">你的 Google 帳戶有狀況需處理</translation> -<translation id="3279092821516760512">所選聯絡人在附近時可與你分享內容。傳輸作業會等到你接受後才開始。</translation> +<translation id="3279092821516760512">指定聯絡人在附近時可與你分享內容。系統會先確認你是否同意,然後才會開始進行資料傳輸作業。</translation> <translation id="3279230909244266691">正在啟動虛擬機器,過程可能需要幾分鐘。</translation> <translation id="3280237271814976245">另存新檔(&A)...</translation> <translation id="3280243678470289153">繼續使用 Chrome</translation> @@ -2637,7 +2636,6 @@ <translation id="3856096718352044181">請驗證供應商是否有效,或稍後再試</translation> <translation id="3856800405688283469">選取時區</translation> <translation id="3857807444929313943">移開手指,然後再次輕觸感應器</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />:已暫停同步處理</translation> <translation id="3861638017150647085">使用者名稱「<ph name="USERNAME" />」無法使用</translation> <translation id="3861977424605124250">啟動時顯示</translation> <translation id="3862788408946266506">含有「kiosk_only」資訊清單屬性的應用程式只能在 Chrome 作業系統 Kiosk 模式中安裝</translation> @@ -3527,7 +3525,6 @@ <translation id="4881685975363383806">下次不要提醒我</translation> <translation id="4881695831933465202">開啟</translation> <translation id="4882312758060467256">有權存取這個網站</translation> -<translation id="4882831918239250449">控制 Google 使用瀏覽記錄提供個人化搜尋服務、廣告和其他內容的方式</translation> <translation id="4882919381756638075">網站通常會使用你的麥克風,以提供視訊通訊等通訊功能</translation> <translation id="4883436287898674711">所有 <ph name="WEBSITE_1" /> 網站</translation> <translation id="48838266408104654">工作管理員(&T)</translation> @@ -4326,7 +4323,6 @@ <translation id="5794414402486823030">一律使用系統檢視器開啟</translation> <translation id="5794700615121138172">Linux 共用資料夾</translation> <translation id="5794786537412027208">結束所有 Chrome 應用程式</translation> -<translation id="5797070761912323120">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務</translation> <translation id="5798079537501238810">網站可以安裝付款處理常式</translation> <translation id="579907812742603813">受保護內容</translation> <translation id="579915268381781820">你的安全金鑰已移除。</translation> @@ -4687,7 +4683,6 @@ <translation id="6208521041562685716">正在啟用行動數據</translation> <translation id="6209838773933913227">正在更新元件</translation> <translation id="6209908325007204267">你的裝置包含 Chrome Enterprise 升級版,但你的使用者名稱未申請企業版帳戶。請透過其他裝置前往 g.co/ChromeEnterpriseAccount 建立企業版帳戶。</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />:同步處理功能無法正常運作</translation> <translation id="6212039847102026977">顯示進階網路屬性</translation> <translation id="6212168817037875041">關閉螢幕</translation> <translation id="6212752530110374741">透過電子郵件傳送連結</translation> @@ -5699,7 +5694,7 @@ <translation id="7348093485538360975">螢幕小鍵盤</translation> <translation id="7349010927677336670">視訊流暢度</translation> <translation id="7352651011704765696">發生錯誤</translation> -<translation id="7353261921908507769">聯絡人在附近時可與你分享內容。傳輸作業會等到你接受後才開始。</translation> +<translation id="7353261921908507769">聯絡人在附近時可與你分享內容。系統會先確認你是否同意,然後才會開始進行資料傳輸作業。</translation> <translation id="735361434055555355">正在安裝 Linux...</translation> <translation id="7354341762311560488">指紋感應器位於鍵盤左下方,請單指輕觸這個按鍵。</translation> <translation id="7356908624372060336">網路記錄</translation> @@ -5776,6 +5771,7 @@ <translation id="7427348830195639090">背景頁面:<ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">用「<ph name="DEVICE_NAME" />」撥打電話</translation> <translation id="7431719494109538750">找不到 HID 裝置</translation> +<translation id="7431991332293347422">控制 Google 使用瀏覽記錄提供個人化搜尋服務和其他內容的方式</translation> <translation id="7433708794692032816">插入智慧型卡片才能繼續使用 <ph name="DEVICE_TYPE" /></translation> <translation id="7433957986129316853">保留</translation> <translation id="7434509671034404296">開發人員選項</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 5cf34c0..14e78e1 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -169,7 +169,6 @@ <translation id="117445914942805388">Ukuze usule idatha yokuphequlula kusuka kuwo wonke amadivayisi akho avumelanisiwe ne-akhawunti yakho ye-Google, <ph name="BEGIN_LINK" />vakashela izilungiselelo zokuvumelanisa<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Phrinta...</translation> <translation id="1176471985365269981">Ayivumelekile ukuhlela amafayela noma amafolda kudivayisi yakho</translation> -<translation id="1177138678118607465">I-Google ingasebenzisa umlando wakho wokuphequlula ukwenza ngezifiso usesho, izikhangiso, namanye amasevisi e-Google. Ungashintsha lokhu noma kunini ku-myaccount.google.com/activitycontrols/search</translation> <translation id="1177863135347784049">Ngokwezifiso</translation> <translation id="1178581264944972037">Misa isikhashana</translation> <translation id="117916940443676133">Ukhiye wakho wokuqinisekisa ubunikazi awuvunyelwe ngephinikhodi. Ukuze uphathe idatha yokungena ngemvume, qala udale iphinikhodi</translation> @@ -554,7 +553,6 @@ <translation id="1602085790802918092">Ukuqala umshini obonakalayo</translation> <translation id="1603914832182249871">(I-Incognito)</translation> <translation id="1604432177629086300">Ayikwazanga ukuphrinta. Hlola iphrinta uphinde uzame futhi.</translation> -<translation id="1605544918554600534"><ph name="PROFILE_NAME" />: Ukuvumelanisa iphasiwedi akusebenzi</translation> <translation id="1607139524282324606">Sula ukungena</translation> <translation id="1607499585984539560">Umsebenzisi akalona inxusa lesizinda</translation> <translation id="1608626060424371292">Susa lo msebenzisi</translation> @@ -1771,6 +1769,7 @@ <translation id="2889064240420137087">Vula isixhumanisi nge...</translation> <translation id="2891922230654533301">Sebenzisa idivayisi yakho ukungena ngemvume ku-<ph name="APP_NAME" />?</translation> <translation id="2893168226686371498">Isiphequluli esizenzakalelayo</translation> +<translation id="2893180576842394309">I-Google ingasebenzisa umlando wakho ukuze yenze kube ngokwakho usesho namanye amasevisi e-Google</translation> <translation id="2894757982205307093">Ithebhu entsha kuqembu</translation> <translation id="289695669188700754">I-ID engukhiye: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">Leli sethingi elingokwezifiso lizosuswa uma uvala wonke amawindi akho we-Incognito</translation> @@ -2651,7 +2650,6 @@ <translation id="3856096718352044181">Sicela uqinisekise ukuthi lo ngumhlinzeki wangempela noma uzame futhi kamuva</translation> <translation id="3856800405688283469">Khetha indawo yesikhathi</translation> <translation id="3857807444929313943">Phakamisa, bese uyathinta futhi</translation> -<translation id="3860104611854310167"><ph name="PROFILE_NAME" />: Ukuvumelanisa kumiswe isikhashana</translation> <translation id="3861638017150647085">Igama lomsebenzisi "<ph name="USERNAME" />" alitholakali</translation> <translation id="3861977424605124250">Bonisa ekuqaleni</translation> <translation id="3862788408946266506">Izinhelo zokusebenza ezinesibaluli se-manifest se-'kiosk_only' kumele sifakwe kumodi yekhiyoski ye-Chrome OS</translation> @@ -3542,7 +3540,6 @@ <translation id="4881685975363383806">Ungangikhumbuzi esikhathini esizayo</translation> <translation id="4881695831933465202">Vula</translation> <translation id="4882312758060467256">Unokufinyelela kuleli sayithi</translation> -<translation id="4882831918239250449">Lawula ukuthi umlando wakho wokuphequlula usetshenziswa kanjani ukuze kwenziwe kube ngokwakho usesho, izikhangiso, nokuningi</translation> <translation id="4882919381756638075">Amasayithi avamise ukusebenzisa imakrofoni kuzici zokuxhumana ezifana nokuxoxa kwevidiyo</translation> <translation id="4883436287898674711">Wonke amasayithi we-<ph name="WEBSITE_1" /></translation> <translation id="48838266408104654">&Isiphathi somsebenzi</translation> @@ -4344,7 +4341,6 @@ <translation id="5794414402486823030">Ihlala ivuliwe ngesibukeli sesistimu</translation> <translation id="5794700615121138172">I-Linux yabelane ngamafolda</translation> <translation id="5794786537412027208">Yeka zonke izinhlelo zokusebenza ze-Chrome</translation> -<translation id="5797070761912323120">I-Google ingasebenzisa umlando wakho ukuze yenze kube ngokwakho usesho, izikhangiso, namanye amasevisi e-Google</translation> <translation id="5798079537501238810">Amasayithi angafaka izibambi zenkokhelo</translation> <translation id="579907812742603813">okuqukethwe okuvikelekile</translation> <translation id="579915268381781820">Ukhiye wakho wokuqinisekisa ubunikazi ususiwe.</translation> @@ -4705,7 +4701,6 @@ <translation id="6208521041562685716">Idatha yeselula iyasetshenziswa</translation> <translation id="6209838773933913227">Ibuyekeza ingxenye</translation> <translation id="6209908325007204267">Idivayisi yakho ibandakanya Ukuthuthukiswa kwe-Chrome Enterprise, kodwa igama lomsebenzisi lakho alihlobene ne-akhawunti yebhizinisi. Sicela udale i-akhawunti yebhizinisi ngokuvakashela ethi, g.co/ChromeEnterpriseAccount edivayisini yesibili.</translation> -<translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Ukuvumelanisa akusebenzi</translation> <translation id="6212039847102026977">Bonisa izakhiwo ezithuthukisiwe zenethiwekhi</translation> <translation id="6212168817037875041">Vala isiboniso</translation> <translation id="6212752530110374741">Thumela nge-imeyili isixhumanisi</translation> @@ -5794,6 +5789,7 @@ <translation id="7427348830195639090">Ikhasi elingemuva: <ph name="BACKGROUND_PAGE_URL" /></translation> <translation id="7427798576651127129">Ikholi esuka ku-<ph name="DEVICE_NAME" /></translation> <translation id="7431719494109538750">Awekho amadivayisi we-HID atholakele</translation> +<translation id="7431991332293347422">Lawula ukuthi umlando wakho wokuphequlula usetshenziswa kanjani ukuze kwenziwe kube ngokwakho Usesho nokuningi</translation> <translation id="7433708794692032816">Faka ikhadi elismathi ukuze uqhubeke usebenzisa i-<ph name="DEVICE_TYPE" /> yakho</translation> <translation id="7433957986129316853">Ligcine</translation> <translation id="7434509671034404296">Unjiniyela</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 2452239..34e2472 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -267,7 +267,7 @@ <translation id="7890208801193284374">நீங்கள் கம்ப்யூட்டரைப் பகிர்ந்தால், நண்பர்களும் குடும்பத்தினரும் தனிப்பட்ட முறையில் உலாவலாம், மேலும் Chromeமை அவர்கள் விருப்பத்திற்கு ஏற்ப அமைத்துக்கொள்ளலாம்.</translation> <translation id="7896673875602241923">இதற்கு முன்னர் ஒருவர் இந்தக் கம்ப்யூட்டரில் Chromeமில் <ph name="ACCOUNT_EMAIL_LAST" /> எனும் முகவரியைப் பயன்படுத்தி உள்நுழைந்திருந்தார். உங்கள் தகவலைத் தனிப்பட்டதாக வைத்திருக்க, புதிய Chrome பயனரை உருவாக்கவும்.</translation> <translation id="7930071585467473040">Google Chrome கடவுச்சொற்களை நகலெடுக்க முயல்கிறது.</translation> -<translation id="7951988079884443914">இந்தக் கோப்பினைப் பதிவிறக்கவோ திறக்கவோ வேண்டாம் என Chrome பரிந்துரைக்கிறது.</translation> +<translation id="7951988079884443914">இந்த ஃபைலைப் பதிவிறக்கவோ திறக்கவோ வேண்டாம் என Chrome பரிந்துரைக்கிறது.</translation> <translation id="7962410387636238736">Windows XP மற்றும் Windows Vista ஆகியவை இனி ஆதரிக்கப்படாது என்பதால் இந்தக் கம்ப்யூட்டர் இனி Google Chrome புதுப்பிப்புகளைப் பெறாது</translation> <translation id="79947657522496226"><ph name="BEGIN_LINK_LINUX_OSS" />Linux டெவெலப்மெண்ட் சூழல்<ph name="END_LINK_LINUX_OSS" /> போலவே, கூடுதல் <ph name="BEGIN_LINK_CROS_OSS" />ஓப்பன் சோர்ஸ் மென்பொருளால்<ph name="END_LINK_CROS_OSS" /> Chrome OS உருவாக்கப்பட்டுள்ளது.</translation> <translation id="8008534537613507642">Chrome ஐ மீண்டும்நிறுவு</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 2a38a921..d6c2ef4 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2364,6 +2364,7 @@ "//ash/content/scanning", "//ash/content/scanning/mojom", "//ash/content/shimless_rma", + "//ash/content/shortcut_customization_ui", "//chrome/app/theme:chrome_unscaled_resources_grit", "//chrome/browser/ash/system_extensions", "//chrome/browser/nearby_sharing/common", @@ -2426,7 +2427,7 @@ ] } - if (enable_libassistant_sandbox) { + if (enable_cros_libassistant) { deps += [ "//chromeos/services/libassistant/public/mojom" ] } } @@ -2687,6 +2688,8 @@ "android/feed/v2/background_refresh_task.h", "android/feed/v2/feed_image_fetch_client.cc", "android/feed/v2/feed_persistent_key_value_cache.cc", + "android/feed/v2/feed_reliability_logging_bridge.cc", + "android/feed/v2/feed_reliability_logging_bridge.h", "android/feed/v2/feed_service_bridge.cc", "android/feed/v2/feed_service_bridge.h", "android/feed/v2/feed_service_factory.cc", @@ -4230,6 +4233,7 @@ "//components/accuracy_tips", "//components/constrained_window", "//components/enterprise/common/proto:device_trust_report_event_proto", + "//components/enterprise/common/proto:download_item_reroute_info_proto", "//components/feedback", "//components/feedback/content:factory", "//components/image_fetcher/core", @@ -5436,7 +5440,7 @@ ] } - if (is_android || is_chromeos_ash || is_win) { + if (is_android || is_chromeos || is_win) { sources += [ "media/protected_media_identifier_permission_context.cc", "media/protected_media_identifier_permission_context.h", @@ -6166,6 +6170,7 @@ "pdf/pdf_extension_util.h", ] deps += [ + "//components/pdf/browser:interceptors", "//pdf:buildflags", "//pdf:features", ] @@ -6676,7 +6681,6 @@ deps = [ ":chrome_internal_resources_gen", - "//chrome/browser/resources/browser_switch:web_components", "//chrome/browser/ui/webui/usb_internals:mojo_bindings_webui_js", "//device/bluetooth/public/mojom:deprecated_experimental_interfaces_js", "//device/bluetooth/public/mojom:mojom_js",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index ccb054f6..ec28b16 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2719,6 +2719,20 @@ FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kRelatedSearchesUi, kRelatedSearchesUiVariations, "RelatedSearchesUi")}, + {"related-searches-in-bar", flag_descriptions::kRelatedSearchesInBarName, + flag_descriptions::kRelatedSearchesInBarDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRelatedSearchesInBar)}, + {"related-searches-alternate-ux", + flag_descriptions::kRelatedSearchesAlternateUxName, + flag_descriptions::kRelatedSearchesAlternateUxDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRelatedSearchesAlternateUx)}, + {"related-searches-simplified-ux", + flag_descriptions::kRelatedSearchesSimplifiedUxName, + flag_descriptions::kRelatedSearchesSimplifiedUxDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRelatedSearchesSimplifiedUx)}, + {"single-touch-select", flag_descriptions::kSingleTouchSelectName, + flag_descriptions::kSingleTouchSelectDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kSingleTouchSelect)}, {"bento-offline", flag_descriptions::kBentoOfflineName, flag_descriptions::kBentoOfflineDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kBentoOffline)}, @@ -2791,10 +2805,6 @@ flag_descriptions::kExperimentalWebPlatformFeaturesName, flag_descriptions::kExperimentalWebPlatformFeaturesDescription, kOsAll, SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebPlatformFeatures)}, - {"silent-debugger-extension-api", - flag_descriptions::kSilentDebuggerExtensionApiName, - flag_descriptions::kSilentDebuggerExtensionApiDescription, kOsDesktop, - SINGLE_VALUE_TYPE(switches::kSilentDebuggerExtensionAPI)}, #if BUILDFLAG(ENABLE_SPELLCHECK) && defined(OS_ANDROID) {"enable-android-spellchecker", flag_descriptions::kEnableAndroidSpellcheckerDescription, @@ -3765,9 +3775,6 @@ {"feed-v2-autoplay", flag_descriptions::kInterestFeedV2AutoplayName, flag_descriptions::kInterestFeedV2AutoplayDescription, kOsAndroid, FEATURE_VALUE_TYPE(feed::kInterestFeedV2Autoplay)}, - {"feed-share", flag_descriptions::kFeedShareName, - flag_descriptions::kFeedShareDescription, kOsAndroid, - FEATURE_VALUE_TYPE(feed::kFeedShare)}, {"web-feed", flag_descriptions::kWebFeedName, flag_descriptions::kWebFeedDescription, kOsAndroid, FEATURE_VALUE_TYPE(feed::kWebFeed)}, @@ -7184,6 +7191,10 @@ FEATURE_VALUE_TYPE(arc::kEnableWebAppShareFeature)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) + {"tab-restore-sub-menus", flag_descriptions::kTabRestoreSubMenusName, + flag_descriptions::kTabRestoreSubMenusDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kTabRestoreSubMenus)}, + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/feed/v2/DEPS b/chrome/browser/android/feed/v2/DEPS index f4ea3fe..94215c7 100644 --- a/chrome/browser/android/feed/v2/DEPS +++ b/chrome/browser/android/feed/v2/DEPS
@@ -2,4 +2,7 @@ '.*_[a-z]*test\.cc': [ "+mojo/core/embedder", ], + 'feed_reliability_logging_bridge.cc': [ + '+third_party/abseil-cpp/absl/status/status.h', + ], }
diff --git a/chrome/browser/android/feed/v2/feed_reliability_logging_bridge.cc b/chrome/browser/android/feed/v2/feed_reliability_logging_bridge.cc new file mode 100644 index 0000000..72c8fcf --- /dev/null +++ b/chrome/browser/android/feed/v2/feed_reliability_logging_bridge.cc
@@ -0,0 +1,202 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/feed/v2/feed_reliability_logging_bridge.h" +#include "base/android/jni_android.h" +#include "base/time/time.h" +#include "chrome/browser/feed/android/jni_headers/FeedReliabilityLoggingBridge_jni.h" +#include "net/base/net_errors.h" +#include "net/http/http_status_code.h" +#include "third_party/abseil-cpp/absl/status/status.h" + +namespace feed { +namespace android { +namespace { + +jlong ConvertTimestamp(base::TimeTicks ticks) { + return ticks.since_origin().InNanoseconds(); +} + +// Note: we're using `absl::StatusCode` for logging network request status +// because it is kept in sync with the proto enum `google.rpc.Code`, which is +// the format the server expects and which is less convenient to use here than +// `absl::StatusCode`. +// https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/status/status.h;drc=083488f5118f2ecf1e927925d9b679f21f8541d0;l=83 +// https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto#L32 +absl::StatusCode NetErrorToCanonicalStatus(net::Error net_error) { + switch (net_error) { + case net::ERR_NAME_NOT_RESOLVED: + case net::ERR_INTERNET_DISCONNECTED: + case net::ERR_CONNECTION_REFUSED: + case net::ERR_ADDRESS_UNREACHABLE: + case net::ERR_CONNECTION_CLOSED: + return absl::StatusCode::kUnavailable; + case net::ERR_NETWORK_CHANGED: + case net::ERR_CONNECTION_RESET: + return absl::StatusCode::kAborted; + case net::ERR_TIMED_OUT: + case net::ERR_CONNECTION_TIMED_OUT: + return absl::StatusCode::kDeadlineExceeded; + case net::ERR_QUIC_PROTOCOL_ERROR: + default: + return absl::StatusCode::kInternal; + } +} + +absl::StatusCode HttpStatusToCanonicalStatus(int http_status) { + switch (http_status) { + case net::HTTP_OK: + return absl::StatusCode::kOk; + case net::HTTP_BAD_REQUEST: + return absl::StatusCode::kInvalidArgument; + case net::HTTP_FORBIDDEN: + return absl::StatusCode::kPermissionDenied; + case net::HTTP_NOT_FOUND: + return absl::StatusCode::kNotFound; + case net::HTTP_CONFLICT: + return absl::StatusCode::kAlreadyExists; + case net::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: + return absl::StatusCode::kOutOfRange; + case net::HTTP_TOO_MANY_REQUESTS: + return absl::StatusCode::kResourceExhausted; + case 499: // Client closed request. + return absl::StatusCode::kCancelled; + case net::HTTP_NOT_IMPLEMENTED: + return absl::StatusCode::kUnimplemented; + case net::HTTP_SERVICE_UNAVAILABLE: + return absl::StatusCode::kUnavailable; + case net::HTTP_GATEWAY_TIMEOUT: + return absl::StatusCode::kDeadlineExceeded; + case net::HTTP_UNAUTHORIZED: + return absl::StatusCode::kUnauthenticated; + } + if (http_status >= 200 && http_status < 300) { + return absl::StatusCode::kOk; + } else if (http_status >= 400 && http_status < 500) { + return absl::StatusCode::kFailedPrecondition; + } else if (http_status >= 500 && http_status < 600) { + return absl::StatusCode::kInternal; + } + return absl::StatusCode::kUnknown; +} + +} // namespace + +static jlong JNI_FeedReliabilityLoggingBridge_Init( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_this) { + return reinterpret_cast<intptr_t>(new FeedReliabilityLoggingBridge(j_this)); +} + +FeedReliabilityLoggingBridge::FeedReliabilityLoggingBridge( + const base::android::JavaRef<jobject>& j_this) + : java_ref_(j_this) {} + +FeedReliabilityLoggingBridge::~FeedReliabilityLoggingBridge() = default; + +void FeedReliabilityLoggingBridge::SendPendingLaunchEvents( + StreamType stream_type, + SurfaceId stream_id) { + Java_FeedReliabilityLoggingBridge_sendPendingEvents( + base::android::AttachCurrentThread(), java_ref_, + static_cast<int>(stream_type.GetType()), stream_id.GetUnsafeValue()); +} +void FeedReliabilityLoggingBridge::CancelPendingLaunchEvents() { + Java_FeedReliabilityLoggingBridge_cancelPendingEvents( + base::android::AttachCurrentThread(), java_ref_); +} + +void FeedReliabilityLoggingBridge::LogCacheReadStart( + base::TimeTicks timestamp) { + Java_FeedReliabilityLoggingBridge_logCacheReadStart( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp)); +} + +void FeedReliabilityLoggingBridge::LogCacheReadEnd( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverCardReadCacheResult result) { + Java_FeedReliabilityLoggingBridge_logCacheReadEnd( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp), result); +} + +int FeedReliabilityLoggingBridge::LogFeedRequestStart( + base::TimeTicks timestamp) { + return Java_FeedReliabilityLoggingBridge_logFeedRequestStart( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp)); +} + +int FeedReliabilityLoggingBridge::LogActionsUploadRequestStart( + base::TimeTicks timestamp) { + return Java_FeedReliabilityLoggingBridge_logActionsUploadRequestStart( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp)); +} + +void FeedReliabilityLoggingBridge::LogRequestSent(int request_id, + base::TimeTicks timestamp) { + Java_FeedReliabilityLoggingBridge_logRequestSent( + base::android::AttachCurrentThread(), java_ref_, request_id, + ConvertTimestamp(timestamp)); +} + +void FeedReliabilityLoggingBridge::LogResponseReceived( + int request_id, + base::TimeTicks server_receive_timestamp, + base::TimeTicks server_send_timestamp, + base::TimeTicks client_receive_timestamp) { + Java_FeedReliabilityLoggingBridge_logResponseReceived( + base::android::AttachCurrentThread(), java_ref_, request_id, + ConvertTimestamp(server_receive_timestamp), + ConvertTimestamp(server_send_timestamp), + ConvertTimestamp(client_receive_timestamp)); +} + +void FeedReliabilityLoggingBridge::LogRequestFinished( + int request_id, + base::TimeTicks timestamp, + int combined_network_status_code) { + absl::StatusCode canonical_code; + if (combined_network_status_code >= 0) { + canonical_code = HttpStatusToCanonicalStatus(combined_network_status_code); + } else { + canonical_code = NetErrorToCanonicalStatus( + static_cast<net::Error>(combined_network_status_code)); + } + Java_FeedReliabilityLoggingBridge_logRequestFinished( + base::android::AttachCurrentThread(), java_ref_, request_id, + ConvertTimestamp(timestamp), static_cast<int>(canonical_code)); +} + +void FeedReliabilityLoggingBridge::LogLaunchFinished( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverLaunchResult result) { + Java_FeedReliabilityLoggingBridge_logLaunchFinished( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp), result); +} + +void FeedReliabilityLoggingBridge::LogAtfRenderStart( + base::TimeTicks timestamp) { + Java_FeedReliabilityLoggingBridge_logAtfRenderStart( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp)); +} + +void FeedReliabilityLoggingBridge::LogAtfRenderEnd( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverAboveTheFoldRenderResult result) { + Java_FeedReliabilityLoggingBridge_logAtfRenderEnd( + base::android::AttachCurrentThread(), java_ref_, + ConvertTimestamp(timestamp), result); +} + +void FeedReliabilityLoggingBridge::Destroy(JNIEnv* env) { + delete this; +} + +} // namespace android +} // namespace feed
diff --git a/chrome/browser/android/feed/v2/feed_reliability_logging_bridge.h b/chrome/browser/android/feed/v2/feed_reliability_logging_bridge.h new file mode 100644 index 0000000..8ff11d5 --- /dev/null +++ b/chrome/browser/android/feed/v2/feed_reliability_logging_bridge.h
@@ -0,0 +1,63 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_FEED_V2_FEED_RELIABILITY_LOGGING_BRIDGE_H_ +#define CHROME_BROWSER_ANDROID_FEED_V2_FEED_RELIABILITY_LOGGING_BRIDGE_H_ + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" + +#include "base/time/time.h" +#include "components/feed/core/proto/v2/wire/reliability_logging_enums.pb.h" +#include "components/feed/core/v2/public/reliability_logger.h" + +namespace feed { +namespace android { + +class FeedReliabilityLoggingBridge : public ::feed::ReliabilityLogger { + public: + explicit FeedReliabilityLoggingBridge( + const base::android::JavaRef<jobject>& j_this); + FeedReliabilityLoggingBridge(const FeedReliabilityLoggingBridge&) = delete; + FeedReliabilityLoggingBridge& operator=(const FeedReliabilityLoggingBridge&) = + delete; + ~FeedReliabilityLoggingBridge() override; + + // Called by Java to delete this object. + void Destroy(JNIEnv* env); + + // ::feed::ReliabilityLogger implementation. + void SendPendingLaunchEvents(StreamType stream_type, + SurfaceId stream_id) override; + void CancelPendingLaunchEvents() override; + void LogCacheReadStart(base::TimeTicks timestamp) override; + void LogCacheReadEnd( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverCardReadCacheResult result) override; + int LogFeedRequestStart(base::TimeTicks timestamp) override; + int LogActionsUploadRequestStart(base::TimeTicks timestamp) override; + void LogRequestSent(int request_id, base::TimeTicks timestamp) override; + void LogResponseReceived(int request_id, + base::TimeTicks server_receive_timestamp, + base::TimeTicks server_send_timestamp, + base::TimeTicks client_receive_timestamp) override; + void LogRequestFinished(int request_id, + base::TimeTicks timestamp, + int combined_network_status_code) override; + void LogAtfRenderStart(base::TimeTicks timestamp) override; + void LogAtfRenderEnd( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverAboveTheFoldRenderResult result) override; + void LogLaunchFinished( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverLaunchResult result) override; + + private: + base::android::ScopedJavaGlobalRef<jobject> java_ref_; +}; + +} // namespace android +} // namespace feed + +#endif // CHROME_BROWSER_ANDROID_FEED_V2_FEED_RELIABILITY_LOGGING_BRIDGE_H_
diff --git a/chrome/browser/android/feed/v2/feed_stream.cc b/chrome/browser/android/feed/v2/feed_stream.cc index 77b514b..0cc3ea2 100644 --- a/chrome/browser/android/feed/v2/feed_stream.cc +++ b/chrome/browser/android/feed/v2/feed_stream.cc
@@ -13,6 +13,7 @@ #include "base/android/jni_string.h" #include "base/strings/string_piece.h" #include "chrome/android/chrome_jni_headers/FeedStream_jni.h" +#include "chrome/browser/android/feed/v2/feed_reliability_logging_bridge.h" #include "chrome/browser/android/feed/v2/feed_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -33,15 +34,21 @@ static jlong JNI_FeedStream_Init(JNIEnv* env, const JavaParamRef<jobject>& j_this, - jboolean is_for_you_stream) { - return reinterpret_cast<intptr_t>(new FeedStream(j_this, is_for_you_stream)); + jboolean is_for_you_stream, + jlong native_feed_reliability_logging_bridge) { + return reinterpret_cast<intptr_t>( + new FeedStream(j_this, is_for_you_stream, + reinterpret_cast<FeedReliabilityLoggingBridge*>( + native_feed_reliability_logging_bridge))); } FeedStream::FeedStream(const JavaRef<jobject>& j_this, - jboolean is_for_you_stream) + jboolean is_for_you_stream, + FeedReliabilityLoggingBridge* reliability_logger) : ::feed::FeedStreamSurface(is_for_you_stream ? kForYouStream : kWebFeedStream), - feed_stream_api_(nullptr) { + feed_stream_api_(nullptr), + reliability_logging_bridge_(reliability_logger) { java_ref_.Reset(j_this); FeedService* service = FeedServiceFactory::GetForBrowserContext( @@ -56,6 +63,10 @@ feed_stream_api_->DetachSurface(this); } +ReliabilityLogger* FeedStream::GetReliabilityLogger() { + return reliability_logging_bridge_; +} + void FeedStream::StreamUpdate(const feedui::StreamUpdate& stream_update) { JNIEnv* env = base::android::AttachCurrentThread(); int32_t data_size = stream_update.ByteSize();
diff --git a/chrome/browser/android/feed/v2/feed_stream.h b/chrome/browser/android/feed/v2/feed_stream.h index 5585004..51354f19 100644 --- a/chrome/browser/android/feed/v2/feed_stream.h +++ b/chrome/browser/android/feed/v2/feed_stream.h
@@ -8,6 +8,7 @@ #include "base/android/jni_android.h" #include "base/android/scoped_java_ref.h" #include "base/macros.h" +#include "chrome/browser/android/feed/v2/feed_reliability_logging_bridge.h" #include "components/feed/core/v2/public/feed_api.h" #include "components/feed/core/v2/public/feed_stream_surface.h" @@ -23,7 +24,8 @@ class FeedStream : public ::feed::FeedStreamSurface { public: explicit FeedStream(const base::android::JavaRef<jobject>& j_this, - jboolean is_for_you_stream); + jboolean is_for_you_stream, + FeedReliabilityLoggingBridge* reliability_logger); FeedStream(const FeedStream&) = delete; FeedStream& operator=(const FeedStream&) = delete; @@ -35,6 +37,8 @@ base::StringPiece data) override; void RemoveDataStoreEntry(base::StringPiece key) override; + ReliabilityLogger* GetReliabilityLogger() override; + void OnStreamUpdated(const feedui::StreamUpdate& stream_update); void LoadMore(JNIEnv* env, @@ -107,6 +111,7 @@ base::android::ScopedJavaGlobalRef<jobject> java_ref_; FeedApi* feed_stream_api_; bool attached_ = false; + FeedReliabilityLoggingBridge* reliability_logging_bridge_ = nullptr; }; } // namespace android
diff --git a/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service.cc b/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service.cc index b44a28d..817eb61 100644 --- a/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service.cc +++ b/chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_service.cc
@@ -16,7 +16,6 @@ #include "base/command_line.h" #include "base/logging.h" #include "base/memory/singleton.h" -#include "base/metrics/histogram_macros.h" #include "base/strings/string_piece.h" #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/arc/input_method_manager/arc_input_method_manager_bridge_impl.h" @@ -486,8 +485,6 @@ // If the active input method is changed, call InputMethodChanged() here. if (active_ime_id != state->GetCurrentInputMethod().id()) InputMethodChanged(InputMethodManager::Get(), nullptr, false); - - UMA_HISTOGRAM_COUNTS_100("Arc.ImeCount", installed_imes.size()); } void ArcInputMethodManagerService::OnConnectionClosed() {
diff --git a/chrome/browser/ash/arc/input_method_manager/arc_input_method_state.cc b/chrome/browser/ash/arc/input_method_manager/arc_input_method_state.cc index 9563d86..00518ede 100644 --- a/chrome/browser/ash/arc/input_method_manager/arc_input_method_state.cc +++ b/chrome/browser/ash/arc/input_method_manager/arc_input_method_state.cc
@@ -10,6 +10,7 @@ #include "ash/public/cpp/keyboard/keyboard_switches.h" #include "ash/public/cpp/tablet_mode.h" #include "base/command_line.h" +#include "base/metrics/histogram_macros.h" #include "components/arc/mojom/input_method_manager.mojom.h" #include "components/prefs/pref_service.h" #include "mojo/public/cpp/bindings/struct_ptr.h" @@ -27,6 +28,9 @@ void ArcInputMethodState::InitializeWithImeInfo( const std::string& proxy_ime_extension_id, const std::vector<mojom::ImeInfoPtr>& ime_info_array) { + if (ime_info_array.size() != installed_imes_.size()) + UMA_HISTOGRAM_COUNTS_100("Arc.ImeCount", ime_info_array.size()); + installed_imes_.clear(); for (const auto& info : ime_info_array) { installed_imes_.push_back({info->ime_id, info->enabled,
diff --git a/chrome/browser/ash/arc/input_method_manager/arc_input_method_state_unittest.cc b/chrome/browser/ash/arc/input_method_manager/arc_input_method_state_unittest.cc index 09fabd7..db95e106 100644 --- a/chrome/browser/ash/arc/input_method_manager/arc_input_method_state_unittest.cc +++ b/chrome/browser/ash/arc/input_method_manager/arc_input_method_state_unittest.cc
@@ -8,6 +8,7 @@ #include "ash/public/cpp/tablet_mode.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "chrome/test/base/testing_profile.h" #include "components/arc/mojom/input_method_manager.mojom.h" #include "content/public/test/browser_task_environment.h" @@ -108,4 +109,24 @@ EXPECT_EQ("ime_a", state.GetActiveInputMethods()[0].id()); } +TEST(ArcInputMethodState, Histogram) { + base::HistogramTester histogram_tester; + constexpr char kHistogramName[] = "Arc.ImeCount"; + + FakeDelegate delegate; + + ArcInputMethodState state(&delegate); + std::vector<mojom::ImeInfoPtr> imes; + imes.push_back(GenerateImeInfo("ime_a", true, true)); + imes.push_back(GenerateImeInfo("ime_b", true, false)); + state.InitializeWithImeInfo("ime_id", imes); + + histogram_tester.ExpectTotalCount(kHistogramName, 1); + histogram_tester.ExpectUniqueSample(kHistogramName, imes.size(), 1); + + imes.clear(); + state.InitializeWithImeInfo("ime_id", imes); + histogram_tester.ExpectTotalCount(kHistogramName, 2); +} + } // namespace arc
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index a7cee8a..c538d0cd 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -65,6 +65,8 @@ "metrics_reporting_ash.h", "native_theme_service_ash.cc", "native_theme_service_ash.h", + "power_ash.cc", + "power_ash.h", "prefs_ash.cc", "prefs_ash.h", "remoting_ash.cc", @@ -136,6 +138,7 @@ "//printing:printing", "//printing:printing_base", "//remoting/host/chromeos:remoting_service", + "//services/device/wake_lock/power_save_blocker", "//ui/message_center", "//ui/message_center/public/cpp", "//ui/shell_dialogs",
diff --git a/chrome/browser/ash/crosapi/DEPS b/chrome/browser/ash/crosapi/DEPS index e8cc89ba..0ab886cc 100644 --- a/chrome/browser/ash/crosapi/DEPS +++ b/chrome/browser/ash/crosapi/DEPS
@@ -6,6 +6,9 @@ "+chrome/browser/ash/crosapi", "+ui/message_center/message_center.h", ], + "power_ash\.cc": [ + "+services/device/wake_lock/power_save_blocker/power_save_blocker.h", + ], "remoting_ash\.cc": [ # For remote support functionality. "+remoting/host/chromeos/remote_support_host_ash.h",
diff --git a/chrome/browser/ash/crosapi/browser_util.cc b/chrome/browser/ash/crosapi/browser_util.cc index 8d8a4c0..bfcd180 100644 --- a/chrome/browser/ash/crosapi/browser_util.cc +++ b/chrome/browser/ash/crosapi/browser_util.cc
@@ -55,6 +55,7 @@ #include "chromeos/crosapi/mojom/local_printer.mojom.h" #include "chromeos/crosapi/mojom/message_center.mojom.h" #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" +#include "chromeos/crosapi/mojom/power.mojom.h" #include "chromeos/crosapi/mojom/prefs.mojom.h" #include "chromeos/crosapi/mojom/remoting.mojom.h" #include "chromeos/crosapi/mojom/screen_manager.mojom.h" @@ -236,6 +237,7 @@ MakeInterfaceVersionEntry<crosapi::mojom::MessageCenter>(), MakeInterfaceVersionEntry<crosapi::mojom::MetricsReporting>(), MakeInterfaceVersionEntry<crosapi::mojom::NativeThemeService>(), + MakeInterfaceVersionEntry<crosapi::mojom::Power>(), MakeInterfaceVersionEntry<crosapi::mojom::Prefs>(), MakeInterfaceVersionEntry<crosapi::mojom::Remoting>(), MakeInterfaceVersionEntry<crosapi::mojom::ScreenManager>(), @@ -267,7 +269,7 @@ } static_assert( - crosapi::mojom::Crosapi::Version_ == 34, + crosapi::mojom::Crosapi::Version_ == 35, "if you add a new crosapi, please add it to kInterfaceVersionEntries"); static_assert(!HasDuplicatedUuid(), "Each Crosapi Mojom interface should have unique UUID.");
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc index 5c5f61a..aa1d735 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.cc +++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -32,6 +32,7 @@ #include "chrome/browser/ash/crosapi/message_center_ash.h" #include "chrome/browser/ash/crosapi/metrics_reporting_ash.h" #include "chrome/browser/ash/crosapi/native_theme_service_ash.h" +#include "chrome/browser/ash/crosapi/power_ash.h" #include "chrome/browser/ash/crosapi/prefs_ash.h" #include "chrome/browser/ash/crosapi/remoting_ash.h" #include "chrome/browser/ash/crosapi/screen_manager_ash.h" @@ -107,6 +108,7 @@ metrics_reporting_ash_(std::make_unique<MetricsReportingAsh>( g_browser_process->local_state())), native_theme_service_ash_(std::make_unique<NativeThemeServiceAsh>()), + power_ash_(std::make_unique<PowerAsh>()), prefs_ash_( std::make_unique<PrefsAsh>(g_browser_process->profile_manager(), g_browser_process->local_state())), @@ -309,6 +311,10 @@ std::move(remote)); } +void CrosapiAsh::BindPower(mojo::PendingReceiver<mojom::Power> receiver) { + power_ash_->BindReceiver(std::move(receiver)); +} + void CrosapiAsh::BindPrefs(mojo::PendingReceiver<mojom::Prefs> receiver) { prefs_ash_->BindReceiver(std::move(receiver)); }
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h index 3f30f43..65ce4dcad 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.h +++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -35,6 +35,7 @@ class MessageCenterAsh; class MetricsReportingAsh; class NativeThemeServiceAsh; +class PowerAsh; class PrefsAsh; class RemotingAsh; class ScreenManagerAsh; @@ -97,6 +98,7 @@ mojo::PendingReceiver<mojom::MetricsReporting> receiver) override; void BindNativeThemeService( mojo::PendingReceiver<mojom::NativeThemeService> receiver) override; + void BindPower(mojo::PendingReceiver<mojom::Power> receiver) override; void BindPrefs(mojo::PendingReceiver<mojom::Prefs> receiver) override; void BindRemoting(mojo::PendingReceiver<mojom::Remoting> receiver) override; void BindScreenManager( @@ -180,6 +182,7 @@ std::unique_ptr<MessageCenterAsh> message_center_ash_; std::unique_ptr<MetricsReportingAsh> metrics_reporting_ash_; std::unique_ptr<NativeThemeServiceAsh> native_theme_service_ash_; + std::unique_ptr<PowerAsh> power_ash_; std::unique_ptr<PrefsAsh> prefs_ash_; std::unique_ptr<RemotingAsh> remoting_ash_; std::unique_ptr<ScreenManagerAsh> screen_manager_ash_;
diff --git a/chrome/browser/ash/crosapi/power_ash.cc b/chrome/browser/ash/crosapi/power_ash.cc new file mode 100644 index 0000000..263f81d0 --- /dev/null +++ b/chrome/browser/ash/crosapi/power_ash.cc
@@ -0,0 +1,45 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/crosapi/power_ash.h" + +#include <utility> + +#include "base/bind.h" +#include "base/sequenced_task_runner.h" +#include "base/single_thread_task_runner.h" +#include "base/task/thread_pool.h" +#include "services/device/wake_lock/power_save_blocker/power_save_blocker.h" + +namespace crosapi { + +PowerAsh::PowerAsh() + : main_task_runner_(base::ThreadTaskRunnerHandle::Get()), + file_task_runner_(base::ThreadPool::CreateSingleThreadTaskRunner( + {base::MayBlock(), base::TaskPriority::BEST_EFFORT})) { + lock_set_.set_disconnect_handler(base::BindRepeating( + &PowerAsh::OnLockDisconnect, weak_ptr_factory_.GetWeakPtr())); +} + +PowerAsh::~PowerAsh() = default; + +void PowerAsh::BindReceiver(mojo::PendingReceiver<mojom::Power> receiver) { + receivers_.Add(this, std::move(receiver)); +} + +void PowerAsh::AddPowerSaveBlocker( + mojo::PendingRemote<mojom::PowerWakeLock> lock, + device::mojom::WakeLockType type, + device::mojom::WakeLockReason reason, + const std::string& description) { + mojo::RemoteSetElementId id = lock_set_.Add(std::move(lock)); + power_save_blockers_[id] = std::make_unique<device::PowerSaveBlocker>( + type, reason, description, main_task_runner_, file_task_runner_); +} + +void PowerAsh::OnLockDisconnect(mojo::RemoteSetElementId id) { + power_save_blockers_.erase(id); +} + +} // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/power_ash.h b/chrome/browser/ash/crosapi/power_ash.h new file mode 100644 index 0000000..6090be6 --- /dev/null +++ b/chrome/browser/ash/crosapi/power_ash.h
@@ -0,0 +1,74 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_CROSAPI_POWER_ASH_H_ +#define CHROME_BROWSER_ASH_CROSAPI_POWER_ASH_H_ + +#include <stdint.h> + +#include <map> +#include <memory> +#include <string> + +#include "base/memory/weak_ptr.h" +#include "chromeos/crosapi/mojom/power.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver_set.h" +#include "mojo/public/cpp/bindings/remote_set.h" +#include "services/device/public/mojom/wake_lock.mojom.h" + +namespace base { +class SequencedTaskRunner; +class SingleThreadTaskRunner; +} // namespace base + +namespace device { +class PowerSaveBlocker; +} // namespace device + +namespace crosapi { + +// The ash-chrome implementation of the Power crosapi interface. +class PowerAsh : public mojom::Power { + public: + PowerAsh(); + PowerAsh(const PowerAsh&) = delete; + PowerAsh& operator=(const PowerAsh&) = delete; + ~PowerAsh() override; + + void BindReceiver(mojo::PendingReceiver<mojom::Power> receiver); + + // crosapi::mojom::Power: + void AddPowerSaveBlocker(mojo::PendingRemote<mojom::PowerWakeLock> lock, + device::mojom::WakeLockType type, + device::mojom::WakeLockReason reason, + const std::string& description) override; + + private: + // Handlers for disconnection of |lock| from AddPowerSaveBlocker(), + void OnLockDisconnect(mojo::RemoteSetElementId id); + + // Support any number of connections. + mojo::ReceiverSet<mojom::Power> receivers_; + + // Keeps track of |lock| passed by AddPowerSaveBlocker(), allowing + // disconnection to be detected. + mojo::RemoteSet<mojom::PowerWakeLock> lock_set_; + + // Storage of device::PowerSaveBlocker instances, keyed by + // mojo::RemoteSetElementId in |lock_set_|. + std::map<mojo::RemoteSetElementId, std::unique_ptr<device::PowerSaveBlocker>> + power_save_blockers_; + + // Task runners needed by device::PowerSaveBlocker. + scoped_refptr<base::SequencedTaskRunner> main_task_runner_; + scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; + + base::WeakPtrFactory<PowerAsh> weak_ptr_factory_{this}; +}; + +} // namespace crosapi + +#endif // CHROME_BROWSER_ASH_CROSAPI_POWER_ASH_H_
diff --git a/chrome/browser/ash/login/active_directory_login_browsertest.cc b/chrome/browser/ash/login/active_directory_login_browsertest.cc index 2d1bcc70..9f3a0c1 100644 --- a/chrome/browser/ash/login/active_directory_login_browsertest.cc +++ b/chrome/browser/ash/login/active_directory_login_browsertest.cc
@@ -110,6 +110,7 @@ ad_login_.TestDomainHidden(); ad_login_.SubmitActiveDirectoryCredentials(test_user_, kPassword); test::WaitForPrimaryUserSessionStart(); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); } // Tests that the Kerberos SSO environment variables are set correctly after @@ -119,6 +120,7 @@ ad_login_.TestDomainHidden(); ad_login_.SubmitActiveDirectoryCredentials(test_user_, kPassword); test::WaitForPrimaryUserSessionStart(); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); base::FilePath dir; base::PathService::Get(base::DIR_HOME, &dir); @@ -150,17 +152,21 @@ ad_login_.TestUserError(); ad_login_.TestDomainHidden(); + // Password rejected by AuthPolicyClient. The fake client stores the received + // password regardless of the auth error. fake_authpolicy_client()->set_auth_error(authpolicy::ERROR_BAD_USER_NAME); ad_login_.SubmitActiveDirectoryCredentials(test_user_, kPassword); ad_login_.WaitForAuthError(); ad_login_.TestUserError(); ad_login_.TestDomainHidden(); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); fake_authpolicy_client()->set_auth_error(authpolicy::ERROR_BAD_PASSWORD); ad_login_.SubmitActiveDirectoryCredentials(test_user_, kPassword); ad_login_.WaitForAuthError(); ad_login_.TestPasswordError(); ad_login_.TestDomainHidden(); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); fake_authpolicy_client()->set_auth_error(authpolicy::ERROR_UNKNOWN); ad_login_.SubmitActiveDirectoryCredentials(test_user_, kPassword); @@ -172,6 +178,7 @@ // Inputs are not invalidated for the unknown error. ad_login_.TestNoError(); ad_login_.TestDomainHidden(); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); } // Test back button clears the input and error from the login screen. @@ -205,6 +212,11 @@ ad_login_.SubmitActiveDirectoryPasswordChangeCredentials( kPassword, kNewPassword, kNewPassword); test::WaitForPrimaryUserSessionStart(); + + // Samba library requires all three fields in the format below in a file. The + // concatenation is made in chrome side, before it's sent to the daemon. + EXPECT_EQ(std::string(kPassword) + "\n" + kNewPassword + "\n" + kNewPassword, + fake_authpolicy_client()->auth_password()); } // Test different UI errors for Active Directory password change screen. @@ -233,11 +245,17 @@ kPassword, kNewPassword, kDifferentNewPassword); ad_login_.TestPasswordChangeConfirmNewPasswordError(); - // Password rejected by AuthPolicyClient. + // Password rejected by AuthPolicyClient. The fake client stores the received + // password regardless of the auth error. fake_authpolicy_client()->set_auth_error(authpolicy::ERROR_BAD_PASSWORD); ad_login_.SubmitActiveDirectoryPasswordChangeCredentials( kPassword, kNewPassword, kNewPassword); ad_login_.TestPasswordChangeOldPasswordError(); + + // Samba library requires all three fields in the format below in a file. The + // concatenation is made in chrome side, before it's sent to the daemon. + EXPECT_EQ(std::string(kPassword) + "\n" + kNewPassword + "\n" + kNewPassword, + fake_authpolicy_client()->auth_password()); } // Test reopening Active Directory password change screen clears errors. @@ -268,6 +286,7 @@ ad_login_.SubmitActiveDirectoryCredentials(kTestActiveDirectoryUser, kPassword); test::WaitForPrimaryUserSessionStart(); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); } // Tests that user could override autocomplete domain. @@ -276,29 +295,34 @@ ad_login_.TestLoginVisible(); ad_login_.TestDomainVisible(); + + // Password rejected by AuthPolicyClient. The fake client stores the received + // password regardless of the auth error. fake_authpolicy_client()->set_auth_error(authpolicy::ERROR_BAD_PASSWORD); // Submit with a different domain. ad_login_.SetUserInput(test_user_); ad_login_.TestDomainHidden(); ad_login_.TestUserInput(test_user_); - ad_login_.SubmitActiveDirectoryCredentials(test_user_, "password"); + ad_login_.SubmitActiveDirectoryCredentials(test_user_, kPassword); ad_login_.WaitForAuthError(); ad_login_.TestLoginVisible(); ad_login_.TestDomainHidden(); ad_login_.TestUserInput(test_user_); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); - // Set userinput with the autocomplete domain. JS will remove the autocomplete - // domain. + // Set user input with the autocomplete domain. JS will remove the + // autocomplete domain. ad_login_.SetUserInput(kTestActiveDirectoryUser + autocomplete_realm_); ad_login_.TestDomainVisible(); ad_login_.TestUserInput(kTestActiveDirectoryUser); ad_login_.SubmitActiveDirectoryCredentials( - kTestActiveDirectoryUser + autocomplete_realm_, "password"); + kTestActiveDirectoryUser + autocomplete_realm_, kPassword); ad_login_.WaitForAuthError(); ad_login_.TestLoginVisible(); ad_login_.TestDomainVisible(); ad_login_.TestUserInput(kTestActiveDirectoryUser); + EXPECT_EQ(kPassword, fake_authpolicy_client()->auth_password()); } } // namespace chromeos
diff --git a/chrome/browser/ash/login/screens/os_install_screen_browsertest.cc b/chrome/browser/ash/login/screens/os_install_screen_browsertest.cc index bad7cc70..fab84bcf 100644 --- a/chrome/browser/ash/login/screens/os_install_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/os_install_screen_browsertest.cc
@@ -23,10 +23,33 @@ const test::UIPath kOsInstallConfirmNextButton = {"os-install", "osInstallConfirmNextButton"}; +const test::UIPath kOsInstallDialogIntro = {"os-install", + "osInstallDialogIntro"}; +const test::UIPath kOsInstallDialogConfirm = {"os-install", + "osInstallDialogConfirm"}; +const test::UIPath kOsInstallDialogInProgress = {"os-install", + "osInstallDialogInProgress"}; +const test::UIPath kOsInstallDialogError = {"os-install", + "osInstallDialogError"}; +const test::UIPath kOsInstallDialogSuccess = {"os-install", + "osInstallDialogSuccess"}; + } // namespace -class OsInstallScreenTest : public OobeBaseTest { +class OsInstallScreenTest : public OobeBaseTest, OsInstallClient::Observer { public: + void SetUpOnMainThread() override { + OobeBaseTest::SetUpOnMainThread(); + + OsInstallClient::Get()->AddObserver(this); + } + + void TearDownOnMainThread() override { + OobeBaseTest::TearDownOnMainThread(); + + OsInstallClient::Get()->RemoveObserver(this); + } + void SetUpCommandLine(base::CommandLine* command_line) override { OobeBaseTest::SetUpCommandLine(command_line); command_line->AppendSwitch(switches::kAllowOsInstall); @@ -36,7 +59,33 @@ OobeScreenWaiter(WelcomeView::kScreenId).Wait(); test::OobeJS().TapOnPath(kOsInstallButton); OobeScreenWaiter(OsInstallScreenView::kScreenId).Wait(); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogIntro); } + + void AdvanceThroughIntroStep() { + test::OobeJS().ExpectVisiblePath(kOsInstallDialogIntro); + + test::OobeJS().TapOnPath(kOsInstallIntroNextButton); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogConfirm); + } + + void ConfirmInstallation() { + test::OobeJS().ExpectVisiblePath(kOsInstallDialogConfirm); + + test::OobeJS().TapOnPath(kOsInstallConfirmNextButton); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogInProgress); + } + + absl::optional<OsInstallClient::Status> GetStatus() const { return status_; } + + private: + // OsInstallClient::Observer override: + void StatusChanged(OsInstallClient::Status status, + const std::string& service_log) override { + status_ = status; + } + + absl::optional<OsInstallClient::Status> status_ = absl::nullopt; }; // If the kAllowOsInstall switch is not set, the welcome screen should @@ -57,19 +106,53 @@ test::OobeJS().ExpectVisiblePath(kOsInstallButton); } -// Clicking the next buttons should advance from the intro step to the -// confirm step, then to the in-progress step. -IN_PROC_BROWSER_TEST_F(OsInstallScreenTest, OsInstallSteps) { - const std::string current_step = "login.OsInstallScreen.currentUIStep()"; - +// Check that installation starts after clicking next on the confirm step. +IN_PROC_BROWSER_TEST_F(OsInstallScreenTest, StartOsInstall) { AdvanceToOsInstallScreen(); - test::OobeJS().ExpectEQ(current_step, std::string("intro")); + AdvanceThroughIntroStep(); - test::OobeJS().TapOnPath(kOsInstallIntroNextButton); - test::OobeJS().ExpectEQ(current_step, std::string("confirm")); + EXPECT_EQ(GetStatus(), absl::nullopt); test::OobeJS().TapOnPath(kOsInstallConfirmNextButton); - test::OobeJS().ExpectEQ(current_step, std::string("in_progress")); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogInProgress); + + EXPECT_EQ(GetStatus(), OsInstallClient::Status::InProgress); +} + +// Check that if no destination device is found, the error step is shown. +IN_PROC_BROWSER_TEST_F(OsInstallScreenTest, OsInstallNoDestinationDevice) { + auto* ti = OsInstallClient::Get()->GetTestInterface(); + + AdvanceToOsInstallScreen(); + AdvanceThroughIntroStep(); + ConfirmInstallation(); + + ti->UpdateStatus(OsInstallClient::Status::NoDestinationDeviceFound); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogError); +} + +// Check that a generic install error shows the error step. +IN_PROC_BROWSER_TEST_F(OsInstallScreenTest, OsInstallGenericError) { + auto* ti = OsInstallClient::Get()->GetTestInterface(); + + AdvanceToOsInstallScreen(); + AdvanceThroughIntroStep(); + ConfirmInstallation(); + + ti->UpdateStatus(OsInstallClient::Status::Failed); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogError); +} + +// Check that a successful install shows the success step. +IN_PROC_BROWSER_TEST_F(OsInstallScreenTest, OsInstallSuccess) { + auto* ti = OsInstallClient::Get()->GetTestInterface(); + + AdvanceToOsInstallScreen(); + AdvanceThroughIntroStep(); + ConfirmInstallation(); + + ti->UpdateStatus(OsInstallClient::Status::Succeeded); + test::OobeJS().ExpectVisiblePath(kOsInstallDialogSuccess); } } // namespace chromeos
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 828ad358..5bed9a5 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -41,13 +41,6 @@ <include name="IDR_DISCARDS_SITE_DATA_MOJOM_WEBUI_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ui\webui\discards\site_data.mojom-webui.js" use_base_dir="false" type="BINDATA" /> <include name="IDR_DISCARDS_SORTED_TABLE_BEHAVIOR_JS" file="resources\discards\sorted_table_behavior.js" type="BINDATA" /> </if> - <if expr="is_win or is_macosx or (is_linux and not chromeos)"> - <include name="IDR_BROWSER_SWITCH_APP_JS" file="${root_gen_dir}\chrome\browser\resources\browser_switch\app.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_BROWSER_SWITCH_PROXY_JS" file="resources\browser_switch\browser_switch_proxy.js" type="BINDATA" /> - <include name="IDR_BROWSER_SWITCH_HTML" file="resources\browser_switch\browser_switch.html" allowexternalscript="true" type="BINDATA" /> - <include name="IDR_BROWSER_SWITCH_INTERNALS_HTML" file="resources\browser_switch\internals\browser_switch_internals.html" allowexternalscript="true" type="BINDATA" /> - <include name="IDR_BROWSER_SWITCH_INTERNALS_JS" file="resources\browser_switch\internals\browser_switch_internals.js" type="BINDATA" /> - </if> <if expr="is_win"> <include name="IDR_ABOUT_CONFLICTS_HTML" file="resources\conflicts\about_conflicts.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" /> <include name="IDR_ABOUT_CONFLICTS_JS" file="resources\conflicts\about_conflicts.js" type="BINDATA" />
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 3415e31..1f86a30 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -1582,14 +1582,19 @@ *UrlLanguageHistogramFactory::GetForBrowserContext(profile_)); #endif // BUILDFLAG(IS_CHROMEOS_ASH) -// On mobile, need for clean shutdown arises only when the application comes -// to foreground (i.e. MetricsService::OnAppEnterForeground is called). -// http://crbug.com/179143 +// On mobile, the need for a clean shutdown arises only when the application +// comes to the foreground (i.e. when MetricsService::OnAppEnterForeground() is +// called). See crbug.com/179143 for more details. #if !defined(OS_ANDROID) // Start watching for a hang. // + // Depending on the client's ExtendedVariationsSafeMode experiment group (see + // MaybeExtendVariationsSafeMode() in variations_field_trial_creator.cc for + // more info), signaling that a clean shutdown is needed may occur earlier on + // desktop. + // // TODO(b/184937096): Remove the below call and remove the function - // MetricsService::LogNeedForCleanShutdown() once this is moved earlier. It + // MetricsService::LogNeedForCleanShutdown() if this is moved earlier. It is // is being kept here for the time being for the control group of the // extended Variations Safe Mode experiment. browser_process_->metrics_service()->LogNeedForCleanShutdown();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 7b21064f..8e58518 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -615,6 +615,10 @@ #include "chrome/browser/plugins/plugin_response_interceptor_url_loader_throttle.h" #endif +#if BUILDFLAG(ENABLE_PDF) +#include "components/pdf/browser/pdf_navigation_throttle.h" +#endif // BUILDFLAG(ENABLE_PDF) + #if BUILDFLAG(ENABLE_SUPERVISED_USERS) #include "chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.h" #endif @@ -4099,6 +4103,10 @@ MaybeAddThrottle(PDFIFrameNavigationThrottle::MaybeCreateThrottleFor(handle), &throttles); +#if BUILDFLAG(ENABLE_PDF) + MaybeAddThrottle(pdf::PdfNavigationThrottle::MaybeCreateThrottleFor(handle), + &throttles); +#endif // BUILDFLAG(ENABLE_PDF) MaybeAddThrottle(TabUnderNavigationThrottle::MaybeCreate(handle), &throttles);
diff --git a/chrome/browser/chromeos/service_sandbox_type.h b/chrome/browser/chromeos/service_sandbox_type.h index 7028efd..c92d707 100644 --- a/chrome/browser/chromeos/service_sandbox_type.h +++ b/chrome/browser/chromeos/service_sandbox_type.h
@@ -13,21 +13,6 @@ // This file maps service classes to sandbox types. See // ServiceProcessHost::Launch() for how these templates are consumed. -// chromeos::assistant::mojom::AssistantAudioDecoderFactory -namespace chromeos { -namespace assistant { -namespace mojom { -class AssistantAudioDecoderFactory; -} // namespace mojom -} // namespace assistant -} // namespace chromeos - -template <> -inline sandbox::policy::SandboxType content::GetServiceSandboxType< - chromeos::assistant::mojom::AssistantAudioDecoderFactory>() { - return sandbox::policy::SandboxType::kUtility; -} - // chromeos::ime::mojom::ImeService namespace chromeos { namespace ime { @@ -58,22 +43,6 @@ return sandbox::policy::SandboxType::kTts; } -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) -namespace chromeos { -namespace libassistant { -namespace mojom { -class LibassistantService; -} // namespace mojom -} // namespace libassistant -} // namespace chromeos - -template <> -inline sandbox::policy::SandboxType content::GetServiceSandboxType< - chromeos::libassistant::mojom::LibassistantService>() { - return sandbox::policy::SandboxType::kLibassistant; -} -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) - #if BUILDFLAG(IS_CHROMEOS_ASH) // recording::mojom::RecordingService namespace recording { @@ -90,6 +59,38 @@ content::GetServiceSandboxType<recording::mojom::RecordingService>() { return sandbox::policy::SandboxType::kVideoCapture; } + +// chromeos::assistant::mojom::AssistantAudioDecoderFactory +namespace chromeos { +namespace assistant { +namespace mojom { +class AssistantAudioDecoderFactory; +} // namespace mojom +} // namespace assistant +} // namespace chromeos + +template <> +inline sandbox::policy::SandboxType content::GetServiceSandboxType< + chromeos::assistant::mojom::AssistantAudioDecoderFactory>() { + return sandbox::policy::SandboxType::kUtility; +} + +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) +// chromeos::libassistant::mojom::LibassistantService +namespace chromeos { +namespace libassistant { +namespace mojom { +class LibassistantService; +} // namespace mojom +} // namespace libassistant +} // namespace chromeos + +template <> +inline sandbox::policy::SandboxType content::GetServiceSandboxType< + chromeos::libassistant::mojom::LibassistantService>() { + return sandbox::policy::SandboxType::kLibassistant; +} +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) #endif // CHROME_BROWSER_CHROMEOS_SERVICE_SANDBOX_TYPE_H_
diff --git a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc index e541104..66b20807 100644 --- a/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc +++ b/chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.cc
@@ -246,9 +246,7 @@ std::make_unique<data_reduction_proxy::DataReductionProxyService>( this, profile_prefs, std::move(store), data_use_measurement::ChromeDataUseMeasurement::GetInstance(), - db_task_runner, commit_delay, - version_info::GetChannelString(chrome::GetChannel()), - embedder_support::GetUserAgent()); + db_task_runner, commit_delay); data_reduction_proxy::DataReductionProxySettings:: InitDataReductionProxySettings(profile_prefs, std::move(service));
diff --git a/chrome/browser/download/save_package_file_picker.cc b/chrome/browser/download/save_package_file_picker.cc index 6ecbe21..7ec16a0d 100644 --- a/chrome/browser/download/save_package_file_picker.cc +++ b/chrome/browser/download/save_package_file_picker.cc
@@ -154,7 +154,7 @@ callback_(std::move(callback)) { base::FilePath suggested_path_copy = suggested_path; base::FilePath::StringType default_extension_copy = default_extension; - int file_type_index = 0; + size_t file_type_index = 0; ui::SelectFileDialog::FileTypeInfo file_type_info; file_type_info.allowed_paths = @@ -165,16 +165,10 @@ save_types_.push_back(content::SAVE_PAGE_TYPE_UNKNOWN); base::FilePath::StringType extra_extension; - if (ShouldSaveAsMHTML()) { - default_extension_copy = FILE_PATH_LITERAL("mhtml"); - suggested_path_copy = suggested_path_copy.ReplaceExtension( - default_extension_copy); - } else { - if (!suggested_path_copy.FinalExtension().empty() && - !suggested_path_copy.MatchesExtension(FILE_PATH_LITERAL(".htm")) && - !suggested_path_copy.MatchesExtension(FILE_PATH_LITERAL(".html"))) { - extra_extension = suggested_path_copy.FinalExtension().substr(1); - } + if (!ShouldSaveAsMHTML() && !suggested_path_copy.FinalExtension().empty() && + !suggested_path_copy.MatchesExtension(FILE_PATH_LITERAL(".htm")) && + !suggested_path_copy.MatchesExtension(FILE_PATH_LITERAL(".html"))) { + extra_extension = suggested_path_copy.FinalExtension().substr(1); } if (ShouldSaveAsOnlyHTML(web_contents)) { @@ -231,6 +225,13 @@ file_type_index = 1; } + if (file_type_index < save_types_.size() && + save_types_[file_type_index] == content::SAVE_PAGE_TYPE_AS_MHTML) { + default_extension_copy = FILE_PATH_LITERAL("mhtml"); + suggested_path_copy = + suggested_path_copy.ReplaceExtension(default_extension_copy); + } + if (g_should_prompt_for_filename) { select_file_dialog_ = ui::SelectFileDialog::Create( this, std::make_unique<ChromeSelectFilePolicy>(web_contents));
diff --git a/chrome/browser/download/save_page_browsertest.cc b/chrome/browser/download/save_page_browsertest.cc index 59f6a8c..df2e3571 100644 --- a/chrome/browser/download/save_page_browsertest.cc +++ b/chrome/browser/download/save_page_browsertest.cc
@@ -819,6 +819,41 @@ EXPECT_THAT(contents, HasSubstr("content: \"\\e003 \\e004 b\"")); } +// Tests that if we default our file picker to MHTML due to user preference we +// update the suggested file name to end with .mhtml. +IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, + SavePageAsMHTMLByPrefUpdatesExtension) { + SavePackageFilePicker::SetShouldPromptUser(false); + DownloadPrefs* download_prefs = + DownloadPrefs::FromDownloadManager(GetDownloadManager()); + base::FilePath download_dir = download_prefs->DownloadPath(); + base::FilePath full_file_name = download_dir.AppendASCII("test_page"); + download_prefs->SetSaveFileType(content::SAVE_PAGE_TYPE_AS_MHTML); + + base::FilePath received_path; + content::SavePageType received_type; + content::SavePackagePathPickedCallback callback = base::BindOnce( + [](base::FilePath* received_path, content::SavePageType* received_type, + const base::FilePath& path, content::SavePageType type, + content::SavePackageDownloadCreatedCallback cb) { + *received_path = path; + *received_type = type; + }, + &received_path, &received_type); + + // Deletes itself. + new SavePackageFilePicker( + /* web_contents */ GetCurrentTab(browser()), + /* suggested_path */ full_file_name, + /* default_extension */ FILE_PATH_LITERAL(".html"), + /* can_save_as_complete */ true, + /* download_prefs */ download_prefs, + /* callback */ std::move(callback)); + + EXPECT_TRUE(received_path.MatchesExtension(FILE_PATH_LITERAL(".mhtml"))); + EXPECT_EQ(received_type, content::SAVE_PAGE_TYPE_AS_MHTML); +} + IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SavePageBrowserTest_NonMHTML) { SavePackageFilePicker::SetShouldPromptUser(false); GURL url("data:text/plain,foo");
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc index ef07f3c..8afe700 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc
@@ -232,6 +232,24 @@ RunCallback(); } +absl::optional<std::u16string> ContentAnalysisDelegate::GetCustomMessage() + const { + if (!data_.settings.custom_message_text.empty()) { + return data_.settings.custom_message_text; + } + + return absl::nullopt; +} + +absl::optional<GURL> ContentAnalysisDelegate::GetCustomLearnMoreUrl() const { + if (data_.settings.custom_message_learn_more_url.is_valid() && + !data_.settings.custom_message_learn_more_url.is_empty()) { + return data_.settings.custom_message_learn_more_url; + } + + return absl::nullopt; +} + // static bool ContentAnalysisDelegate::ResultShouldAllowDataUse( BinaryUploadService::Result result, @@ -587,8 +605,7 @@ if (!dialog_) return false; - dialog_->ShowResult(final_result_, data_.settings.custom_message_text, - data_.settings.custom_message_learn_more_url); + dialog_->ShowResult(final_result_); return true; }
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h index 286f9737..caae2da 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h
@@ -164,6 +164,10 @@ // "CancelledByUser" metrics should not be recorded. void Cancel(bool warning) override; + absl::optional<std::u16string> GetCustomMessage() const override; + + absl::optional<GURL> GetCustomLearnMoreUrl() const override; + // Returns true if the deep scanning feature is enabled in the upload // direction via enterprise policies. If the appropriate enterprise policies // are not set this feature is not enabled.
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_base.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_base.h index c30ffd23..f184f39 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_base.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_base.h
@@ -5,6 +5,9 @@ #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DELEGATE_BASE_H_ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DELEGATE_BASE_H_ +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "url/gurl.h" + namespace enterprise_connectors { class ContentAnalysisDelegateBase { @@ -36,6 +39,10 @@ // Called when the user hits "cancel" on the dialog, typically cancelling a // pending file transfer. virtual void Cancel(bool warning) = 0; + + virtual absl::optional<std::u16string> GetCustomMessage() const = 0; + + virtual absl::optional<GURL> GetCustomLearnMoreUrl() const = 0; }; } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc index 0696052..22cd7c9 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
@@ -215,6 +215,7 @@ final_result_(final_result), access_point_(std::move(access_point)), files_count_(files_count) { + DCHECK(delegate_); SetOwnedByWidget(true); if (observer_for_testing) @@ -250,10 +251,11 @@ void ContentAnalysisDialog::LearnMoreLinkClickedCallback( const ui::Event& event) { - web_contents_->OpenURL( - content::OpenURLParams(final_learn_more_url_, content::Referrer(), - WindowOpenDisposition::NEW_FOREGROUND_TAB, - ui::PAGE_TRANSITION_LINK, false)); + DCHECK(has_learn_more_url()); + web_contents_->OpenURL(content::OpenURLParams( + (*delegate_->GetCustomLearnMoreUrl()), content::Referrer(), + WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, + false)); } void ContentAnalysisDialog::SuccessCallback() { @@ -376,12 +378,8 @@ } void ContentAnalysisDialog::ShowResult( - ContentAnalysisDelegateBase::FinalResult result, - const std::u16string& custom_message, - const GURL& learn_more_url) { + ContentAnalysisDelegateBase::FinalResult result) { DCHECK(is_pending()); - final_custom_message_ = custom_message; - final_learn_more_url_ = learn_more_url; UpdateStateFromFinalResult(result); @@ -448,9 +446,8 @@ // Update the visibility of the Learn More link, which should only be visible // if the dialog is in the warning or failure state, and there's a link to // display. - learn_more_link_->SetVisible( - (is_failure() || is_warning()) && - (final_learn_more_url_.is_valid() && !final_learn_more_url_.is_empty())); + learn_more_link_->SetVisible((is_failure() || is_warning()) && + has_learn_more_url()); } void ContentAnalysisDialog::UpdateDialog() { @@ -708,7 +705,7 @@ DCHECK(is_warning() || is_failure()); DCHECK(has_custom_message()); return l10n_util::GetStringFUTF16(IDS_DEEP_SCANNING_DIALOG_CUSTOM_MESSAGE, - final_custom_message_); + *(delegate_->GetCustomMessage())); } const gfx::ImageSkia* ContentAnalysisDialog::GetTopImage() const {
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h index 224acd8c..669034b 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
@@ -105,9 +105,7 @@ // Updates the dialog with the result, and simply delete it from memory if // nothing should be shown. - void ShowResult(ContentAnalysisDelegateBase::FinalResult result, - const std::u16string& custom_message, - const GURL& learn_more_url); + void ShowResult(ContentAnalysisDelegateBase::FinalResult result); // Accessors to simplify |dialog_state_| checking. inline bool is_success() const { return dialog_state_ == State::SUCCESS; } @@ -120,11 +118,12 @@ inline bool is_pending() const { return dialog_state_ == State::PENDING; } - bool has_custom_message() const { return !final_custom_message_.empty(); } + bool has_custom_message() const { + return delegate_->GetCustomMessage().has_value(); + } bool has_learn_more_url() const { - return !final_learn_more_url_.is_empty() && - final_learn_more_url_.is_valid(); + return delegate_->GetCustomLearnMoreUrl().has_value(); } // Returns the side image's logo color depending on |dialog_state_|. @@ -250,8 +249,6 @@ // Used to show the appropriate message. ContentAnalysisDelegateBase::FinalResult final_result_; - std::u16string final_custom_message_; - GURL final_learn_more_url_; // Used to animate dialog height changes. std::unique_ptr<views::BoundsAnimator> bounds_animator_;
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc index f7e94f8..7287e9e 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -750,12 +750,50 @@ void DiscardCallback() { ++times_discard_called_; } protected: + class MockDelegate : public ContentAnalysisDelegateBase { + public: + ~MockDelegate() override = default; + void BypassWarnings() override {} + void Cancel(bool warning) override {} + + absl::optional<std::u16string> GetCustomMessage() const override { + return absl::nullopt; + } + + absl::optional<GURL> GetCustomLearnMoreUrl() const override { + return absl::nullopt; + } + }; + + class MockCustomMessageDelegate : public ContentAnalysisDelegateBase { + public: + MockCustomMessageDelegate(const std::u16string& message, const GURL& url) + : custom_message_(message), learn_more_url_(url) {} + + ~MockCustomMessageDelegate() override = default; + + void BypassWarnings() override {} + void Cancel(bool warning) override {} + + absl::optional<std::u16string> GetCustomMessage() const override { + return custom_message_; + } + + absl::optional<GURL> GetCustomLearnMoreUrl() const override { + return learn_more_url_; + } + + private: + std::u16string custom_message_; + GURL learn_more_url_; + }; + ContentAnalysisDialog* dialog() { return dialog_; } ContentAnalysisDialog* CreateContentAnalysisDialog( + std::unique_ptr<ContentAnalysisDelegateBase> delegate, ContentAnalysisDelegateBase::FinalResult result = - ContentAnalysisDelegateBase::FinalResult::SUCCESS, - std::unique_ptr<ContentAnalysisDelegateBase> delegate = nullptr) { + ContentAnalysisDelegateBase::FinalResult::SUCCESS) { // This ctor ends up calling into constrained_window to show itself, in a // way that relinquishes its ownership. Because of this, new it here and // let it be deleted by the constrained_window code. @@ -779,9 +817,12 @@ SetMinimumPendingDialogTimeForTesting( base::TimeDelta::FromMilliseconds(0)); - ContentAnalysisDialog* dialog = CreateContentAnalysisDialog(); - dialog->ShowResult(ContentAnalysisDelegateBase::FinalResult::WARNING, u"Test", - GURL("http://www.example.com")); + std::unique_ptr<MockCustomMessageDelegate> delegate = + std::make_unique<MockCustomMessageDelegate>( + u"Test", GURL("https://www.example.com")); + ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( + std::move(delegate), ContentAnalysisDelegateBase::FinalResult::SUCCESS); + dialog->ShowResult(ContentAnalysisDelegateBase::FinalResult::WARNING); EXPECT_EQ(dialog->GetMessageForTesting()->GetText(), u"Your administrator says \"Test\"."); @@ -789,7 +830,8 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestOpenInDefaultPendingState) { - ContentAnalysisDialog* dialog = CreateContentAnalysisDialog(); + ContentAnalysisDialog* dialog = + CreateContentAnalysisDialog(std::make_unique<MockDelegate>()); EXPECT_TRUE(dialog->GetSideIconSpinnerForTesting()); EXPECT_EQ( dialog->GetMessageForTesting()->GetText(), @@ -799,6 +841,7 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestOpenInWarningState) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( + std::make_unique<MockDelegate>(), ContentAnalysisDelegateBase::FinalResult::WARNING); EXPECT_EQ(nullptr, dialog->GetSideIconSpinnerForTesting()); EXPECT_EQ(dialog->GetMessageForTesting()->GetText(), @@ -807,6 +850,7 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestOpenInBlockState) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( + std::make_unique<MockDelegate>(), ContentAnalysisDelegateBase::FinalResult::FAILURE); EXPECT_EQ(nullptr, dialog->GetSideIconSpinnerForTesting()); EXPECT_EQ(dialog->GetMessageForTesting()->GetText(), @@ -817,6 +861,7 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestOpenInLargeFilesState) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( + std::make_unique<MockDelegate>(), ContentAnalysisDelegateBase::FinalResult::LARGE_FILES); EXPECT_EQ(nullptr, dialog->GetSideIconSpinnerForTesting()); EXPECT_EQ(dialog->GetMessageForTesting()->GetText(), @@ -827,6 +872,7 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestOpenInEncryptedFilesState) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( + std::make_unique<MockDelegate>(), ContentAnalysisDelegateBase::FinalResult::ENCRYPTED_FILES); EXPECT_EQ(nullptr, dialog->GetSideIconSpinnerForTesting()); EXPECT_EQ(dialog->GetMessageForTesting()->GetText(), @@ -836,12 +882,12 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestWithDownloadsDelegateBypassWarning) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( - ContentAnalysisDelegateBase::FinalResult::WARNING, std::make_unique<ContentAnalysisDownloadsDelegate>( base::BindOnce(&ContentAnalysisDialogPlainTests::OpenCallback, base::Unretained(this)), base::BindOnce(&ContentAnalysisDialogPlainTests::DiscardCallback, - base::Unretained(this)))); + base::Unretained(this))), + ContentAnalysisDelegateBase::FinalResult::WARNING); EXPECT_EQ(0, times_open_called_); EXPECT_EQ(0, times_discard_called_); @@ -854,12 +900,12 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestWithDownloadsDelegateDiscardWarning) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( - ContentAnalysisDelegateBase::FinalResult::WARNING, std::make_unique<ContentAnalysisDownloadsDelegate>( base::BindOnce(&ContentAnalysisDialogPlainTests::OpenCallback, base::Unretained(this)), base::BindOnce(&ContentAnalysisDialogPlainTests::DiscardCallback, - base::Unretained(this)))); + base::Unretained(this))), + ContentAnalysisDelegateBase::FinalResult::WARNING); EXPECT_EQ(0, times_open_called_); EXPECT_EQ(0, times_discard_called_); @@ -872,12 +918,12 @@ IN_PROC_BROWSER_TEST_F(ContentAnalysisDialogPlainTests, TestWithDownloadsDelegateDiscardBlock) { ContentAnalysisDialog* dialog = CreateContentAnalysisDialog( - ContentAnalysisDelegateBase::FinalResult::FAILURE, std::make_unique<ContentAnalysisDownloadsDelegate>( base::BindOnce(&ContentAnalysisDialogPlainTests::OpenCallback, base::Unretained(this)), base::BindOnce(&ContentAnalysisDialogPlainTests::DiscardCallback, - base::Unretained(this)))); + base::Unretained(this))), + ContentAnalysisDelegateBase::FinalResult::FAILURE); EXPECT_EQ(0, times_open_called_); EXPECT_EQ(0, times_discard_called_);
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.cc index 9ad5905..120bc57 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.cc
@@ -31,4 +31,14 @@ open_file_callback_.Reset(); } +absl::optional<std::u16string> +ContentAnalysisDownloadsDelegate::GetCustomMessage() const { + return absl::nullopt; +} + +absl::optional<GURL> ContentAnalysisDownloadsDelegate::GetCustomLearnMoreUrl() + const { + return absl::nullopt; +} + } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.h index edba88e..6d10806 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_downloads_delegate.h
@@ -28,6 +28,10 @@ // Called when the user opts to delete the downloaded file and not open it. void Cancel(bool warning) override; + absl::optional<std::u16string> GetCustomMessage() const override; + + absl::optional<GURL> GetCustomLearnMoreUrl() const override; + private: // Resets |open_file_callback_| and |discard_file_callback_|, ensuring actions // can't be attempted on a file that has already been opened or discarded
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader.cc b/chrome/browser/enterprise/connectors/file_system/box_uploader.cc index b531d8b..215c27d 100644 --- a/chrome/browser/enterprise/connectors/file_system/box_uploader.cc +++ b/chrome/browser/enterprise/connectors/file_system/box_uploader.cc
@@ -22,6 +22,7 @@ namespace { bool DeleteIfExists(base::FilePath file_path) { + DCHECK(!file_path.empty()); if (!base::PathExists(file_path)) { // If the file is deleted by some other thread, how can we be sure what we // read and uploaded was correct?! So report as error. Otherwise, it is @@ -39,12 +40,14 @@ const char kUniquifierUmaLabel[] = "Enterprise.FileSystem.Uniquifier"; +using download::DownloadItemRenameProgressUpdate; + //////////////////////////////////////////////////////////////////////////////// // BoxUploader //////////////////////////////////////////////////////////////////////////////// // static -const char BoxUploader::kServiceProviderName[] = "box"; +const FileSystemServiceProvider BoxUploader::kServiceProvider = BOX; // static std::unique_ptr<BoxUploader> BoxUploader::Create( @@ -58,21 +61,52 @@ } BoxUploader::BoxUploader(download::DownloadItem* download_item) - : local_file_path_(download_item->GetFullPath()), + : local_file_path_( + // State would be COMPLETE iff it was already uploaded and had its + // local file deleted successfully. + (download_item->GetState() == download::DownloadItem::COMPLETE) + ? base::FilePath() + : download_item->GetFullPath()), target_file_name_(download_item->GetTargetFilePath().BaseName()), download_start_time_(download_item->GetStartTime()), - uniquifier_(0) {} + uniquifier_(0) { + bool is_completed = + download_item->GetState() == download::DownloadItem::COMPLETE; + const auto& reroute_info = download_item->GetRerouteInfo(); + + if (reroute_info.IsInitialized()) { + // If |reroute_info| is initialized, that means it was loaded from + // databases, because the item was previously uploaded, or in the middle of + // uploading. Therefore, as long as the state is consistent with file_id and + // URL, |reroute_info| is valid. + DCHECK_EQ(reroute_info.service_provider(), kServiceProvider); + DCHECK_EQ(is_completed, reroute_info.box().has_file_id()); + reroute_info_ = reroute_info; + DCHECK_EQ(is_completed, GetUploadedFileUrl().is_valid()); + // TODO(https://crbug.com/1213761) If |is_completed| == false, load info to + // resume upload from where it left off. + } else { + // If |reroute_info| is not initialized, that means the item is either a new + // download to be uploaded now, or the previous upload attempt didn't go + // very far to have any information to recover from, therefore we start the + // upload workflow from scratch. + DCHECK(!is_completed) << download_item->GetState(); + reroute_info_.set_service_provider(kServiceProvider); + } +} BoxUploader::~BoxUploader() = default; // TODO(https://crbug.com/1213761) May need to TerminateTask() to resume later. void BoxUploader::Init( base::RepeatingCallback<void(void)> authen_retry_callback, + ProgressUpdateCallback progress_update_cb, UploadCompleteCallback upload_complete_cb, PrefService* prefs) { - DCHECK(file_id_.empty()); + DCHECK(reroute_info().file_id().empty()); prefs_ = prefs; - authentication_retry_callback_ = authen_retry_callback; + authentication_retry_callback_ = std::move(authen_retry_callback); + progress_update_cb_ = std::move(progress_update_cb); upload_complete_cb_ = std::move(upload_complete_cb); SetCurrentApiCall(GetFolderId().empty() ? MakeFindUpstreamFolderApiCall() : MakePreflightCheckApiCall()); @@ -125,6 +159,7 @@ void BoxUploader::StartUpload() { LogUniquifierCountToUma(); + SendProgressUpdate(); SetCurrentApiCall(MakeFileUploadApiCall()); TryCurrentApiCall(); } @@ -141,16 +176,22 @@ // for trusted testers (TT), deleting as usual for now. Need to determine // how to communicate the failure/error to user. } else { - DCHECK(file_id_.empty()); + DCHECK(reroute_info().file_id().empty()); DCHECK(!file_id.empty()); - file_id_ = file_id; + reroute_info().set_file_id(file_id); + SendProgressUpdate(); } PostDeleteFileTask(upload_success); } void BoxUploader::NotifyResult(bool success) { - std::move(upload_complete_cb_).Run(success); + std::move(upload_complete_cb_).Run(success, GetUploadFileName()); +} + +void BoxUploader::SendProgressUpdate() const { + progress_update_cb_.Run( + DownloadItemRenameProgressUpdate{GetUploadFileName(), reroute_info_}); } void BoxUploader::OnFindUpstreamFolderResponse(bool success, @@ -258,7 +299,7 @@ // Getters & Setters /////////////////////////////////////////////////////////// GURL BoxUploader::GetUploadedFileUrl() const { - return BoxApiCallFlow::MakeUrlToShowFile(file_id_); + return BoxApiCallFlow::MakeUrlToShowFile(reroute_info().file_id()); } GURL BoxUploader::GetDestinationFolderUrl() const {
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader.h b/chrome/browser/enterprise/connectors/file_system/box_uploader.h index 09e0f42..469f3d5d 100644 --- a/chrome/browser/enterprise/connectors/file_system/box_uploader.h +++ b/chrome/browser/enterprise/connectors/file_system/box_uploader.h
@@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "components/download/public/common/download_item_impl.h" +#include "components/download/public/common/download_item_rename_progress_update.h" #include "components/prefs/pref_service.h" #include "google_apis/gaia/oauth2_api_call_flow.h" @@ -23,19 +24,26 @@ // file. class BoxUploader { public: - static const char kServiceProviderName[]; + static const FileSystemServiceProvider kServiceProvider; static std::unique_ptr<BoxUploader> Create( download::DownloadItem* download_item); virtual ~BoxUploader(); - using UploadCompleteCallback = base::OnceCallback<void(bool)>; + // Callback to update the DownloadItem and send BoxInfo into databases. + using ProgressUpdateCallback = base::RepeatingCallback<void( + const download::DownloadItemRenameProgressUpdate&)>; + // Callback when upload completes. Args indicate result to be updated to UX, + // and the final file name validated on Box. + using UploadCompleteCallback = + base::OnceCallback<void(bool, const base::FilePath&)>; // Initialize with callbacks from FileSystemRenameHandler, set // current_api_call_ to be the first step of the whole API call workflow. Must // be called before calling TryTask() for the first time. void Init(base::RepeatingCallback<void(void)> authen_retry_callback, + ProgressUpdateCallback progress_update_cb, UploadCompleteCallback upload_complete_cb, PrefService* prefs); @@ -74,6 +82,7 @@ void TryCurrentApiCall(); bool EnsureSuccessResponse(bool success, int response_code); void OnApiCallFlowDone(bool upload_success, std::string uploaded_file_id); + void SendProgressUpdate() const; void NotifyResult(bool success); // To be overridden to test API calls flow and file delete separately. @@ -96,6 +105,8 @@ const std::string GetFolderId() const; void SetFolderId(std::string folder_id); void SetCurrentApiCall(std::unique_ptr<OAuth2ApiCallFlow> api_call); + BoxInfo& reroute_info() { return *(reroute_info_.mutable_box()); } + const BoxInfo& reroute_info() const { return reroute_info_.box(); } private: // Box API call pre-upload steps: @@ -123,11 +134,14 @@ // File details. const base::FilePath local_file_path_; // Path of the local temporary file. - const base::FilePath - target_file_name_; // File name to be used for the upload. + const base::FilePath target_file_name_; // File name to be used for upload. const base::Time download_start_time_; // Start time of the download. uint32_t uniquifier_; // Number suffix for the filename to uniquify. + // Reroute info loaded from / to be stored into download databases. + DownloadItemRerouteInfo reroute_info_; + // Callback when there's an update for DownloadItem's observers. + ProgressUpdateCallback progress_update_cb_; // Callback when the entire flow is completed to notify the download thread. UploadCompleteCallback upload_complete_cb_; // Callback when API call gives Authenetication Error. @@ -144,8 +158,6 @@ std::unique_ptr<OAuth2ApiCallFlow> current_api_call_; // Folder id used to specify the destination folder for the Service Provider. std::string folder_id_; - // File id used to open a tab to show the item on Box. - std::string file_id_; // PrefService used to store folder_id. PrefService* prefs_ = nullptr; // Has to be initialized to nullptr for DCHECKs.
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.cc b/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.cc index 490a99b..99ed9b5 100644 --- a/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.cc +++ b/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.cc
@@ -63,6 +63,8 @@ ASSERT_TRUE(prefs_); uploader->Init(base::BindRepeating(&BoxUploaderTestBase::AuthenticationRetry, base::Unretained(this)), + base::BindRepeating(&BoxUploaderTestBase::OnProgressUpdate, + base::Unretained(this)), base::BindOnce(&BoxUploaderTestBase::OnUploaderFinished, base::Unretained(this)), prefs_); @@ -114,9 +116,18 @@ Quit(); } -void BoxUploaderTestBase::OnUploaderFinished(bool success) { +void BoxUploaderTestBase::OnProgressUpdate( + const download::DownloadItemRenameProgressUpdate& update) { + ++progress_update_cb_called_; + validated_file_name_ = update.target_file_name; +} + +void BoxUploaderTestBase::OnUploaderFinished(bool success, + const base::FilePath& final_name) { download_thread_cb_called_ = true; upload_success_ = success; + if (success) + validated_file_name_ = final_name; Quit(); }
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h b/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h index 5a45625..cdee214c 100644 --- a/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h +++ b/chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h
@@ -35,13 +35,17 @@ base::FilePath GetFilePath() const; protected: + using State = download::DownloadItem::DownloadState; + virtual void CreateTemporaryFile(); void CreateTemporaryFileWithContent(std::string content); void InitFolderIdInPrefs(std::string folder_id); void InitUploader(BoxUploader* uploader); void AuthenticationRetry(); - void OnUploaderFinished(bool success); + void OnProgressUpdate( + const download::DownloadItemRenameProgressUpdate& update); + void OnUploaderFinished(bool success, const base::FilePath& final_name); // Add a mock response to http requests made to the url. Only the last // response added is used. @@ -69,8 +73,10 @@ // Updated/used in callbacks & checked in tests. int authentication_retry_{0}; + int progress_update_cb_called_{0}; bool download_thread_cb_called_{false}; bool upload_success_{false}; + base::FilePath validated_file_name_; private: content::BrowserTaskEnvironment task_environment_;
diff --git a/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc b/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc index 94fab0e..311989d 100644 --- a/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc +++ b/chrome/browser/enterprise/connectors/file_system/box_uploader_unittest.cc
@@ -14,6 +14,8 @@ #include "chrome/browser/enterprise/connectors/file_system/box_api_call_test_helper.h" #include "chrome/browser/enterprise/connectors/file_system/box_uploader_test_helper.h" +using testing::Return; + namespace enterprise_connectors { class BoxUploaderCreateTest : public BoxUploaderTestBase { @@ -59,6 +61,28 @@ EXPECT_FALSE(upload_success_); } +TEST_F(BoxUploaderCreateTest, LoadFromReroutedInfo) { + test_item_.SetState(State::COMPLETE); + + DownloadItemRerouteInfo rerouted_info; + rerouted_info.set_service_provider(BoxUploader::kServiceProvider); + rerouted_info.mutable_box()->set_file_id(kFileSystemBoxUploadResponseFileId); + test_item_.SetRerouteInfo(rerouted_info); + + uploader_ = BoxUploader::Create(&test_item_); + ASSERT_TRUE(uploader_); + ASSERT_EQ(uploader_->GetUploadedFileUrl(), + GURL(kFileSystemBoxUploadResponseFileUrl)); + // TODO(https://crbug.com/1215847) Update to set folder id and check folder + // link too. + + ASSERT_FALSE(authentication_retry_); + EXPECT_FALSE(download_thread_cb_called_); + EXPECT_FALSE(progress_update_cb_called_); + EXPECT_FALSE(upload_success_); + EXPECT_FALSE(base::PathExists(GetFilePath())); // File not created. +} + //////////////////////////////////////////////////////////////////////////////// // BoxUploader: Pre-Upload Test //////////////////////////////////////////////////////////////////////////////// @@ -113,6 +137,9 @@ // deleted as part of error handling. Otherwise, upload API call flow got // InterceptedPreUpload(), so file was not deleted. EXPECT_EQ(upload_initiated_, base::PathExists(GetFilePath())); + // Only 1 update in StartUpload() when PreflightCheck succeeds. + EXPECT_LE(progress_update_cb_called_, 1); + EXPECT_EQ(progress_update_cb_called_, upload_initiated_); } void InterceptedPreUpload() { @@ -173,6 +200,7 @@ // Should be retrying authentication, no report via callback yet. ASSERT_EQ(authentication_retry_, 1); + ASSERT_EQ(progress_update_cb_called_, 0); EXPECT_FALSE(upload_initiated_); EXPECT_FALSE(download_thread_cb_called_); EXPECT_EQ(uploader_->GetFolderIdForTesting(), ""); @@ -253,6 +281,7 @@ ASSERT_EQ(authentication_retry_, 0); EXPECT_EQ(kFileSystemBoxFolderIdInPref, uploader_->GetFolderIdForTesting()); EXPECT_EQ(kUploadFileName, uploader_->GetUploadFileName().value()); + EXPECT_EQ(kUploadFileName, validated_file_name_.value()); ASSERT_TRUE(upload_initiated_); EXPECT_FALSE(download_thread_cb_called_); // InterceptedPreUpload() above. } @@ -308,6 +337,7 @@ RunWithQuitClosure(); ASSERT_EQ(authentication_retry_, 0); EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxFolderIdInPref); + EXPECT_TRUE(validated_file_name_.empty()) << validated_file_name_; ASSERT_FALSE(upload_initiated_); // The last tried filename is timestamp based even though it also fails. @@ -371,6 +401,7 @@ EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxFindFolderResponseFolderId); EXPECT_EQ(kUploadFileName, uploader_->GetUploadFileName().value()); + EXPECT_EQ(kUploadFileName, validated_file_name_.value()); ASSERT_TRUE(upload_initiated_); EXPECT_FALSE(download_thread_cb_called_); // InterceptedPreUpload() above. } @@ -404,6 +435,7 @@ EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxCreateFolderResponseFolderId); EXPECT_EQ(kUploadFileName, uploader_->GetUploadFileName().value()); + EXPECT_EQ(kUploadFileName, validated_file_name_.value()); ASSERT_TRUE(upload_initiated_); EXPECT_FALSE(download_thread_cb_called_); // InterceptedPreUpload() above. } @@ -418,6 +450,7 @@ // Need to retry authentication, so no report via callback yet. ASSERT_EQ(authentication_retry_, 1); + ASSERT_EQ(progress_update_cb_called_, 0); ASSERT_FALSE(upload_initiated_); EXPECT_FALSE(download_thread_cb_called_); EXPECT_FALSE(upload_success_); @@ -433,6 +466,7 @@ ASSERT_EQ(authentication_retry_, 1); EXPECT_EQ(uploader_->GetFolderIdForTesting(), kFileSystemBoxFolderIdInPref); EXPECT_EQ(kUploadFileName, uploader_->GetUploadFileName().value()); + EXPECT_EQ(kUploadFileName, validated_file_name_.value()); ASSERT_TRUE(upload_initiated_); EXPECT_FALSE(download_thread_cb_called_); // InterceptedPreUpload() above. } @@ -474,7 +508,6 @@ void TearDown() override { EXPECT_EQ(authentication_retry_, 0); - EXPECT_TRUE(download_thread_cb_called_); EXPECT_FALSE(test_item_.GetFileExternallyRemoved()); } @@ -499,6 +532,7 @@ RunWithQuitClosure(); EXPECT_FALSE(base::PathExists(GetFilePath())) << "No file should be created."; + EXPECT_TRUE(download_thread_cb_called_); ASSERT_FALSE(upload_success_); } @@ -509,6 +543,7 @@ RunWithQuitClosure(); EXPECT_FALSE(base::PathExists(GetFilePath())); // Make sure file is deleted. + EXPECT_TRUE(download_thread_cb_called_); ASSERT_FALSE(upload_success_); } @@ -519,9 +554,60 @@ RunWithQuitClosure(); EXPECT_FALSE(base::PathExists(GetFilePath())); // Make sure file is deleted. + EXPECT_TRUE(download_thread_cb_called_); ASSERT_FALSE(upload_success_); } +TEST_F(BoxUploader_FileDeleteTest, LoadFromReroutedInfo_InProgress) { + test_item_.SetState(State::IN_PROGRESS); + CreateTemporaryFile(); + + DownloadItemRerouteInfo rerouted_info; + rerouted_info.set_service_provider(BoxUploader::kServiceProvider); + rerouted_info.mutable_box(); // set the oneof to be box; + test_item_.SetRerouteInfo(rerouted_info); + + // Recreate uploader to load rerouted info. + uploader_ = std::make_unique<BoxUploaderForFileDeleteTest>(&test_item_); + InitUploader(uploader_.get()); + uploader_->TryTask(url_factory_, "test_token"); + RunWithQuitClosure(); + + ASSERT_TRUE(uploader_); + ASSERT_EQ(uploader_->GetUploadedFileUrl(), + GURL(kFileSystemBoxUploadResponseFileUrl)); + // TODO(https://crbug.com/1215847) Update to set folder id and check folder + // link too. + + ASSERT_FALSE(authentication_retry_); + EXPECT_TRUE(download_thread_cb_called_); + EXPECT_EQ(progress_update_cb_called_, 1); + ASSERT_TRUE(upload_success_); + EXPECT_FALSE(base::PathExists(GetFilePath())); // File deleted. +} + +TEST_F(BoxUploader_FileDeleteTest, LoadFromReroutedInfo_Complete) { + test_item_.SetState(State::COMPLETE); + + DownloadItemRerouteInfo rerouted_info; + rerouted_info.set_service_provider(BoxUploader::kServiceProvider); + rerouted_info.mutable_box()->set_file_id(kFileSystemBoxUploadResponseFileId); + test_item_.SetRerouteInfo(rerouted_info); + + // Recreate uploader to load rerouted info. + uploader_ = std::make_unique<BoxUploaderForFileDeleteTest>(&test_item_); + ASSERT_TRUE(uploader_); + ASSERT_EQ(uploader_->GetUploadedFileUrl(), + GURL(kFileSystemBoxUploadResponseFileUrl)); + // TODO(https://crbug.com/1215847) Update to set folder id and check folder + // link too. + + ASSERT_FALSE(authentication_retry_); + EXPECT_FALSE(download_thread_cb_called_); // No upload call was made. + EXPECT_EQ(progress_update_cb_called_, 0); + EXPECT_FALSE(base::PathExists(GetFilePath())); // File not created. +} + //////////////////////////////////////////////////////////////////////////////// // BoxDirectUploaderTest //////////////////////////////////////////////////////////////////////////////// @@ -561,6 +647,7 @@ ASSERT_EQ(authentication_retry_, 0); EXPECT_TRUE(download_thread_cb_called_); + EXPECT_TRUE(progress_update_cb_called_); EXPECT_TRUE(upload_success_); EXPECT_EQ(uploader_->GetUploadedFileUrl(), kFileSystemBoxUploadResponseFileUrl); @@ -674,6 +761,7 @@ RunWithQuitClosure(); ASSERT_EQ(authentication_retry_, 0); + EXPECT_TRUE(progress_update_cb_called_); ASSERT_TRUE(upload_success_); }
diff --git a/chrome/browser/enterprise/connectors/file_system/rename_handler.cc b/chrome/browser/enterprise/connectors/file_system/rename_handler.cc index e0b3a51..4b5ecaa 100644 --- a/chrome/browser/enterprise/connectors/file_system/rename_handler.cc +++ b/chrome/browser/enterprise/connectors/file_system/rename_handler.cc
@@ -101,19 +101,20 @@ download::DownloadItem* download_item, FileSystemSettings settings) : download::DownloadItemRenameHandler(download_item), - target_path_(download_item->GetTargetFilePath()), settings_(std::move(settings)), uploader_(BoxUploader::Create(download_item)) { - DCHECK_EQ(BoxUploader::kServiceProviderName, settings_.service_provider); + DCHECK_EQ(settings_.service_provider, kBoxProviderName); } FileSystemRenameHandler::~FileSystemRenameHandler() = default; -void FileSystemRenameHandler::Start(Callback callback) { - upload_complete_cb_ = std::move(callback); +void FileSystemRenameHandler::Start(ProgressUpdateCallback progress_update_cb, + DownloadCallback upload_complete_cb) { + upload_complete_cb_ = std::move(upload_complete_cb); uploader_->Init( base::BindRepeating(&FileSystemRenameHandler::OnApiAuthenticationError, weak_factory_.GetWeakPtr()), + std::move(progress_update_cb), base::BindOnce(&FileSystemRenameHandler::NotifyResultToDownloadThread, weak_factory_.GetWeakPtr()), GetPrefs()); @@ -293,14 +294,13 @@ CREDENTIALS_REJECTED_BY_SERVER)); } -void FileSystemRenameHandler::NotifyResultToDownloadThread(bool success) { +void FileSystemRenameHandler::NotifyResultToDownloadThread( + bool success, + const base::FilePath& final_name) { // TODO(https://crbug.com/1168815): Define required error messages. auto reason = success ? download::DOWNLOAD_INTERRUPT_REASON_NONE : download::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; - // Make sure target_path_ has been initialized. - DCHECK(!target_path_.empty()); - // TODO(https://crbug.com/1203753): Returns the final file name here. - std::move(upload_complete_cb_).Run(reason, target_path_); + std::move(upload_complete_cb_).Run(reason, final_name); } PrefService* FileSystemRenameHandler::GetPrefs() {
diff --git a/chrome/browser/enterprise/connectors/file_system/rename_handler.h b/chrome/browser/enterprise/connectors/file_system/rename_handler.h index a21609a..32f0a957 100644 --- a/chrome/browser/enterprise/connectors/file_system/rename_handler.h +++ b/chrome/browser/enterprise/connectors/file_system/rename_handler.h
@@ -44,7 +44,8 @@ protected: // download::DownloadItemRenameHandler interface. - void Start(Callback callback) override; + void Start(ProgressUpdateCallback progress_update_cb, + DownloadCallback upload_complete_cb) override; void OpenDownload() override; void ShowDownloadInContext() override; @@ -91,17 +92,15 @@ // Callback for uploader_ upon API requests returning authentication error. void OnApiAuthenticationError(); // Notify upload success or failure back to the download thread. - void NotifyResultToDownloadThread(bool success); + void NotifyResultToDownloadThread(bool success, const base::FilePath& path); PrefService* GetPrefs(); - // Fields copied from |download_item| or policy settings. Constant for the - // life of the rename handler. - const base::FilePath target_path_; + // Copied from policy settings. Constant for the life of the rename handler. const FileSystemSettings settings_; // Invoked to tell the download system when the rename has completed. - Callback upload_complete_cb_; + DownloadCallback upload_complete_cb_; std::unique_ptr<AccessTokenFetcher> token_fetcher_; // Main uploader that manages the entire API call flow of file upload.
diff --git a/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc b/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc index fb50be8d..67bbe36 100644 --- a/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc +++ b/chrome/browser/enterprise/connectors/file_system/rename_handler_unittest.cc
@@ -256,6 +256,7 @@ } void TryTaskSuccess() { + // For invoking progress update in StartUpload(). EXPECT_CALL(*this, StartCurrentApiCall()).WillOnce(Invoke([this]() { SetUploadApiCallFlowDoneForTesting(true, kUploadedFileId); })); @@ -360,8 +361,11 @@ void RunHandler() { run_loop_ = std::make_unique<base::RunLoop>(); download::DownloadItemRenameHandler* download_handler_ = handler(); - download_handler_->Start(base::BindOnce( - &RenameHandlerOAuth2Test::OnUploadComplete, base::Unretained(this))); + download_handler_->Start( + base::BindRepeating(&RenameHandlerOAuth2Test::OnProgressUpdate, + base::Unretained(this)), + base::BindOnce(&RenameHandlerOAuth2Test::OnUploadComplete, + base::Unretained(this))); run_loop_->Run(); } @@ -397,12 +401,19 @@ base::FilePath uploaded_file_name_; private: + void OnProgressUpdate( + const download::DownloadItemRenameProgressUpdate& update) { + uploaded_file_name_ = update.target_file_name; + } + void OnUploadComplete(DownloadInterruptReason reason, - const base::FilePath& file_name) { + const base::FilePath& final_name) { ++download_cb_count_; download_cb_reason_ = reason; uploaded_file_url_ = uploader()->GetUploadedFileUrl(); - uploaded_file_name_ = file_name; + if (!uploaded_file_name_.empty()) { + EXPECT_EQ(uploaded_file_name_, final_name); + } run_loop_->Quit(); } @@ -457,6 +468,7 @@ ASSERT_EQ(download_cb_reason_, download::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); ASSERT_TRUE(uploaded_file_url_.is_empty()); + ASSERT_TRUE(uploaded_file_name_.empty()) << uploaded_file_name_; VerifyBothTokensClear(); } @@ -492,6 +504,7 @@ ASSERT_EQ(download_cb_reason_, download::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); ASSERT_TRUE(uploaded_file_url_.is_empty()); // Notified failure to terminate. + ASSERT_TRUE(uploaded_file_name_.empty()) << uploaded_file_name_; VerifyBothTokensClear(); } @@ -569,6 +582,7 @@ ASSERT_EQ(download_cb_reason_, download::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); ASSERT_TRUE(uploaded_file_url_.is_empty()); + ASSERT_TRUE(uploaded_file_name_.empty()) << uploaded_file_name_; // Verify that uploader failure did not affect stored credentials. VerifyBothTokensSetByFetcher(); } @@ -618,6 +632,7 @@ ASSERT_EQ(download_cb_reason_, download::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED); ASSERT_TRUE(uploaded_file_url_.is_empty()); + ASSERT_TRUE(uploaded_file_name_.empty()) << uploaded_file_name_; // Verify that access token stored is cleared. std::string atoken, rtoken; ASSERT_TRUE(GetFileSystemOAuth2Tokens(prefs(), kBox, &atoken, &rtoken));
diff --git a/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc b/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc index 6ba0e60..4b0487f 100644 --- a/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc +++ b/chrome/browser/enterprise/connectors/file_system/signin_dialog_delegate.cc
@@ -63,7 +63,7 @@ SetTitle(IDS_PROFILES_GAIA_SIGNIN_TITLE); SetButtons(ui::DIALOG_BUTTON_NONE); set_use_custom_frame(false); - SetCancelCallback( + SetCloseCallback( base::BindOnce(&FileSystemSigninDialogDelegate::OnCancellation, weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/enterprise/connectors/file_system/test_helper.cc b/chrome/browser/enterprise/connectors/file_system/test_helper.cc index a6c9b6d..d41a39f 100644 --- a/chrome/browser/enterprise/connectors/file_system/test_helper.cc +++ b/chrome/browser/enterprise/connectors/file_system/test_helper.cc
@@ -46,10 +46,28 @@ start_time_exploded.millisecond); } +DownloadItemForTest::~DownloadItemForTest() = default; + const base::FilePath& DownloadItemForTest::GetFullPath() const { return path_; } +DownloadItemForTest::DownloadState DownloadItemForTest::GetState() const { + return state_; +} + +const DownloadItemRerouteInfo& DownloadItemForTest::GetRerouteInfo() const { + return rerouted_info_; +} + +void DownloadItemForTest::SetRerouteInfo(DownloadItemRerouteInfo info) { + rerouted_info_ = info; +} + +void DownloadItemForTest::SetState(DownloadState state) { + state_ = state; +} + //////////////////////////////////////////////////////////////////////////////// // MockApiCallFlow ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/enterprise/connectors/file_system/test_helper.h b/chrome/browser/enterprise/connectors/file_system/test_helper.h index 9490275b..10779c003 100644 --- a/chrome/browser/enterprise/connectors/file_system/test_helper.h +++ b/chrome/browser/enterprise/connectors/file_system/test_helper.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_FILE_SYSTEM_TEST_HELPER_H_ #include "base/files/scoped_temp_dir.h" +#include "components/download/public/common/download_item_rename_progress_update.h" #include "content/public/test/fake_download_item.h" #include "google_apis/gaia/oauth2_api_call_flow.h" #include "testing/gmock/include/gmock/gmock.h" @@ -19,11 +20,20 @@ public: explicit DownloadItemForTest(base::FilePath::StringPieceType file_name, base::Time::Exploded start_time = kTestDateTime); + ~DownloadItemForTest() override; + const base::FilePath& GetFullPath() const override; + DownloadState GetState() const override; + const DownloadItemRerouteInfo& GetRerouteInfo() const override; + + void SetState(DownloadState state); + void SetRerouteInfo(DownloadItemRerouteInfo info); protected: base::ScopedTempDir tmp_dir_; base::FilePath path_; + DownloadState state_ = DownloadState::IN_PROGRESS; + DownloadItemRerouteInfo rerouted_info_; }; class MockApiCallFlow : public OAuth2ApiCallFlow {
diff --git a/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc b/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc index 953ffade..47724a3b 100644 --- a/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc +++ b/chrome/browser/enterprise/signals/device_info_fetcher_linux.cc
@@ -30,8 +30,17 @@ namespace { +std::string ReadFile(std::string path_str) { + base::FilePath path(path_str); + std::string output; + if (base::PathExists(path) && base::ReadFileToString(path, &output)) + base::TrimWhitespaceASCII(output, base::TrimPositions::TRIM_ALL, &output); + + return output; +} + std::string GetDeviceModel() { - return base::SysInfo::HardwareModelName(); + return ReadFile("/sys/class/dmi/id/product_name"); } std::string GetOsVersion() { @@ -57,15 +66,7 @@ } std::string GetSerialNumber() { - base::FilePath product_serial_path("/sys/class/dmi/id/product_serial"); - std::string serial_number; - if (base::PathExists(product_serial_path) && - base::ReadFileToString(product_serial_path, &serial_number)) { - base::TrimWhitespaceASCII(serial_number, base::TrimPositions::TRIM_ALL, - &serial_number); - } - - return serial_number; + return ReadFile("/sys/class/dmi/id/product_serial"); } // Implements the logic from the native client setup script. It reads the
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc index 186789a..7557623 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.cc
@@ -110,6 +110,9 @@ ~EnterpriseReportingPrivateGetDeviceIdFunction() = default; // getPersistentSecret + +#if !defined(OS_LINUX) + EnterpriseReportingPrivateGetPersistentSecretFunction:: EnterpriseReportingPrivateGetPersistentSecretFunction() = default; EnterpriseReportingPrivateGetPersistentSecretFunction:: @@ -160,6 +163,8 @@ } } +#endif // !defined(OS_LINUX) + // getDeviceData EnterpriseReportingPrivateGetDeviceDataFunction::
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h index fd4bef8d..282daa6 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
@@ -41,6 +41,8 @@ DISALLOW_COPY_AND_ASSIGN(EnterpriseReportingPrivateGetDeviceIdFunction); }; +#if !defined(OS_LINUX) + class EnterpriseReportingPrivateGetPersistentSecretFunction : public ExtensionFunction { public: @@ -67,6 +69,8 @@ void SendResponse(const std::string& data, long int status); }; +#endif // !defined(OS_LINUX) + class EnterpriseReportingPrivateGetDeviceDataFunction : public ExtensionFunction { public:
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc index bfb7962..e50086d 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -131,8 +131,6 @@ #if defined(OS_WIN) || defined(OS_MAC) "chrome.test.assertNoLastError();" "chrome.test.assertTrue(secret instanceof ArrayBuffer);"; -#elif defined(OS_LINUX) - "chrome.test.assertLastError('-1');"; #else "chrome.test.assertLastError('Access to extension API denied.');"; #endif
diff --git a/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc b/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc index 046102e8..27daafc 100644 --- a/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc +++ b/chrome/browser/extensions/api/messaging/native_message_host_lacros.cc
@@ -23,7 +23,7 @@ std::unique_ptr<NativeMessageHost> CreateIt2MeHost( content::BrowserContext* browser_context) { return remoting::CreateIt2MeNativeMessagingHostForLacros( - content::GetIOThreadTaskRunner({}), content::GetUIThreadTaskRunner({})); + content::GetUIThreadTaskRunner({})); } } // namespace
diff --git a/chrome/browser/extensions/content_verifier_browsertest.cc b/chrome/browser/extensions/content_verifier_browsertest.cc index a83d1ec..856dacc 100644 --- a/chrome/browser/extensions/content_verifier_browsertest.cc +++ b/chrome/browser/extensions/content_verifier_browsertest.cc
@@ -215,27 +215,30 @@ } // Creates a CRX in a temporary directory under |temp_dir| using contents from - // |unpacked_path|. Compresses the contents in |verified_contents_path| and - // injects these contents into the the header of the CRX. Creates a random - // signing key and sets |extension_id| using it. - base::FilePath CreateCrxWithVerifiedContentsInHeader( + // |unpacked_path|. Compresses the |verified_contents| and injects these + // contents into the the header of the CRX. Creates a random signing key + // and sets |extension_id| using it. Returns path to new CRX in |crx_path|. + testing::AssertionResult CreateCrxWithVerifiedContentsInHeader( base::ScopedTempDir* temp_dir, const base::FilePath& unpacked_path, - const base::FilePath& verified_contents_path, - std::string* extension_id) { - std::string contents; - EXPECT_TRUE(base::ReadFileToString(verified_contents_path, &contents)); + const std::string& verified_contents, + std::string* extension_id, + base::FilePath* crx_path) { std::string compressed_verified_contents; - EXPECT_TRUE( - compression::GzipCompress(contents, &compressed_verified_contents)); + if (!compression::GzipCompress(verified_contents, + &compressed_verified_contents)) { + return testing::AssertionFailure(); + } - EXPECT_TRUE(temp_dir->CreateUniqueTempDir()); - base::FilePath crx_path = temp_dir->GetPath().AppendASCII("temp.crx"); + if (!temp_dir->CreateUniqueTempDir()) { + return testing::AssertionFailure(); + } + *crx_path = temp_dir->GetPath().AppendASCII("temp.crx"); ExtensionCreator creator; creator.CreateCrxWithVerifiedContentsInHeaderForTesting( - unpacked_path, crx_path, compressed_verified_contents, extension_id); - return crx_path; + unpacked_path, *crx_path, compressed_verified_contents, extension_id); + return testing::AssertionSuccess(); } protected: @@ -590,19 +593,40 @@ // successfully installed and verified. IN_PROC_BROWSER_TEST_F( ContentVerifierTest, - VerificationSuccessfullForCrxWithVerifiedContentsInjectedInHeader) { + VerificationSuccessfulForCrxWithVerifiedContentsInjectedInHeader) { base::ScopedAllowBlockingForTesting allow_blocking; base::ScopedTempDir temp_dir; base::FilePath test_dir = test_data_dir_.AppendASCII("content_verifier/missing_verified_contents"); - std::string extension_id; - base::FilePath crx_path = CreateCrxWithVerifiedContentsInHeader( - &temp_dir, test_dir.AppendASCII("source"), - test_dir.AppendASCII("verified_contents.json"), &extension_id); + base::FilePath extension_dir = test_dir.AppendASCII("source"); + base::FilePath resource_path = base::FilePath().AppendASCII("script.js"); - TestContentVerifySingleJobObserver observer( - extension_id, base::FilePath().AppendASCII("script.js")); + extensions::content_verifier_test_utils::TestExtensionBuilder + verified_contents_builder; + + std::string resource_contents; + base::ReadFileToString(extension_dir.Append(resource_path), + &resource_contents); + verified_contents_builder.AddResource(resource_path.value(), + resource_contents); + std::string verified_contents = + verified_contents_builder.CreateVerifiedContents(); + + auto mock_content_verifier_delegate = + std::make_unique<MockContentVerifierDelegate>(); + mock_content_verifier_delegate->SetVerifierKey( + verified_contents_builder.GetTestContentVerifierPublicKey()); + ExtensionSystem::Get(profile()) + ->content_verifier() + ->OverrideDelegateForTesting(std::move(mock_content_verifier_delegate)); + + std::string extension_id; + base::FilePath crx_path; + ASSERT_TRUE(CreateCrxWithVerifiedContentsInHeader( + &temp_dir, extension_dir, verified_contents, &extension_id, &crx_path)); + + TestContentVerifySingleJobObserver observer(extension_id, resource_path); const Extension* extension = InstallExtensionFromWebstore(crx_path, 1); ASSERT_TRUE(extension); @@ -622,12 +646,15 @@ base::FilePath test_dir = test_data_dir_.AppendASCII("content_verifier/missing_verified_contents"); std::string extension_id; - base::FilePath crx_path = CreateCrxWithVerifiedContentsInHeader( - &temp_dir, test_dir.AppendASCII("source"), - test_dir.AppendASCII("invalid_verified_contents.json"), &extension_id); + std::string verified_contents = + "Not a valid verified contents, not even a valid JSON."; + base::FilePath crx_path; + ASSERT_TRUE(CreateCrxWithVerifiedContentsInHeader( + &temp_dir, test_dir.AppendASCII("source"), verified_contents, + &extension_id, &crx_path)); const Extension* extension = InstallExtensionFromWebstore(crx_path, 0); - ASSERT_FALSE(extension); + EXPECT_FALSE(extension); } // Verifies that CRX with missing verified contents is successfully installed
diff --git a/chrome/browser/extensions/cross_origin_isolation_browsertest.cc b/chrome/browser/extensions/cross_origin_isolation_browsertest.cc index 679828e..50c63fb3 100644 --- a/chrome/browser/extensions/cross_origin_isolation_browsertest.cc +++ b/chrome/browser/extensions/cross_origin_isolation_browsertest.cc
@@ -169,8 +169,8 @@ ASSERT_TRUE(process_manager); std::set<content::RenderFrameHost*> extension_hosts = process_manager->GetRenderFrameHostsForExtension(coi_extension->id()); - EXPECT_THAT(extension_hosts, - ::testing::ElementsAre(coi_background_rfh, extension_iframe)); + EXPECT_THAT(extension_hosts, ::testing::UnorderedElementsAre( + coi_background_rfh, extension_iframe)); EXPECT_EQ(coi_extension, process_manager->GetExtensionForRenderFrameHost( coi_background_rfh));
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc index 1149285dc..acf8984 100644 --- a/chrome/browser/extensions/crx_installer.cc +++ b/chrome/browser/extensions/crx_installer.cc
@@ -506,6 +506,28 @@ FROM_HERE, base::BindOnce(std::move(callback), result)); } +void CrxInstaller::GetContentVerifierKeyOnUI( + base::OnceCallback<void(ContentVerifierKey)> callback) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + ContentVerifierKey key = ExtensionSystem::Get(profile_) + ->content_verifier() + ->GetContentVerifierKey(); + // Normally content verifier key is an std::span, so only a reference to the + // real key. Hence we have to make a copy before passing it to another thread. + std::vector<const uint8_t> key_copy(key.begin(), key.end()); + GetUnpackerTaskRunner()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), std::move(key_copy))); +} + +void CrxInstaller::GetContentVerifierKey( + base::OnceCallback<void(ContentVerifierKey)> callback) { + if (!content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&CrxInstaller::GetContentVerifierKeyOnUI, + this, std::move(callback)))) { + NOTREACHED(); + } +} + void CrxInstaller::ShouldComputeHashesForOffWebstoreExtension( scoped_refptr<const Extension> extension, base::OnceCallback<void(bool)> callback) {
diff --git a/chrome/browser/extensions/crx_installer.h b/chrome/browser/extensions/crx_installer.h index c337780..ac9bc86 100644 --- a/chrome/browser/extensions/crx_installer.h +++ b/chrome/browser/extensions/crx_installer.h
@@ -287,7 +287,13 @@ void ShouldComputeHashesOnUI(scoped_refptr<const Extension> extension, base::OnceCallback<void(bool)> callback); + // To provide content verifier key to the unpacker. + void GetContentVerifierKeyOnUI( + base::OnceCallback<void(ContentVerifierKey)> callback); + // SandboxedUnpackerClient + void GetContentVerifierKey( + base::OnceCallback<void(ContentVerifierKey)> callback) override; void ShouldComputeHashesForOffWebstoreExtension( scoped_refptr<const Extension> extension, base::OnceCallback<void(bool)> callback) override;
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 02bdad1..d0b9a07 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc
@@ -907,7 +907,8 @@ unchanged.erase(extension_id); // Remove the extension from the blocklist. UpdateBlocklistedExtensions({}, unchanged); - OmahaAttributesHandler::ReportReenableExtensionFromMalware(); + OmahaAttributesHandler::ReportReenableExtension( + ExtensionUpdateCheckDataKey::kMalware); } void ExtensionService::ClearGreylistedAcknowledgedStateAndMaybeReenable(
diff --git a/chrome/browser/extensions/omaha_attributes_handler.cc b/chrome/browser/extensions/omaha_attributes_handler.cc index 6696610..bbf4545 100644 --- a/chrome/browser/extensions/omaha_attributes_handler.cc +++ b/chrome/browser/extensions/omaha_attributes_handler.cc
@@ -20,23 +20,38 @@ ExtensionUpdateCheckDataKey reason) { // Report that the extension is newly disabled due to Omaha attributes. if (should_be_remotely_disabled) - base::UmaHistogramEnumeration("Extensions.ExtensionDisabledRemotely", + base::UmaHistogramEnumeration("Extensions.ExtensionDisabledRemotely2", reason); // Report that the extension has added a new disable reason. - base::UmaHistogramEnumeration("Extensions.ExtensionAddDisabledRemotelyReason", - reason); + base::UmaHistogramEnumeration( + "Extensions.ExtensionAddDisabledRemotelyReason2", reason); } // static void OmahaAttributesHandler::ReportNoUpdateCheckKeys() { - base::UmaHistogramEnumeration("Extensions.ExtensionDisabledRemotely", + base::UmaHistogramEnumeration("Extensions.ExtensionDisabledRemotely2", ExtensionUpdateCheckDataKey::kNoKey); } // static -void OmahaAttributesHandler::ReportReenableExtensionFromMalware() { - base::UmaHistogramCounts100("Extensions.ExtensionReenabledRemotely", 1); +void OmahaAttributesHandler::ReportReenableExtension( + ExtensionUpdateCheckDataKey reason) { + const char* histogram = nullptr; + switch (reason) { + case ExtensionUpdateCheckDataKey::kMalware: + histogram = "Extensions.ExtensionReenabledRemotely"; + break; + case ExtensionUpdateCheckDataKey::kPotentiallyUWS: + histogram = "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS"; + break; + case ExtensionUpdateCheckDataKey::kPolicyViolation: + histogram = "Extensions.ExtensionReenabledRemotelyForPolicyViolation"; + break; + case ExtensionUpdateCheckDataKey::kNoKey: + NOTREACHED(); + } + base::UmaHistogramCounts100(histogram, 1); } // static @@ -74,50 +89,41 @@ const ExtensionId& extension_id, const base::Value& attributes) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - ReportPolicyViolationUWSOmahaAttributes(attributes); HandleGreylistOmahaAttribute( extension_id, attributes, extensions_features::kDisablePolicyViolationExtensionsRemotely, - BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION); + BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION, + ExtensionUpdateCheckDataKey::kPolicyViolation); HandleGreylistOmahaAttribute( extension_id, attributes, extensions_features::kDisablePotentiallyUwsExtensionsRemotely, - BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED); -} - -void OmahaAttributesHandler::ReportPolicyViolationUWSOmahaAttributes( - const base::Value& attributes) { - bool has_uws_value = HasOmahaBlocklistStateInAttributes( - attributes, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED); - if (has_uws_value) { - ReportExtensionDisabledRemotely( - /*should_be_remotely_disabled=*/false, - ExtensionUpdateCheckDataKey::kPotentiallyUWS); - } - bool has_pv_value = HasOmahaBlocklistStateInAttributes( - attributes, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION); - if (has_pv_value) { - ReportExtensionDisabledRemotely( - /*should_be_remotely_disabled=*/false, - ExtensionUpdateCheckDataKey::kPolicyViolation); - } + BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED, + ExtensionUpdateCheckDataKey::kPotentiallyUWS); } void OmahaAttributesHandler::HandleGreylistOmahaAttribute( const ExtensionId& extension_id, const base::Value& attributes, const base::Feature& feature_flag, - BitMapBlocklistState greylist_state) { + BitMapBlocklistState greylist_state, + ExtensionUpdateCheckDataKey reason) { bool has_attribute_value = HasOmahaBlocklistStateInAttributes(attributes, greylist_state); + bool has_omaha_blocklist_state = blocklist_prefs::HasOmahaBlocklistState( + extension_id, greylist_state, extension_prefs_); if (!base::FeatureList::IsEnabled(feature_flag) || !has_attribute_value) { - blocklist_prefs::RemoveOmahaBlocklistState(extension_id, greylist_state, - extension_prefs_); + if (has_omaha_blocklist_state) { + blocklist_prefs::RemoveOmahaBlocklistState(extension_id, greylist_state, + extension_prefs_); + ReportReenableExtension(reason); + } extension_service_->ClearGreylistedAcknowledgedStateAndMaybeReenable( extension_id); return; } + ReportExtensionDisabledRemotely( + /*should_be_remotely_disabled=*/!has_omaha_blocklist_state, reason); blocklist_prefs::AddOmahaBlocklistState(extension_id, greylist_state, extension_prefs_); extension_service_->MaybeDisableGreylistedExtension(extension_id,
diff --git a/chrome/browser/extensions/omaha_attributes_handler.h b/chrome/browser/extensions/omaha_attributes_handler.h index 01c06c0..2a3685e1 100644 --- a/chrome/browser/extensions/omaha_attributes_handler.h +++ b/chrome/browser/extensions/omaha_attributes_handler.h
@@ -53,7 +53,7 @@ static void ReportNoUpdateCheckKeys(); // Logs UMA metrics when a remotely disabled extension is re-enabled. - static void ReportReenableExtensionFromMalware(); + static void ReportReenableExtension(ExtensionUpdateCheckDataKey reason); // Checks whether the `state` is in the `attributes`. static bool HasOmahaBlocklistStateInAttributes(const base::Value& attributes, @@ -66,16 +66,16 @@ const base::Value& attributes); private: - void ReportPolicyViolationUWSOmahaAttributes(const base::Value& attributes); - // Performs action based on `attributes` for the `extension_id`. If the // extension is not in the `greylist_state` or the `feature_flag` is disabled, // remove it from the Omaha blocklist state and maybe re-enable it. Otherwise, - // add it to the Omaha blocklist state and maybe disable it. + // add it to the Omaha blocklist state and maybe disable it. `reason` is used + // for logging UMA metrics. void HandleGreylistOmahaAttribute(const ExtensionId& extension_id, const base::Value& attributes, const base::Feature& feature_flag, - BitMapBlocklistState greylist_state); + BitMapBlocklistState greylist_state, + ExtensionUpdateCheckDataKey reason); ExtensionPrefs* extension_prefs_ = nullptr; ExtensionService* extension_service_ = nullptr;
diff --git a/chrome/browser/extensions/omaha_attributes_handler_unittest.cc b/chrome/browser/extensions/omaha_attributes_handler_unittest.cc index 117caa62..84356c7 100644 --- a/chrome/browser/extensions/omaha_attributes_handler_unittest.cc +++ b/chrome/browser/extensions/omaha_attributes_handler_unittest.cc
@@ -47,16 +47,25 @@ service()->PerformActionBasedOnOmahaAttributes(kTestExtensionId, attributes); histograms.ExpectBucketCount( - "Extensions.ExtensionAddDisabledRemotelyReason", - /* sample */ ExtensionUpdateCheckDataKey::kPotentiallyUWS, - /* expected_count */ 1); + "Extensions.ExtensionDisabledRemotely2", + /*sample=*/ExtensionUpdateCheckDataKey::kPotentiallyUWS, + /*expected_count=*/1); histograms.ExpectBucketCount( - "Extensions.ExtensionAddDisabledRemotelyReason", - /* sample */ ExtensionUpdateCheckDataKey::kPolicyViolation, - /* expected_count */ 1); + "Extensions.ExtensionAddDisabledRemotelyReason2", + /*sample=*/ExtensionUpdateCheckDataKey::kPotentiallyUWS, + /*expected_count=*/1); + histograms.ExpectBucketCount( + "Extensions.ExtensionDisabledRemotely2", + /*sample=*/ExtensionUpdateCheckDataKey::kPolicyViolation, + /*expected_count=*/1); + histograms.ExpectBucketCount( + "Extensions.ExtensionAddDisabledRemotelyReason2", + /*sample=*/ExtensionUpdateCheckDataKey::kPolicyViolation, + /*expected_count=*/1); } TEST_F(OmahaAttributesHandlerUnitTest, DisableRemotelyForPolicyViolation) { + base::HistogramTester histograms; InitializeGoodInstalledExtensionService(); service()->Init(); @@ -84,9 +93,18 @@ EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState( kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_CWS_POLICY_VIOLATION, prefs)); + histograms.ExpectBucketCount( + "Extensions.ExtensionReenabledRemotelyForPolicyViolation", + /*sample=*/1, + /*expected_count=*/1); + histograms.ExpectBucketCount( + "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS", + /*sample=*/1, + /*expected_count=*/0); } TEST_F(OmahaAttributesHandlerUnitTest, DisableRemotelyForPotentiallyUws) { + base::HistogramTester histograms; InitializeGoodInstalledExtensionService(); service()->Init(); @@ -114,6 +132,14 @@ EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState( kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED, prefs)); + histograms.ExpectBucketCount( + "Extensions.ExtensionReenabledRemotelyForPotentiallyUWS", + /*sample=*/1, + /*expected_count=*/1); + histograms.ExpectBucketCount( + "Extensions.ExtensionReenabledRemotelyForPolicyViolation", + /*sample=*/1, + /*expected_count=*/0); } TEST_F(OmahaAttributesHandlerUnitTest, MultipleGreylistStates) { @@ -214,6 +240,7 @@ TEST_F(OmahaAttributesHandlerWithFeatureDisabledUnitTest, DoNotDisableRemotelyWhenFlagsDisabled) { + base::HistogramTester histograms; InitializeGoodInstalledExtensionService(); service()->Init(); @@ -231,6 +258,9 @@ EXPECT_FALSE(blocklist_prefs::HasOmahaBlocklistState( kTestExtensionId, BitMapBlocklistState::BLOCKLISTED_POTENTIALLY_UNWANTED, ExtensionPrefs::Get(profile()))); + // Histograms should not be logged when the flag is disabled. + histograms.ExpectTotalCount("Extensions.ExtensionAddDisabledRemotelyReason2", + /*expected_count=*/0); } } // namespace extensions
diff --git a/chrome/browser/feed/android/BUILD.gn b/chrome/browser/feed/android/BUILD.gn index 0eaa60ad..e443fbb 100644 --- a/chrome/browser/feed/android/BUILD.gn +++ b/chrome/browser/feed/android/BUILD.gn
@@ -10,6 +10,7 @@ android_library("java") { sources = [ "java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java", + "java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java", "java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java", "java/src/org/chromium/chrome/browser/feed/FeedUma.java", "java/src/org/chromium/chrome/browser/feed/VideoPreviewsType.java", @@ -88,6 +89,7 @@ generate_jni("jni_headers") { sources = [ "java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java", + "java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java", "java/src/org/chromium/chrome/browser/feed/FeedServiceBridge.java", "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedBridge.java", ] @@ -96,10 +98,7 @@ android_library("javatests") { testonly = true - sources = [ - "java/src/org/chromium/chrome/browser/feed/settings/FeedAutoplaySettingsFragmentTest.java", - "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java", - ] + sources = [ "java/src/org/chromium/chrome/browser/feed/settings/FeedAutoplaySettingsFragmentTest.java" ] deps = [ ":java", @@ -143,6 +142,7 @@ bypass_platform_checks = true sources = [ + "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java", "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java", "java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarControllerTest.java", ] @@ -154,6 +154,8 @@ "//base:base_junit_test_support", "//chrome/android:chrome_java", "//chrome/browser/feature_engagement:java", + "//chrome/browser/flags:java", + "//chrome/browser/preferences:java", "//chrome/browser/profiles/android:java", "//chrome/browser/settings:test_support_java", "//chrome/browser/tab:java", @@ -166,7 +168,9 @@ "//components/favicon/android:java", "//components/feature_engagement:feature_engagement_java", "//components/feed/core/v2:feedv2_core_java", + "//components/prefs/android:java", "//components/url_formatter/android:url_formatter_java", + "//components/user_prefs/android:java", "//content/public/test/android:content_java_test_support", "//third_party/android_deps:espresso_java", "//third_party/android_deps:robolectric_all_java",
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java new file mode 100644 index 0000000..f56db9e --- /dev/null +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedReliabilityLoggingBridge.java
@@ -0,0 +1,121 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.feed; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; +import org.chromium.chrome.browser.xsurface.FeedLaunchReliabilityLogger; +import org.chromium.chrome.browser.xsurface.FeedNetworkRequestReliabilityLogger; + +/** JNI bridge making reliability logging methods available to native code. */ +@JNINamespace("feed::android") +public class FeedReliabilityLoggingBridge { + private final long mNativePtr; + private FeedLaunchReliabilityLogger mLogger; + + public static org.chromium.base.JniStaticTestMocker<FeedReliabilityLoggingBridge.Natives> + getTestHooksForTesting() { + return FeedReliabilityLoggingBridgeJni.TEST_HOOKS; + } + + public FeedReliabilityLoggingBridge() { + // mLogger should be null until FeedStream.bind() calls setLogger(). We don't expect mLogger + // to be used until then. + mNativePtr = FeedReliabilityLoggingBridgeJni.get().init(this); + } + + public void setLogger(FeedLaunchReliabilityLogger logger) { + mLogger = logger; + } + + public long getNativePtr() { + return mNativePtr; + } + + public void destroy() { + FeedReliabilityLoggingBridgeJni.get().destroy(mNativePtr); + } + + @CalledByNative + public void sendPendingEvents(int streamType, int streamId) { + mLogger.sendPendingEvents(streamType, streamId); + } + + @CalledByNative + public void cancelPendingEvents() { + mLogger.cancelPendingEvents(); + } + + @CalledByNative + public void logCacheReadStart(long timestamp) { + mLogger.logCacheReadStart(timestamp); + } + + @CalledByNative + public void logCacheReadEnd(long timestamp, int cacheReadResult) { + mLogger.logCacheReadEnd(timestamp, cacheReadResult); + } + + @CalledByNative + public int logFeedRequestStart(long timestamp) { + return mLogger.logFeedQueryRequestStart(timestamp); + } + + @CalledByNative + public int logActionsUploadRequestStart(long timestamp) { + return mLogger.logActionsUploadRequestStart(timestamp); + } + + @CalledByNative + public void logRequestSent(int requestId, long timestamp) { + FeedNetworkRequestReliabilityLogger requestLogger = + mLogger.getNetworkRequestReliabilityLogger(requestId); + if (requestLogger != null) { + requestLogger.logRequestSent(timestamp); + } + } + + @CalledByNative + public void logResponseReceived(int requestId, long serverRecvTimestamp, + long serverSendTimestamp, long clientRecvTimestamp) { + FeedNetworkRequestReliabilityLogger requestLogger = + mLogger.getNetworkRequestReliabilityLogger(requestId); + if (requestLogger != null) { + requestLogger.logResponseReceived( + serverRecvTimestamp, serverSendTimestamp, clientRecvTimestamp); + } + } + + @CalledByNative + public void logRequestFinished(int requestId, long timestamp, int canonicalStatus) { + FeedNetworkRequestReliabilityLogger requestLogger = + mLogger.getNetworkRequestReliabilityLogger(requestId); + if (requestLogger != null) { + requestLogger.logRequestFinished(timestamp, canonicalStatus); + } + } + + @CalledByNative + public void logAtfRenderStart(long timestamp) { + mLogger.logAtfRenderStart(timestamp); + } + + @CalledByNative + public void logAtfRenderEnd(long timestamp, int aboveTheFoldRenderResult) { + mLogger.logAtfRenderEnd(timestamp, aboveTheFoldRenderResult); + } + + @CalledByNative + public void logLaunchFinished(long timestamp, int discoverLaunchResult) { + mLogger.logLaunchFinished(timestamp, discoverLaunchResult); + } + + @NativeMethods + public interface Natives { + long init(FeedReliabilityLoggingBridge thisRef); + void destroy(long nativeFeedReliabilityLoggingBridge); + } +} \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java index bce0f5c..fb64ad1 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
@@ -17,9 +17,11 @@ import static org.chromium.chrome.browser.feed.webfeed.WebFeedFollowIntroController.PARAM_DAILY_VISIT_MIN; import static org.chromium.chrome.browser.feed.webfeed.WebFeedFollowIntroController.PARAM_NUM_VISIT_MIN; +import android.app.Activity; import android.util.Base64; +import android.view.View; -import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; import org.junit.After; import org.junit.Before; @@ -29,43 +31,49 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.chromium.base.Callback; +import org.chromium.base.FeatureList; import org.chromium.base.supplier.ObservableSupplier; -import org.chromium.base.test.UiThreadTest; -import org.chromium.base.test.util.Batch; -import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; -import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feed.webfeed.WebFeedSnackbarController.FeedLauncher; import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.components.feature_engagement.FeatureConstants; import org.chromium.components.feature_engagement.Tracker; -import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.components.prefs.PrefService; +import org.chromium.components.user_prefs.UserPrefs; +import org.chromium.components.user_prefs.UserPrefsJni; +import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.url.GURL; +import org.chromium.url.JUnitTestGURLs; + +import java.util.HashMap; /** * Tests {@link WebFeedFollowIntroController}. */ -@RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -@Batch(Batch.PER_CLASS) +@RunWith(BaseRobolectricTestRunner.class) public final class WebFeedFollowIntroControllerTest { - @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + private static final GURL sTestUrl = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL); + private static final byte[] sWebFeedId = "webFeedId".getBytes(); + private static final SharedPreferencesManager sSharedPreferencesManager = + SharedPreferencesManager.getInstance(); @Rule public JniMocker mJniMocker = new JniMocker(); + @Mock FeedLauncher mFeedLauncher; @Mock @@ -76,30 +84,43 @@ private WebFeedBridge.Natives mWebFeedBridgeJniMock; @Mock private Tab mTab; + @Mock + private AppMenuHandler mAppMenuHandler; + @Mock + private SnackbarManager mSnackbarManager; + @Mock + private ModalDialogManager mDialogManager; + @Mock + private Profile mProfile; + @Mock + private PrefService mPrefService; + @Mock + private UserPrefs.Natives mUserPrefsJniMock; @Captor private ArgumentCaptor<WebFeedBridge.WebFeedPageInformation> mPageInformationCaptor; - private static final GURL sTestUrl = new GURL("https://www.example.com"); - private static final byte[] sWebFeedId = "webFeedId".getBytes(); - private static final SharedPreferencesManager sSharedPreferencesManager = - SharedPreferencesManager.getInstance(); - private int mNumVisitMin; private int mDailyVisitMin; - private AppMenuHandler mAppMenuHandler; - private ChromeTabbedActivity mActivity; + private Activity mActivity; private EmptyTabObserver mEmptyTabObserver; private FakeClock mClock; private WebFeedFollowIntroController mWebFeedFollowIntroController; @Before public void setUp() { - // TODO(harringtond): See if we can make this a robolectric test. + FeatureList.setTestFeatures(new HashMap<String, Boolean>()); + MockitoAnnotations.initMocks(this); mJniMocker.mock(WebFeedBridge.getTestHooksForTesting(), mWebFeedBridgeJniMock); - mActivityTestRule.startMainActivityOnBlankPage(); - mActivity = mActivityTestRule.getActivity(); - mAppMenuHandler = mActivityTestRule.getAppMenuCoordinator().getAppMenuHandler(); + mJniMocker.mock(UserPrefsJni.TEST_HOOKS, mUserPrefsJniMock); + + Profile.setLastUsedProfileForTesting(mProfile); + Mockito.when(mUserPrefsJniMock.get(mProfile)).thenReturn(mPrefService); + + Profile.setLastUsedProfileForTesting(mProfile); + mActivity = Robolectric.setupActivity(Activity.class); + // Required for resolving an attribute used in AppMenuItemText. + mActivity.setTheme(R.style.Theme_BrowserUI); mClock = new FakeClock(); when(mTracker.shouldTriggerHelpUI(FeatureConstants.IPH_WEB_FEED_FOLLOW_FEATURE)) .thenReturn(true); @@ -110,13 +131,8 @@ ChromeFeatureList.WEB_FEED, PARAM_NUM_VISIT_MIN, DEFAULT_NUM_VISIT_MIN); mDailyVisitMin = ChromeFeatureList.getFieldTrialParamByFeatureAsInt( ChromeFeatureList.WEB_FEED, PARAM_DAILY_VISIT_MIN, DEFAULT_DAILY_VISIT_MIN); - - TestThreadUtils.runOnUiThreadBlocking(() -> { - mWebFeedFollowIntroController = - new WebFeedFollowIntroController(mActivity, mAppMenuHandler, mTabSupplier, - mActivity.getToolbarManager().getMenuButtonView(), mFeedLauncher, - mActivity.getModalDialogManager(), mActivity.getSnackbarManager()); - }); + mWebFeedFollowIntroController = new WebFeedFollowIntroController(mActivity, mAppMenuHandler, + mTabSupplier, new View(mActivity), mFeedLauncher, mDialogManager, mSnackbarManager); mEmptyTabObserver = mWebFeedFollowIntroController.getEmptyTabObserverForTesting(); mWebFeedFollowIntroController.setClockForTesting(mClock); @@ -128,8 +144,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void meetsShowingRequirements_showsIntro() { prepareForMeetingIntroRequirements(); performScrollUpAfterDelay(WebFeedFollowIntroController.INTRO_WAIT_TIME_MS + 1); @@ -148,8 +163,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void notRecommended_doesNotShowIntro() { performScrollUpAfterDelay(WebFeedFollowIntroController.INTRO_WAIT_TIME_MS + 1); invokePageLoad(new WebFeedBridge.WebFeedMetadata(sWebFeedId, "title", sTestUrl, @@ -161,8 +175,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void subscribed_doesNotShowIntro() { performScrollUpAfterDelay(WebFeedFollowIntroController.INTRO_WAIT_TIME_MS + 1); invokePageLoad(new WebFeedBridge.WebFeedMetadata(sWebFeedId, "title", sTestUrl, @@ -174,8 +187,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void scrollUpWithoutDelay_doesNotShowIntro() { performScrollUpAfterDelay(0); @@ -184,8 +196,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void doesNotMeetVisitRequirements_doesNotShowIntro() { setRecommendableVisitCount( new WebFeedBridge.VisitCounts(mNumVisitMin - 1, mDailyVisitMin - 1)); @@ -196,8 +207,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void lastShownTimeTooClose_doesNotShowIntro() { setSharedPreferences(/*webFeedIntroLastShownTimeMs=*/mClock.currentTimeMillis(), /*webFeedIntroWebFeedIdShownTimeMs=*/0); @@ -208,8 +218,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void lastShownForWebFeedIdTimeTooClose_doesNotShowIntro() { setSharedPreferences(/*webFeedIntroLastShownTimeMs=*/0, /*webFeedIntroWebFeedIdShownTimeMs=*/mClock.currentTimeMillis()); @@ -220,8 +229,7 @@ } @Test - @MediumTest - @UiThreadTest + @SmallTest public void featureEngagementTrackerSaysDoNotShow_doesNotShowIntro() { when(mTracker.shouldTriggerHelpUI(FeatureConstants.IPH_WEB_FEED_FOLLOW_FEATURE)) .thenReturn(false);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 94f21f7..8ca85ef3 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -3981,7 +3981,7 @@ { "name": "omnibox-on-focus-suggestions-contextual-web", "owners": [ "tommycli", "chrome-omnibox-team@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 95 }, { "name": "omnibox-pedals-batch2", @@ -4496,12 +4496,27 @@ }, { "name": "related-searches", - "owners": [ "ayman", "donnd" ], + "owners": [ "donnd", "related-searches-vteam@google.com" ], + "expiry_milestone": 97 + }, + { + "name": "related-searches-alternate-ux", + "owners": [ "donnd", "related-searches-vteam@google.com" ], + "expiry_milestone": 97 + }, + { + "name": "related-searches-in-bar", + "owners": [ "donnd", "related-searches-vteam@google.com" ], + "expiry_milestone": 97 + }, + { + "name": "related-searches-simplified-ux", + "owners": [ "donnd", "related-searches-vteam@google.com" ], "expiry_milestone": 97 }, { "name": "related-searches-ui", - "owners": [ "ayman", "donnd" ], + "owners": [ "donnd", "related-searches-vteam@google.com" ], "expiry_milestone": 97 }, { @@ -4845,16 +4860,16 @@ "expiry_milestone" : 96 }, { - "name": "silent-debugger-extension-api", - "owners": [ "//extensions/OWNERS" ], - "expiry_milestone": 77 - }, - { "name": "simplify-sign-out-ios", "owners": [ "jlebel", "msarda", "fernandex" ], "expiry_milestone": 95 }, { + "name": "single-touch-select", + "owners": [ "donnd", "contextual-search-eng@google.com" ], + "expiry_milestone": 97 + }, + { "_comment1": "Shipping some form of Site Isolation to Android is tracked", "_comment2": "in https://crbug.com/849815.", "name": "site-isolation-trial-opt-out", @@ -4982,6 +4997,11 @@ "expiry_milestone": 82 }, { + "name": "tab-restore-sub-menus", + "owners": [ "emshack", "chrome-desktop-ui-sea" ], + "expiry_milestone": 99 + }, + { "name": "tabgrid-context-menu-ios", "owners": [ "mrefaat", "michaeldo", "bling-flags@google.com" ], "expiry_milestone": 95
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 926b51a..048f409f 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2241,12 +2241,6 @@ "If a page does a client side redirect or adds to the history without a " "user gesture, then skip it on back/forward UI."; -const char kSilentDebuggerExtensionApiName[] = "Silent Debugging"; -const char kSilentDebuggerExtensionApiDescription[] = - "Do not show the infobar when an extension attaches to a page via " - "chrome.debugger API. This is required to debug extension background " - "pages."; - const char kIsolateOriginsName[] = "Isolate additional origins"; const char kIsolateOriginsDescription[] = "Requires dedicated processes for an additional set of origins, " @@ -2407,6 +2401,11 @@ "Expands the range of situations in which tab outline strokes are " "displayed, improving accessiblity in dark and incognito mode."; +const char kTabRestoreSubMenusName[] = "Show app menu history sub menus"; +const char kTabRestoreSubMenusDescription[] = + "Show app menu history sub menus for the contents of recently closed tab " + "groups and windows."; + const char kTextFragmentColorChangeName[] = "Text Fragment color change"; const char kTextFragmentColorChangeDescription[] = "Changes the Text Fragment background color" @@ -3057,9 +3056,6 @@ const char kInterestFeedV2AutoplayName[] = "Interest Feed v2 Autoplay"; const char kInterestFeedV2AutoplayDescription[] = "Enable autoplay on Feedv2."; -const char kFeedShareName[] = "Share from feed"; -const char kFeedShareDescription[] = "Allow feed articles to be shared."; - const char kInterestFeedV1ClickAndViewActionsConditionalUploadName[] = "Interest Feed V1 clicks/views conditional upload"; const char kInterestFeedV1ClickAndViewActionsConditionalUploadDescription[] = @@ -3285,6 +3281,24 @@ "Enables requesting related searches suggestions. These will be requested " "but not shown unless the UI flag is also enabled."; +const char kRelatedSearchesAlternateUxName[] = + "Enables showing Related Searches in an alternate user experience."; +const char kRelatedSearchesAlternateUxDescription[] = + "Enables showing related searches with an alternative from the normal " + "user experience treatment."; + +const char kRelatedSearchesInBarName[] = + "Enables showing Related Searches in the peeking bar."; +const char kRelatedSearchesInBarDescription[] = + "Enables showing related searches suggestions in a carousel in the " + "peeking bar of the bottom sheet on Android."; + +const char kRelatedSearchesSimplifiedUxName[] = + "Enables showing Related Searches in a simplified user experience."; +const char kRelatedSearchesSimplifiedUxDescription[] = + "Enables showing related searches with a simplified form of the normal " + "user experience treatment."; + const char kRelatedSearchesUiName[] = "Forces showing of the Related Searches UI on Android"; const char kRelatedSearchesUiDescription[] = @@ -3322,6 +3336,11 @@ "When enabled, sets the market URL for use in testing the update menu " "item."; +const char kSingleTouchSelectName[] = + "Enables selecting plain text with a single touch."; +const char kSingleTouchSelectDescription[] = + "Enables selecting plain text with a single touch on Android."; + const char kSiteIsolationForPasswordSitesName[] = "Site Isolation For Password Sites"; const char kSiteIsolationForPasswordSitesDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 103b9547..5038925 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1285,9 +1285,6 @@ extern const char kHistoryManipulationIntervention[]; extern const char kHistoryManipulationInterventionDescription[]; -extern const char kSilentDebuggerExtensionApiName[]; -extern const char kSilentDebuggerExtensionApiDescription[]; - extern const char kStorageAccessAPIName[]; extern const char kStorageAccessAPIDescription[]; @@ -1386,6 +1383,9 @@ extern const char kTabOutlinesInLowContrastThemesName[]; extern const char kTabOutlinesInLowContrastThemesDescription[]; +extern const char kTabRestoreSubMenusName[]; +extern const char kTabRestoreSubMenusDescription[]; + extern const char kTextFragmentColorChangeName[]; extern const char kTextFragmentColorChangeDescription[]; @@ -1759,9 +1759,6 @@ extern const char kInterestFeedV2AutoplayName[]; extern const char kInterestFeedV2AutoplayDescription[]; -extern const char kFeedShareName[]; -extern const char kFeedShareDescription[]; - extern const char kInterestFeedV1ClickAndViewActionsConditionalUploadName[]; extern const char kInterestFeedV1ClickAndViewActionsConditionalUploadDescription[]; @@ -1884,9 +1881,21 @@ extern const char kRelatedSearchesName[]; extern const char kRelatedSearchesDescription[]; +extern const char kRelatedSearchesAlternateUxName[]; +extern const char kRelatedSearchesAlternateUxDescription[]; + +extern const char kRelatedSearchesInBarName[]; +extern const char kRelatedSearchesInBarDescription[]; + +extern const char kRelatedSearchesSimplifiedUxName[]; +extern const char kRelatedSearchesSimplifiedUxDescription[]; + extern const char kRelatedSearchesUiName[]; extern const char kRelatedSearchesUiDescription[]; +extern const char kSingleTouchSelectName[]; +extern const char kSingleTouchSelectDescription[]; + extern const char kRequestDesktopSiteForTabletsName[]; extern const char kRequestDesktopSiteForTabletsDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 3f6ba6f7..c4f1cc0 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -44,6 +44,7 @@ #include "components/reading_list/features/reading_list_switches.h" #include "components/safe_browsing/core/features.h" #include "components/security_state/core/features.h" +#include "components/send_tab_to_self/features.h" #include "components/shared_highlighting/core/common/shared_highlighting_features.h" #include "components/signin/public/base/account_consistency_method.h" #include "components/signin/public/base/signin_switches.h" @@ -216,6 +217,9 @@ &kReaderModeInCCT, &kReengagementNotification, &kRelatedSearches, + &kRelatedSearchesAlternateUx, + &kRelatedSearchesInBar, + &kRelatedSearchesSimplifiedUx, &kRelatedSearchesUi, &kSearchEnginePromoExistingDevice, &kSearchEnginePromoNewDevice, @@ -223,6 +227,7 @@ &kServiceManagerForDownload, &kShareButtonInTopToolbar, &kSharedClipboardUI, + &kSingleTouchSelect, &kSpannableInlineAutocomplete, &kSpecialLocaleWrapper, &kSpecialUserDecision, @@ -295,6 +300,7 @@ &query_tiles::features::kQueryTilesLocalOrdering, &query_tiles::features::kQueryTilesSegmentation, &reading_list::switches::kReadLater, + &send_tab_to_self::kSendTabToSelfV2, &signin::kMobileIdentityConsistency, &signin::kMobileIdentityConsistencyVar, &signin::kMobileIdentityConsistencyFRE, @@ -604,6 +610,15 @@ const base::Feature kRelatedSearches{"RelatedSearches", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kRelatedSearchesAlternateUx{ + "RelatedSearchesAlternateUx", base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kRelatedSearchesInBar{"RelatedSearchesInBar", + base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kRelatedSearchesSimplifiedUx{ + "RelatedSearchesSimplifiedUx", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kRelatedSearchesUi{"RelatedSearchesUi", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -616,6 +631,9 @@ const base::Feature kShareButtonInTopToolbar{"ShareButtonInTopToolbar", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kSingleTouchSelect{"SingleTouchSelect", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kSpannableInlineAutocomplete{ "SpannableInlineAutocomplete", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 671150b..7a33769 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -106,12 +106,16 @@ extern const base::Feature kReengagementNotification; extern const base::Feature kReaderModeInCCT; extern const base::Feature kRelatedSearches; +extern const base::Feature kRelatedSearchesAlternateUx; +extern const base::Feature kRelatedSearchesInBar; +extern const base::Feature kRelatedSearchesSimplifiedUx; extern const base::Feature kRelatedSearchesUi; extern const base::Feature kSearchEnginePromoExistingDevice; extern const base::Feature kSearchEnginePromoNewDevice; extern const base::Feature kServiceManagerForBackgroundPrefetch; extern const base::Feature kServiceManagerForDownload; extern const base::Feature kShareButtonInTopToolbar; +extern const base::Feature kSingleTouchSelect; extern const base::Feature kSpannableInlineAutocomplete; extern const base::Feature kSpecialLocaleWrapper; extern const base::Feature kSpecialUserDecision;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 4f4a11e0..ee54706 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -432,6 +432,9 @@ public static final String RECOVER_FROM_NEVER_SAVE_ANDROID = "RecoverFromNeverSaveAndroid"; public static final String REENGAGEMENT_NOTIFICATION = "ReengagementNotification"; public static final String RELATED_SEARCHES = "RelatedSearches"; + public static final String RELATED_SEARCHES_ALTERNATE_UX = "RelatedSearchesAlternateUx"; + public static final String RELATED_SEARCHES_IN_BAR = "RelatedSearchesInBar"; + public static final String RELATED_SEARCHES_SIMPLIFIED_UX = "RelatedSearchesSimplifiedUx"; public static final String RELATED_SEARCHES_UI = "RelatedSearchesUi"; public static final String REQUEST_DESKTOP_SITE_FOR_TABLETS = "RequestDesktopSiteForTablets"; public static final String SAFE_BROWSING_DELAYED_WARNINGS = "SafeBrowsingDelayedWarnings"; @@ -440,6 +443,7 @@ public static final String SEARCH_ENGINE_PROMO_NEW_DEVICE = "SearchEnginePromo.NewDevice"; public static final String SEARCH_HISTORY_LINK = "SearchHistoryLink"; public static final String SEND_TAB_TO_SELF = "SyncSendTabToSelf"; + public static final String SEND_TAB_TO_SELF_V2 = "SendTabToSelfV2"; public static final String SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH = "ServiceManagerForBackgroundPrefetch"; public static final String SERVICE_MANAGER_FOR_DOWNLOAD = "ServiceManagerForDownload"; @@ -447,6 +451,7 @@ public static final String SHARE_USAGE_RANKING = "ShareUsageRanking"; public static final String SHARED_CLIPBOARD_UI = "SharedClipboardUI"; public static final String SHARED_HIGHLIGHTING_V2 = "SharedHighlightingV2"; + public static final String SINGLE_TOUCH_SELECT = "SingleTouchSelect"; public static final String SHOW_TRUSTED_PUBLISHER_URL = "ShowTrustedPublisherURL"; public static final String SMART_SUGGESTION_FOR_LARGE_DOWNLOADS = "SmartSuggestionForLargeDownloads";
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java index 1b1fbdf..a5c006c 100644 --- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java +++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java
@@ -80,29 +80,6 @@ mDelegate.getChipRenderParams(lensQueryParams, chipRenderParamsCallback); } - // TODO(b/182675578): Deprecated. Switch to use the one without requiresConfirmation - /** - * Get a deeplink intent to Google Lens with an optional content provider image - * URI. The intent should be constructed immediately before the intent is fired - * to ensure that the launch timestamp is accurate. - * - * @param imageUri The content provider URI generated by chrome (or empty URI) if only resolving - * the activity. - * @param isIncognito Whether the current tab is in incognito mode. - * @param srcUrl The 'src' attribute of the image. - * @param requiresConfirmation Whether the request requires an confirmation dialog. - * @param titleOrAltText The 'title' or, if empty, the 'alt' attribute of the image. - * @param pageUrl The url of the current page. - * @param lensIntentType The intent type of the request. - * @return The intent to Google Lens. - */ - public Intent getShareWithGoogleLensIntent(Uri imageUri, boolean isIncognito, String srcUrl, - boolean requiresConfirmation, String titleOrAltText, String pageUrl, - @Nullable String lensIntentType) { - return mDelegate.getShareWithGoogleLensIntent(imageUri, isIncognito, srcUrl, - requiresConfirmation, titleOrAltText, pageUrl, lensIntentType); - } - // TODO(benwgold): Delete this function after internal code is switched over. /** * Get a deeplink intent to Google Lens with an optional content provider image
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java index d2381e8..2746e9d 100644 --- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java +++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensControllerDelegate.java
@@ -55,13 +55,6 @@ /** @see {@link LensController#getShareWithGoogleLensIntent()} */ public Intent getShareWithGoogleLensIntent(Uri imageUri, boolean isIncognito, String srcUrl, - boolean requiresConfirmation, String titleOrAltText, String pageUrl, - @Nullable String lensIntentType) { - return null; - } - - /** @see {@link LensController#getShareWithGoogleLensIntent()} */ - public Intent getShareWithGoogleLensIntent(Uri imageUri, boolean isIncognito, String srcUrl, String titleOrAltText, String pageUrl, @Nullable String lensIntentType) { return null; }
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java index 5967bd4..ca45c61 100644 --- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java +++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java
@@ -39,36 +39,13 @@ private @LensEntryPoint int mLensEntryPoint; private boolean mIsTablet; - // TODO(yusuyoutube): remove this constructor once downstream references are updated. - public Builder() {} - - // TODO(yusuyoutube): remove this constructor once downstream references are updated. - public Builder(@LensEntryPoint int lensEntryPoint, boolean isIncognito) { - this(); - this.mLensEntryPoint = lensEntryPoint; - this.mIsIncognito = isIncognito; - } - - // TODO(yusuyoutube): remove the with* methods for the required params once - // downstream references are updated. public Builder(@LensEntryPoint int lensEntryPoint, boolean isIncognito, boolean isTablet) { - this(); this.mLensEntryPoint = lensEntryPoint; this.mIsIncognito = isIncognito; this.mIsTablet = isTablet; } /** - * Sets the Lens entry point. - * - * @param lensEntryPoint The entry point to set as a parameter - */ - public Builder withLensEntryPoint(@LensEntryPoint int lensEntryPoint) { - this.mLensEntryPoint = lensEntryPoint; - return this; - } - - /** * Sets the image URI. * * @param imageUri The image URI to set as a parameter @@ -128,11 +105,6 @@ return this; } - public Builder withIsIncognito(boolean isIncognito) { - this.mIsIncognito = isIncognito; - return this; - } - /** * Build LensQueryParams object from parameters set. */
diff --git a/chrome/browser/lite_video/lite_video_decider_unittest.cc b/chrome/browser/lite_video/lite_video_decider_unittest.cc index 9e079be..25d77833 100644 --- a/chrome/browser/lite_video/lite_video_decider_unittest.cc +++ b/chrome/browser/lite_video/lite_video_decider_unittest.cc
@@ -401,8 +401,12 @@ "LiteVideo.CanApplyLiteVideo.HintCache.HasHint", true, 1); } -TEST_F(LiteVideoDeciderTest, LiteVideoDisabled) { - DisableLiteVideo(); +class LiteVideoDeciderDisabledTest : public LiteVideoDeciderTest { + public: + LiteVideoDeciderDisabledTest() { DisableLiteVideo(); } +}; + +TEST_F(LiteVideoDeciderDisabledTest, LiteVideoDisabled) { base::HistogramTester histogram_tester; SetBlocklistReason(lite_video::LiteVideoBlocklistReason::kAllowed); GURL url("https://LiteVideo.com");
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc index 75b5507..7cb2f85 100644 --- a/chrome/browser/media/encrypted_media_browsertest.cc +++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -282,12 +282,6 @@ title_watcher->AlsoWaitForTitle(kEmeRenewalMissingHeader); } - void SetUpCommandLine(base::CommandLine* command_line) override { - MediaBrowserTest::SetUpCommandLine(command_line); - command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, - "EncryptedMediaHdcpPolicyCheck"); - } - #if BUILDFLAG(ENABLE_LIBRARY_CDMS) void SetUpDefaultCommandLine(base::CommandLine* command_line) override { base::CommandLine default_command_line(base::CommandLine::NO_PROGRAM);
diff --git a/chrome/browser/media/protected_media_identifier_permission_context.cc b/chrome/browser/media/protected_media_identifier_permission_context.cc index c255d28..c98e0f5 100644 --- a/chrome/browser/media/protected_media_identifier_permission_context.cc +++ b/chrome/browser/media/protected_media_identifier_permission_context.cc
@@ -23,6 +23,7 @@ #include "media/base/media_switches.h" #include "net/base/url_util.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom.h" + #if BUILDFLAG(IS_CHROMEOS_ASH) #include <utility> @@ -35,7 +36,9 @@ #include "components/permissions/permission_uma_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/user_prefs/user_prefs.h" -#elif !defined(OS_ANDROID) && !defined(OS_WIN) +#endif + +#if !(defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_CHROMEOS)) #error This file currently only supports Chrome OS, Android and Windows. #endif
diff --git a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc index b86473a..fe5db806 100644 --- a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc +++ b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc
@@ -4,20 +4,23 @@ #include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h" -#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" -#include "chrome/browser/permissions/permission_manager_factory.h" -#include "chrome/browser/profiles/profile.h" #include "components/permissions/permission_manager.h" #include "components/permissions/permission_request_id.h" #include "components/permissions/permissions_client.h" +#include "components/webrtc/media_stream_device_enumerator.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h" CameraPanTiltZoomPermissionContext::CameraPanTiltZoomPermissionContext( - content::BrowserContext* browser_context) + content::BrowserContext* browser_context, + const webrtc::MediaStreamDeviceEnumerator* device_enumerator) : PermissionContextBase(browser_context, ContentSettingsType::CAMERA_PAN_TILT_ZOOM, - blink::mojom::PermissionsPolicyFeature::kNotFound) { + blink::mojom::PermissionsPolicyFeature::kNotFound), + device_enumerator_(device_enumerator) { + DCHECK(device_enumerator_); host_content_settings_map_ = permissions::PermissionsClient::Get()->GetSettingsMap(browser_context); content_setting_observer_registered_by_subclass_ = true; @@ -48,8 +51,8 @@ content::RenderFrameHost* frame = content::RenderFrameHost::FromID( id.render_process_id(), id.render_frame_id()); permissions::PermissionManager* permission_manager = - PermissionManagerFactory::GetForProfile( - Profile::FromBrowserContext(web_contents->GetBrowserContext())); + permissions::PermissionsClient::Get()->GetPermissionManager( + web_contents->GetBrowserContext()); permission_manager->RequestPermission(ContentSettingsType::MEDIASTREAM_CAMERA, frame, requesting_frame_origin, user_gesture, std::move(callback)); @@ -143,7 +146,7 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); const std::vector<blink::MediaStreamDevice> devices = - MediaCaptureDevicesDispatcher::GetInstance()->GetVideoCaptureDevices(); + device_enumerator_->GetVideoCaptureDevices(); for (const blink::MediaStreamDevice& device : devices) { if (device.video_control_support.pan || device.video_control_support.tilt || device.video_control_support.zoom) {
diff --git a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h index 456054d3..dfc412a 100644 --- a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h +++ b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h
@@ -10,14 +10,21 @@ #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/permissions/permission_context_base.h" +namespace webrtc { +class MediaStreamDeviceEnumerator; +} // namespace webrtc + // Manage user permissions that only control camera movement (pan, tilt, and // zoom). Those permissions are automatically reset when the "regular" camera // permission is blocked or reset. class CameraPanTiltZoomPermissionContext : public permissions::PermissionContextBase { public: - explicit CameraPanTiltZoomPermissionContext( - content::BrowserContext* browser_context); + // Constructs a CameraPanTiltZoomPermissionContext for |browser_context|. Note + // that the passed in |device_enumerator| must outlive |this|. + CameraPanTiltZoomPermissionContext( + content::BrowserContext* browser_context, + const webrtc::MediaStreamDeviceEnumerator* device_enumerator); ~CameraPanTiltZoomPermissionContext() override; CameraPanTiltZoomPermissionContext( @@ -54,6 +61,9 @@ bool updating_camera_ptz_permission_ = false; bool updating_mediastream_camera_permission_ = false; + + // Enumerates available media devices. Must outlive |this|. + const webrtc::MediaStreamDeviceEnumerator* const device_enumerator_; }; #endif // CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
diff --git a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc index 717129c8..8d9c964 100644 --- a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc +++ b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context_unittest.cc
@@ -4,11 +4,12 @@ #include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h" -#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" +#include "components/permissions/permissions_client.h" +#include "components/webrtc/media_stream_device_enumerator_impl.h" namespace { @@ -23,14 +24,17 @@ // Waits until a change is observed for a specific content setting type. class ContentSettingsChangeWaiter : public content_settings::Observer { public: - explicit ContentSettingsChangeWaiter(Profile* profile, + explicit ContentSettingsChangeWaiter(content::BrowserContext* browser_context, ContentSettingsType content_type) - : profile_(profile), content_type_(content_type) { - HostContentSettingsMapFactory::GetForProfile(profile)->AddObserver(this); + : browser_context_(browser_context), content_type_(content_type) { + permissions::PermissionsClient::Get() + ->GetSettingsMap(browser_context_) + ->AddObserver(this); } ~ContentSettingsChangeWaiter() override { - HostContentSettingsMapFactory::GetForProfile(profile_)->RemoveObserver( - this); + permissions::PermissionsClient::Get() + ->GetSettingsMap(browser_context_) + ->RemoveObserver(this); } void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern, @@ -45,7 +49,7 @@ private: void Proceed() { run_loop_.Quit(); } - Profile* profile_; + content::BrowserContext* browser_context_; ContentSettingsType content_type_; base::RunLoop run_loop_; @@ -62,7 +66,8 @@ ContentSetting content_setting) { GURL url("https://www.example.com"); HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(profile()); + permissions::PermissionsClient::Get()->GetSettingsMap( + browser_context()); content_settings->SetContentSettingDefaultScope( url, GURL(), content_settings_type, content_setting); } @@ -70,11 +75,19 @@ ContentSetting GetContentSetting(ContentSettingsType content_settings_type) { GURL url("https://www.example.com"); HostContentSettingsMap* content_settings = - HostContentSettingsMapFactory::GetForProfile(profile()); + permissions::PermissionsClient::Get()->GetSettingsMap( + browser_context()); return content_settings->GetContentSetting(url.GetOrigin(), url.GetOrigin(), content_settings_type); } + const webrtc::MediaStreamDeviceEnumerator* device_enumerator() const { + return &device_enumerator_; + } + + private: + webrtc::MediaStreamDeviceEnumeratorImpl device_enumerator_; + DISALLOW_COPY_AND_ASSIGN(CameraPanTiltZoomPermissionContextTests); }; @@ -85,8 +98,9 @@ }; TEST_P(CameraContentSettingTests, TestResetPermissionOnCameraChange) { - CameraPanTiltZoomPermissionContext permission_context(profile()); - ContentSettingsChangeWaiter waiter(profile(), + CameraPanTiltZoomPermissionContext permission_context(browser_context(), + device_enumerator()); + ContentSettingsChangeWaiter waiter(browser_context(), ContentSettingsType::MEDIASTREAM_CAMERA); SetContentSetting(ContentSettingsType::CAMERA_PAN_TILT_ZOOM, @@ -123,8 +137,9 @@ TEST_P(CameraPanTiltZoomContentSettingTests, TestCameraPermissionOnCameraPanTiltZoomChange) { - CameraPanTiltZoomPermissionContext permission_context(profile()); - ContentSettingsChangeWaiter waiter(profile(), + CameraPanTiltZoomPermissionContext permission_context(browser_context(), + device_enumerator()); + ContentSettingsChangeWaiter waiter(browser_context(), ContentSettingsType::CAMERA_PAN_TILT_ZOOM); SetContentSetting(ContentSettingsType::MEDIASTREAM_CAMERA, GetParam().first);
diff --git a/chrome/browser/net/network_request_metrics_browsertest.cc b/chrome/browser/net/network_request_metrics_browsertest.cc index 0a030c8..4ed16a4 100644 --- a/chrome/browser/net/network_request_metrics_browsertest.cc +++ b/chrome/browser/net/network_request_metrics_browsertest.cc
@@ -412,16 +412,19 @@ IN_PROC_BROWSER_TEST_P(NetworkRequestMetricsBrowserTest, InterruptedBeforeHeaders) { + TestNavigationObserver navigation_observer(active_web_contents(), 1); StartNavigatingAndWaitForRequest(); // Stop navigation to record histograms. active_web_contents()->Stop(); + navigation_observer.Wait(); CheckHistogramsAfterMainFrameInterruption(); } IN_PROC_BROWSER_TEST_P(NetworkRequestMetricsBrowserTest, InterruptedCancelDuringBody) { + TestNavigationObserver navigation_observer(active_web_contents(), 1); StartNavigatingAndWaitForRequest(); SendHeadersPartialBody(); @@ -435,6 +438,7 @@ // Stop navigation to record histograms. active_web_contents()->Stop(); + navigation_observer.Wait(); CheckHistogramsAfterMainFrameInterruption(); }
diff --git a/chrome/browser/notifications/notification_display_service_impl.cc b/chrome/browser/notifications/notification_display_service_impl.cc index d124bf17..d45145f 100644 --- a/chrome/browser/notifications/notification_display_service_impl.cc +++ b/chrome/browser/notifications/notification_display_service_impl.cc
@@ -63,9 +63,7 @@ // static void NotificationDisplayServiceImpl::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { -// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch -// of lacros-chrome is complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if defined(OS_LINUX) registry->RegisterBooleanPref(prefs::kAllowNativeNotifications, true); registry->RegisterBooleanPref(prefs::kAllowSystemNotifications, true); #endif
diff --git a/chrome/browser/notifications/notification_platform_bridge_delegator.cc b/chrome/browser/notifications/notification_platform_bridge_delegator.cc index e5ccd2a..569158a 100644 --- a/chrome/browser/notifications/notification_platform_bridge_delegator.cc +++ b/chrome/browser/notifications/notification_platform_bridge_delegator.cc
@@ -52,12 +52,12 @@ // the platforms supported by the browser. bool SystemNotificationsEnabled(Profile* profile) { #if BUILDFLAG(ENABLE_SYSTEM_NOTIFICATIONS) -#if BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_ANDROID) +#if defined(OS_CHROMEOS) || defined(OS_ANDROID) return true; #elif defined(OS_WIN) return NotificationPlatformBridgeWin::SystemNotificationEnabled(); #else -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if defined(OS_LINUX) if (profile) { // Prefs take precedence over flags. PrefService* prefs = profile->GetPrefs();
diff --git a/chrome/browser/notifications/notification_platform_bridge_lacros.cc b/chrome/browser/notifications/notification_platform_bridge_lacros.cc index cee679d..9e566001 100644 --- a/chrome/browser/notifications/notification_platform_bridge_lacros.cc +++ b/chrome/browser/notifications/notification_platform_bridge_lacros.cc
@@ -207,7 +207,9 @@ void NotificationPlatformBridgeLacros::SetReadyCallback( NotificationBridgeReadyCallback callback) { - std::move(callback).Run(!!message_center_remote_); + // Always return success even if |message_center_remote_| is not valid as we + // don't have another way of displaying notifications on ChromeOS via Lacros. + std::move(callback).Run(/*success=*/true); } void NotificationPlatformBridgeLacros::DisplayServiceShutDown(
diff --git a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc index 5a8a12f..b53ad238 100644 --- a/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer.cc
@@ -118,7 +118,6 @@ received_data_length, received_data_length + data_reduction_proxy_bytes_saved, data_reduction_proxy_settings->IsDataReductionProxyEnabled(), - data_reduction_proxy::VIA_DATA_REDUCTION_PROXY, std::string() /* mime_type */, true /*is_user_traffic*/, data_use_measurement::DataUseUserData::OTHER, 0); } @@ -169,8 +168,7 @@ ->UpdateContentLengths( 0, savings_to_report, data_reduction_proxy_settings->IsDataReductionProxyEnabled(), - data_reduction_proxy::HTTPS, std::string() /* mime_type */, - true /*is_user_traffic*/, + std::string() /* mime_type */, true /*is_user_traffic*/, data_use_measurement::DataUseUserData::OTHER, 0); }
diff --git a/chrome/browser/permissions/permission_manager_factory.cc b/chrome/browser/permissions/permission_manager_factory.cc index 2435414..e847df5 100644 --- a/chrome/browser/permissions/permission_manager_factory.cc +++ b/chrome/browser/permissions/permission_manager_factory.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/display_capture/display_capture_permission_context.h" #include "chrome/browser/idle/idle_detection_permission_context.h" #include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h" +#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" #include "chrome/browser/nfc/chrome_nfc_permission_context_delegate.h" #include "chrome/browser/notifications/notification_permission_context.h" @@ -40,7 +41,7 @@ #include "components/permissions/permission_manager.h" #include "ppapi/buildflags/buildflags.h" -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) #include "chrome/browser/media/protected_media_identifier_permission_context.h" #endif @@ -77,7 +78,7 @@ std::make_unique<GeolocationPermissionContextDelegateAndroid>( profile)); #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_ANDROID) || defined(OS_WIN) +#if defined(OS_CHROMEOS) || defined(OS_ANDROID) || defined(OS_WIN) permission_contexts[ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER] = std::make_unique<ProtectedMediaIdentifierPermissionContext>(profile); #endif @@ -134,7 +135,8 @@ permission_contexts[ContentSettingsType::STORAGE_ACCESS] = std::make_unique<StorageAccessGrantPermissionContext>(profile); permission_contexts[ContentSettingsType::CAMERA_PAN_TILT_ZOOM] = - std::make_unique<CameraPanTiltZoomPermissionContext>(profile); + std::make_unique<CameraPanTiltZoomPermissionContext>( + profile, MediaCaptureDevicesDispatcher::GetInstance()); permission_contexts[ContentSettingsType::WINDOW_PLACEMENT] = std::make_unique<WindowPlacementPermissionContext>(profile); permission_contexts[ContentSettingsType::FONT_ACCESS] =
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 50b2b19..aec7a020 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2066,9 +2066,7 @@ policy::key::kSpellcheckLanguageBlocklist)); #endif // BUILDFLAG(ENABLE_SPELLCHECK) -// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch -// of lacros-chrome is complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if defined(OS_LINUX) handlers->AddHandler(std::make_unique<SimpleDeprecatingPolicyHandler>( std::make_unique<SimplePolicyHandler>(key::kAllowNativeNotifications, prefs::kAllowNativeNotifications, @@ -2076,7 +2074,7 @@ std::make_unique<SimplePolicyHandler>(key::kAllowSystemNotifications, prefs::kAllowSystemNotifications, base::Value::Type::BOOLEAN))); -#endif // defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#endif // defined(OS_LINUX) return handlers; }
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 558d8cd..7c2f450 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -583,6 +583,9 @@ const char kSpellCheckBlacklistedDictionaries[] = "spellcheck.blacklisted_dictionaries"; +// Deprecated 06/2021. +const char kDataReductionProxy[] = "auth.spdyproxy.origin"; + // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { @@ -727,6 +730,8 @@ registry->RegisterListPref( prefs::kManagedProfileSerialAllowUsbDevicesForUrlsDeprecated); #endif + + registry->RegisterStringPref(kDataReductionProxy, std::string()); } } // namespace @@ -1463,6 +1468,9 @@ prefs::kManagedProfileSerialAllowUsbDevicesForUrlsDeprecated); #endif + // Added 06/2021 + profile_prefs->ClearPref(kDataReductionProxy); + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS }
diff --git a/chrome/browser/prefs/chrome_command_line_pref_store.cc b/chrome/browser/prefs/chrome_command_line_pref_store.cc index cb42f4ff..54563c1 100644 --- a/chrome/browser/prefs/chrome_command_line_pref_store.cc +++ b/chrome/browser/prefs/chrome_command_line_pref_store.cc
@@ -45,8 +45,6 @@ const CommandLinePrefStore::SwitchToPreferenceMapEntry ChromeCommandLinePrefStore::string_switch_map_[] = { {switches::kLang, language::prefs::kApplicationLocale}, - {data_reduction_proxy::switches::kDataReductionProxy, - data_reduction_proxy::prefs::kDataReductionProxy}, {switches::kAuthServerAllowlist, prefs::kAuthServerAllowlist}, {switches::kSSLVersionMin, prefs::kSSLVersionMin}, {switches::kSSLVersionMax, prefs::kSSLVersionMax},
diff --git a/chrome/browser/printing/print_backend_service_manager.cc b/chrome/browser/printing/print_backend_service_manager.cc index 4528711..3723f03 100644 --- a/chrome/browser/printing/print_backend_service_manager.cc +++ b/chrome/browser/printing/print_backend_service_manager.cc
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/time/time.h" +#include "base/unguessable_token.h" #include "build/build_config.h" #include "chrome/browser/service_sandbox_type.h" #include "chrome/grit/generated_resources.h" @@ -77,13 +78,7 @@ kPrintBackendRequiresElevatedPrivilegeHistogramName, /*sample=*/false); } - std::string remote_id; -#if defined(OS_WIN) - // Windows drivers are not thread safe. Use a process per driver to prevent - // bad interactions when interfacing to multiple drivers in parallel. - // https://crbug.com/957242 - remote_id = printer_name; -#endif + std::string remote_id = GetRemoteIdForPrinterName(printer_name); auto iter = remote.find(remote_id); if (iter == remote.end()) { // First time for this `remote_id`. @@ -134,29 +129,30 @@ return service; } -void PrintBackendServiceManager::OnIdleTimeout(bool sandboxed, - const std::string& remote_id) { - DVLOG(1) << "Print Backend service idle timeout for " - << (sandboxed ? "sandboxed" : "unsandboxed") << " remote id " - << remote_id; - if (sandboxed) { - sandboxed_remotes_.erase(remote_id); - } else { - unsandboxed_remotes_.erase(remote_id); - } -} +void PrintBackendServiceManager::FetchCapabilities( + const std::string& locale, + const std::string& printer_name, + mojom::PrintBackendService::FetchCapabilitiesCallback callback) { + // Need to be able to run the callback either after a successful return from + // the service or after the remote was disconnected, so save it here for + // either eventuality. + // Get a callback ID to represent this command. + auto saved_callback_id = base::UnguessableToken::Create(); -void PrintBackendServiceManager::OnRemoteDisconnected( - bool sandboxed, - const std::string& remote_id) { - DVLOG(1) << "Print Backend service disconnected for " - << (sandboxed ? "sandboxed" : "unsandboxed") << " remote id " - << remote_id; - if (sandboxed) { - sandboxed_remotes_.erase(remote_id); - } else { - unsandboxed_remotes_.erase(remote_id); - } + // Note that `GetService()` will set state internally if this is sandboxed. + std::string remote_id = GetRemoteIdForPrinterName(printer_name); + auto& service = GetService(locale, printer_name); + + SaveFetchCapabilitiesCallback(remote_id, saved_callback_id, + std::move(callback)); + + DVLOG(1) << "Sending FetchCapabilities on remote `" << remote_id + << "`, saved callback ID of " << saved_callback_id; + service->FetchCapabilities( + printer_name, + base::BindOnce(&PrintBackendServiceManager::FetchCapabilitiesDone, + base::Unretained(this), is_sandboxed_service_, remote_id, + saved_callback_id)); } bool PrintBackendServiceManager::PrinterDriverRequiresElevatedPrivilege( @@ -180,11 +176,17 @@ void PrintBackendServiceManager::SetServiceForTesting( mojo::Remote<printing::mojom::PrintBackendService>* remote) { sandboxed_service_remote_for_test_ = remote; + sandboxed_service_remote_for_test_->set_disconnect_handler(base::BindOnce( + &PrintBackendServiceManager::OnRemoteDisconnected, base::Unretained(this), + /*sandboxed=*/true, /*remote_id=*/std::string())); } void PrintBackendServiceManager::SetServiceForFallbackTesting( mojo::Remote<printing::mojom::PrintBackendService>* remote) { unsandboxed_service_remote_for_test_ = remote; + unsandboxed_service_remote_for_test_->set_disconnect_handler(base::BindOnce( + &PrintBackendServiceManager::OnRemoteDisconnected, base::Unretained(this), + /*sandboxed=*/false, /*remote_id=*/std::string())); } // static @@ -204,4 +206,119 @@ } } +std::string PrintBackendServiceManager::GetRemoteIdForPrinterName( + const std::string& printer_name) const { + if (sandboxed_service_remote_for_test_) { + return std::string(); // Test environment is always just one instance for + // all printers. + } + +#if defined(OS_WIN) + // Windows drivers are not thread safe. Use a + // process per driver to prevent bad interactions + // when interfacing to multiple drivers in parallel. + // https://crbug.com/957242 + return printer_name; +#else + return std::string(); +#endif +} + +void PrintBackendServiceManager::OnIdleTimeout(bool sandboxed, + const std::string& remote_id) { + DVLOG(1) << "Print Backend service idle timeout for " + << (sandboxed ? "sandboxed" : "unsandboxed") << " remote id " + << remote_id; + if (sandboxed) { + sandboxed_remotes_.erase(remote_id); + } else { + unsandboxed_remotes_.erase(remote_id); + } +} + +void PrintBackendServiceManager::OnRemoteDisconnected( + bool sandboxed, + const std::string& remote_id) { + DVLOG(1) << "Print Backend service disconnected for " + << (sandboxed ? "sandboxed" : "unsandboxed") << " remote id " + << remote_id; + if (sandboxed) { + sandboxed_remotes_.erase(remote_id); + } else { + unsandboxed_remotes_.erase(remote_id); + } + RunSavedFetchCapabilitiesCallbacks(sandboxed, remote_id); +} + +PrintBackendServiceManager::RemoteSavedFetchCapabilitiesCallbacks& +PrintBackendServiceManager::GetRemoteSavedFetchCapabilitiesCallbacks( + bool sandboxed) { + return sandboxed ? sandboxed_saved_fetch_capabilities_callbacks_ + : unsandboxed_saved_fetch_capabilities_callbacks_; +} + +void PrintBackendServiceManager::SaveFetchCapabilitiesCallback( + const std::string& remote_id, + const base::UnguessableToken& saved_callback_id, + mojom::PrintBackendService::FetchCapabilitiesCallback callback) { + RemoteSavedFetchCapabilitiesCallbacks& saved_callbacks = + GetRemoteSavedFetchCapabilitiesCallbacks(is_sandboxed_service_); + + saved_callbacks[remote_id].emplace(saved_callback_id, std::move(callback)); +} + +void PrintBackendServiceManager::FetchCapabilitiesDone( + bool sandboxed, + const std::string& remote_id, + const base::UnguessableToken& saved_callback_id, + mojom::PrinterCapsAndInfoResultPtr printer_caps_and_info) { + DVLOG(1) << "FetchCapabilities completed for remote `" << remote_id + << "` saved callback ID " << saved_callback_id; + + RemoteSavedFetchCapabilitiesCallbacks& saved_callbacks = + GetRemoteSavedFetchCapabilitiesCallbacks(sandboxed); + + auto found_callback_map = saved_callbacks.find(remote_id); + DCHECK(found_callback_map != saved_callbacks.end()); + + SavedFetchCapabilitiesCallbacks& callback_map = found_callback_map->second; + + auto callback_entry = callback_map.find(saved_callback_id); + DCHECK(callback_entry != callback_map.end()); + mojom::PrintBackendService::FetchCapabilitiesCallback callback = + std::move(callback_entry->second); + callback_map.erase(callback_entry); + + // Done disconnect wrapper management, propagate the callback. + std::move(callback).Run(std::move(printer_caps_and_info)); +} + +void PrintBackendServiceManager::RunSavedFetchCapabilitiesCallbacks( + bool sandboxed, + const std::string& remote_id) { + RemoteSavedFetchCapabilitiesCallbacks& saved_callbacks = + GetRemoteSavedFetchCapabilitiesCallbacks(sandboxed); + + auto found_callbacks_map = saved_callbacks.find(remote_id); + if (found_callbacks_map == saved_callbacks.end()) + return; // No callbacks to run. + + SavedFetchCapabilitiesCallbacks& callbacks_map = found_callbacks_map->second; + for (auto& iter : callbacks_map) { + const base::UnguessableToken& saved_callback_id = iter.first; + DVLOG(1) << "Propagating a FetchCapabilities callback, saved callback ID " + << saved_callback_id << " for remote `" << remote_id << "`"; + + // Don't remove entries from the map while we are iterating through it, + // just run the callbacks. + mojom::PrintBackendService::FetchCapabilitiesCallback& callback = + iter.second; + std::move(callback).Run(mojom::PrinterCapsAndInfoResult::NewResultCode( + mojom::ResultCode::kFailed)); + } + + // Now that we're done iterating we can safely delete all of the callbacks. + callbacks_map.clear(); +} + } // namespace printing
diff --git a/chrome/browser/printing/print_backend_service_manager.h b/chrome/browser/printing/print_backend_service_manager.h index e062e87..36687b4 100644 --- a/chrome/browser/printing/print_backend_service_manager.h +++ b/chrome/browser/printing/print_backend_service_manager.h
@@ -10,6 +10,7 @@ #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/no_destructor.h" +#include "base/unguessable_token.h" #include "chrome/services/printing/public/mojom/print_backend_service.mojom.h" #include "mojo/public/cpp/bindings/remote.h" @@ -31,6 +32,12 @@ const std::string& locale, const std::string& printer_name); + // Wrapper around mojom::PrintBackendService call. + void FetchCapabilities( + const std::string& locale, + const std::string& printer_name, + mojom::PrintBackendService::FetchCapabilitiesCallback callback); + // Query if printer driver has been found to require elevated privilege in // order to have print queries/commands succeed. bool PrinterDriverRequiresElevatedPrivilege( @@ -61,9 +68,31 @@ private: friend base::NoDestructor<PrintBackendServiceManager>; + // Types to track saved callbacks associated with currently executing mojom + // service calls. These will be run either after a Mojom call finishes + // executing or if the service should disconnect before the mojom service + // calls complete. + // These need to be able to be found as a group for a particular remote that + // might become disconnected, and so a map-per-remote is used as a container. + // Use of a map allows for an ID key to be used to easily find any individual + // callback that can be discarded once a service call succeeds normally. + + // Key is a callback ID. + using SavedFetchCapabilitiesCallbacks = + base::flat_map<base::UnguessableToken, + mojom::PrintBackendService::FetchCapabilitiesCallback>; + + // Key is the remote ID that enables finding the correct remote. Note that + // the remote ID does not necessarily mean the printer name. + using RemoteSavedFetchCapabilitiesCallbacks = + base::flat_map<std::string, SavedFetchCapabilitiesCallbacks>; + PrintBackendServiceManager(); ~PrintBackendServiceManager(); + // Determine the remote ID that is used for the specified `printer_name`. + std::string GetRemoteIdForPrinterName(const std::string& printer_name) const; + // Callback when predetermined idle timeout occurs indicating no in-flight // messages for a short period of time. `sandboxed` is used to distinguish // which mapping of remotes the timeout applies to. @@ -74,6 +103,28 @@ // disconnection applies to. void OnRemoteDisconnected(bool sandboxed, const std::string& remote_id); + // Helper function to choose correct saved callbacks mapping. + RemoteSavedFetchCapabilitiesCallbacks& + GetRemoteSavedFetchCapabilitiesCallbacks(bool sandboxed); + + // Helper function to save outstanding callbacks. + void SaveFetchCapabilitiesCallback( + const std::string& remote_id, + const base::UnguessableToken& saved_callback_id, + mojom::PrintBackendService::FetchCapabilitiesCallback callback); + + // Local callback wrapper for mojom calls. + void FetchCapabilitiesDone( + bool sandboxed, + const std::string& remote_id, + const base::UnguessableToken& saved_callback_id, + mojom::PrinterCapsAndInfoResultPtr printer_caps_and_info); + + // Helper function to run outstanding callbacks when a remote has become + // disconnected. + void RunSavedFetchCapabilitiesCallbacks(bool sandboxed, + const std::string& remote_id); + using RemotesMap = base::flat_map<std::string, mojo::Remote<printing::mojom::PrintBackendService>>; @@ -82,6 +133,12 @@ RemotesMap sandboxed_remotes_; RemotesMap unsandboxed_remotes_; + // Track the saved callbacks for each remote. + RemoteSavedFetchCapabilitiesCallbacks + sandboxed_saved_fetch_capabilities_callbacks_; + RemoteSavedFetchCapabilitiesCallbacks + unsandboxed_saved_fetch_capabilities_callbacks_; + // Track if next service started should be sandboxed. bool is_sandboxed_service_ = true;
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 973648f5..8859049 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -64,6 +64,10 @@ ] } + if (is_win || is_mac || is_linux || is_chromeos_lacros) { + public_deps += [ "browser_switch:resources" ] + } + if (is_linux || is_chromeos) { public_deps += [ "webui_js_error:resources" ] }
diff --git a/chrome/browser/resources/browser_switch/BUILD.gn b/chrome/browser/resources/browser_switch/BUILD.gn index 7d4fd08..60dd306 100644 --- a/chrome/browser/resources/browser_switch/BUILD.gn +++ b/chrome/browser/resources/browser_switch/BUILD.gn
@@ -2,8 +2,63 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//chrome/common/features.gni") import("//third_party/closure_compiler/compile_js.gni") +import("//tools/grit/grit_rule.gni") import("//tools/polymer/html_to_js.gni") +import("//ui/webui/resources/tools/generate_grd.gni") + +grit("resources") { + defines = chrome_grit_defines + + # These arguments are needed since the grd is generated at build time. + enable_input_discovery_for_gn_analyze = false + source = "$target_gen_dir/resources.grd" + deps = [ ":build_grd" ] + + outputs = [ + "grit/browser_switch_resources.h", + "grit/browser_switch_resources_map.cc", + "grit/browser_switch_resources_map.h", + "browser_switch_resources.pak", + ] + output_dir = "$root_gen_dir/chrome" +} + +generate_grd("build_grd") { + grd_prefix = "browser_switch" + input_files = [ + "app.js", + "browser_switch.html", + "browser_switch_proxy.js", + "internals/browser_switch_internals.html", + "internals/browser_switch_internals.js", + ] + input_files_base_dir = rebase_path(target_gen_dir, root_build_dir) + + out_grd = "$target_gen_dir/resources.grd" + deps = [ + ":copy_files", + ":copy_files_internals", + ":web_components", + ] +} + +copy("copy_files") { + sources = [ + "browser_switch.html", + "browser_switch_proxy.js", + ] + outputs = [ "$target_gen_dir/{{source_file_part}}" ] +} + +copy("copy_files_internals") { + sources = [ + "internals/browser_switch_internals.html", + "internals/browser_switch_internals.js", + ] + outputs = [ "$target_gen_dir/internals/{{source_file_part}}" ] +} js_type_check("closure_compile") { is_polymer3 = true
diff --git a/chrome/browser/resources/browser_switch/app.js b/chrome/browser/resources/browser_switch/app.js index 32578aa..5cb79eb 100644 --- a/chrome/browser/resources/browser_switch/app.js +++ b/chrome/browser/resources/browser_switch/app.js
@@ -7,11 +7,11 @@ import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import './strings.m.js'; -import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; +import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {BrowserSwitchProxyImpl} from './browser_switch_proxy.js'; +import {BrowserSwitchProxy, BrowserSwitchProxyImpl} from './browser_switch_proxy.js'; /** @type {number} */ const MS_PER_SECOND = 1000; @@ -22,47 +22,62 @@ PROTOCOL_ERROR: 'protocolError', }; -Polymer({ - is: 'browser-switch-app', +/** + * @constructor + * @extends {PolymerElement} + * @implements {I18nBehaviorInterface} + */ +const BrowserSwitchAppElementBase = + mixinBehaviors([I18nBehavior], PolymerElement); - _template: html`{__html_template__}`, +/** @polymer */ +class BrowserSwitchAppElement extends BrowserSwitchAppElementBase { + static get is() { + return 'browser-switch-app'; + } - behaviors: [I18nBehavior], + static get template() { + return html`{__html_template__}`; + } - properties: { - /** - * URL to launch in the alternative browser. - * @private - */ - url_: { - type: String, - value() { - return (new URLSearchParams(window.location.search)).get('url') || ''; + static get properties() { + return { + /** + * URL to launch in the alternative browser. + * @private + */ + url_: { + type: String, + value() { + return (new URLSearchParams(window.location.search)).get('url') || ''; + }, }, - }, - /** - * Error message, or empty string if no error has occurred (yet). - * @private - */ - error_: { - type: String, - value: '', - }, + /** + * Error message, or empty string if no error has occurred (yet). + * @private + */ + error_: { + type: String, + value: '', + }, - /** - * Countdown displayed to the user, number of seconds until launching. If 0 - * or less, doesn't get displayed at all. - * @private - */ - secondCounter_: { - type: Number, - value: 0, - }, - }, + /** + * Countdown displayed to the user, number of seconds until launching. If + * 0 or less, doesn't get displayed at all. + * @private + */ + secondCounter_: { + type: Number, + value: 0, + }, + }; + } /** @override */ - attached() { + connectedCallback() { + super.connectedCallback(); + // If '?done=...' is specified in the URL, this tab was-reopened, or the // entire browser was closed by LBS and re-opened. In that case, go to NTP // instead. @@ -83,7 +98,7 @@ const milliseconds = loadTimeData.getInteger('launchDelay'); setTimeout(this.launchAndCloseTab_.bind(this), milliseconds); this.startCountdown_(Math.floor(milliseconds / 1000)); - }, + } /** @private */ launchAndCloseTab_() { @@ -94,7 +109,7 @@ getProxy().launchAlternativeBrowserAndCloseTab(this.url_).catch(() => { this.error_ = LaunchError.GENERIC_ERROR; }); - }, + } /** * @param {number} seconds @@ -108,7 +123,7 @@ clearInterval(intervalId); } }, 1 * MS_PER_SECOND); - }, + } /** * @return {string} @@ -122,7 +137,7 @@ return this.i18n('countdownTitle', this.secondCounter_, getBrowserName()); } return this.i18n('openingTitle', getBrowserName()); - }, + } /** * @return {string} @@ -135,13 +150,20 @@ } return this.i18n( 'description', getUrlHostname(this.url_), getBrowserName()); - }, -}); + } +} +customElements.define(BrowserSwitchAppElement.is, BrowserSwitchAppElement); + +/** @return {string} */ function getBrowserName() { return loadTimeData.getString('browserName'); } +/** + * @param {string} url + * @return {string} + */ function getUrlHostname(url) { const anchor = document.createElement('a'); anchor.href = url; @@ -149,6 +171,7 @@ return anchor.hostname || url; } +/** @return {!BrowserSwitchProxy} */ function getProxy() { return BrowserSwitchProxyImpl.getInstance(); }
diff --git a/chrome/browser/resources/browser_switch/browser_switch_proxy.js b/chrome/browser/resources/browser_switch/browser_switch_proxy.js index 0be3229..c9c5ddb 100644 --- a/chrome/browser/resources/browser_switch/browser_switch_proxy.js +++ b/chrome/browser/resources/browser_switch/browser_switch_proxy.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js'; +import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; /** @interface */ export class BrowserSwitchProxy { @@ -27,6 +27,12 @@ gotoNewTabPage() { chrome.send('gotoNewTabPage'); } + + /** @return {!BrowserSwitchProxy} */ + static getInstance() { + return instance || (instance = new BrowserSwitchProxyImpl()); + } } -addSingletonGetter(BrowserSwitchProxyImpl); +/** @type {?BrowserSwitchProxy} */ +let instance = null;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index f4920d32..f2158ce 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -70,7 +70,6 @@ "background/phonetic_data.js", "background/prefs.js", "background/smart_sticky_mode.js", - "background/tabs_api_handler.js", "background/user_action_monitor.js", "braille/bluetooth_braille_display_manager.js", "braille/bluetooth_braille_display_ui.js", @@ -125,6 +124,7 @@ "background/live_regions.js", "background/media_automation_handler.js", "background/range_automation_handler.js", + "background/page_load_sound_handler.js", ] # Closure library modules needed by chromevox.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index 33e8f62..09e3636 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -6,6 +6,7 @@ import {FindHandler} from './find_handler.js'; import {LiveRegions} from './live_regions.js'; import {MediaAutomationHandler} from './media_automation_handler.js'; +import {PageLoadSoundHandler} from './page_load_sound_handler.js'; import {RangeAutomationHandler} from './range_automation_handler.js'; /** @@ -94,6 +95,8 @@ this.focusAutomationHandler_ = new FocusAutomationHandler(); /** @private {!MediaAutomationHandler} */ this.mediaAutomationHandler_ = new MediaAutomationHandler(); + /** @private {!PageLoadSoundHandler} */ + this.pageLoadSoundHandler_ = new PageLoadSoundHandler(); CommandHandler.init(); FindHandler.init();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index 1eaa750..fed6459a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -3516,3 +3516,41 @@ .replay(); }); }); + +SYNC_TEST_F('ChromeVoxBackgroundTest', 'PageLoadEarcons', async function() { + const sawEarcons = []; + const fakeEarcons = {playEarcon: (earcon) => sawEarcons.push(earcon)}; + Object.defineProperty(ChromeVox, 'earcons', {get: () => fakeEarcons}); + AutomationUtil.getTopLevelRoot = (node) => node; + + const module = await import('./page_load_sound_handler.js'); + const PageLoadSoundHandler = module.PageLoadSoundHandler; + + // Use this specific object to control the load environment. + const handler = new PageLoadSoundHandler(); + + // Build up a fake automation node with a parent and root. + const fakeNode = {}; + fakeNode.docUrl = 'foo'; + fakeNode.root = fakeNode; + fakeNode.parent = {state: {focused: true}}; + + handler.onLoadStart({target: fakeNode}); + assertEqualStringArrays([Earcon.PAGE_START_LOADING], sawEarcons); + handler.onLoadComplete({target: fakeNode}); + assertEqualStringArrays( + [Earcon.PAGE_START_LOADING, Earcon.PAGE_FINISH_LOADING], sawEarcons); + + // No extra earcons. + handler.onLoadComplete({target: fakeNode}); + assertEqualStringArrays( + [Earcon.PAGE_START_LOADING, Earcon.PAGE_FINISH_LOADING], sawEarcons); + + // Try a range change that finishes the load sound. + sawEarcons.length = 0; + handler.onLoadStart({target: fakeNode}); + fakeNode.docLoadingProgress = 1; + handler.onCurrentRangeChanged({start: {node: fakeNode}}); + assertEqualStringArrays( + [Earcon.PAGE_START_LOADING, Earcon.PAGE_FINISH_LOADING], sawEarcons); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js index e217156..1af650e1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
@@ -25,7 +25,6 @@ goog.require('InjectedScriptLoader'); goog.require('NavBraille'); goog.require('QueueMode'); -goog.require('TabsApiHandler'); goog.require('TtsBackground'); @@ -63,8 +62,6 @@ */ this.backgroundBraille_ = BrailleBackground.getInstance(); - this.tabsApiHandler_ = new TabsApiHandler(); - // Export globals on ChromeVox. ChromeVox.tts = this.tts; ChromeVox.braille = this.backgroundBraille_;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js new file mode 100644 index 0000000..87b92d41 --- /dev/null +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
@@ -0,0 +1,81 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview Handles page loading sounds based on automation events. + */ + +const ActionType = chrome.automation.ActionType; +const AutomationNode = chrome.automation.AutomationNode; +const Dir = constants.Dir; +const EventType = chrome.automation.EventType; +const RoleType = chrome.automation.RoleType; +const StateType = chrome.automation.StateType; + +/** @implements {ChromeVoxStateObserver} */ +export class PageLoadSoundHandler extends BaseAutomationHandler { + constructor() { + super(undefined); + + /** @private {boolean} */ + this.didRequestLoadSound_ = false; + + chrome.automation.getDesktop(desktop => { + this.node_ = desktop; + + this.addListener_(EventType.LOAD_COMPLETE, this.onLoadComplete); + this.addListener_(EventType.LOAD_START, this.onLoadStart); + + ChromeVoxState.addObserver(this); + }); + } + + /** + * Stops page load sound on load complete. + * @param {!ChromeVoxEvent} evt + */ + onLoadComplete(evt) { + // We are only interested in load completes on valid top level roots. + const top = AutomationUtil.getTopLevelRoot(evt.target); + if (!top || top !== evt.target.root || !top.docUrl) { + return; + } + + if (this.didRequestLoadSound_ && top.parent && top.parent.state.focused) { + ChromeVox.earcons.playEarcon(Earcon.PAGE_FINISH_LOADING); + this.didRequestLoadSound_ = false; + } + } + + /** + * Starts page load sound on load start. + * @param {!ChromeVoxEvent} evt + */ + onLoadStart(evt) { + // We are only interested in load starts on focused top level roots. + const top = AutomationUtil.getTopLevelRoot(evt.target); + if (top && top === evt.target.root && top.docUrl && top.parent && + top.parent.state.focused) { + ChromeVox.earcons.playEarcon(Earcon.PAGE_START_LOADING); + this.didRequestLoadSound_ = true; + } + } + + /** @override */ + onCurrentRangeChanged(range) { + if (!range || !range.start || !range.start.node) { + return; + } + + const top = AutomationUtil.getTopLevelRoot(range.start.node); + // |top| might be undefined e.g. if range is not in a root web area. + if (this.didRequestLoadSound_ && (!top || top.docLoadingProgress === 1)) { + ChromeVox.earcons.playEarcon(Earcon.PAGE_FINISH_LOADING); + this.didRequestLoadSound_ = false; + } + + // Note that we intentionally don't re-start progress playback here even if + // the docLoadingProgress < 1. + } +}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tabs_api_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tabs_api_handler.js deleted file mode 100644 index f18f17a..0000000 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tabs_api_handler.js +++ /dev/null
@@ -1,222 +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. - -/** - * @fileoverview Accesses Chrome's tabs extension API and gives - * feedback for events that happen in the "Chrome of Chrome". - */ - -goog.provide('TabsApiHandler'); - -goog.require('AbstractEarcons'); -goog.require('AbstractTts'); -goog.require('BrailleInterface'); -goog.require('ChromeVox'); -goog.require('NavBraille'); - - -/** - * Class that adds listeners and handles events from the tabs API. - */ -TabsApiHandler = class { - constructor() { - /** @type {function(string, Array<string>=)} @private */ - this.msg_ = Msgs.getMsg.bind(Msgs); - /** - * Tracks whether the active tab has finished loading. - * @type {boolean} - * @private - */ - this.lastActiveTabLoaded_ = false; - - chrome.tabs.onCreated.addListener(this.onCreated.bind(this)); - chrome.tabs.onRemoved.addListener(this.onRemoved.bind(this)); - chrome.tabs.onActivated.addListener(this.onActivated.bind(this)); - chrome.tabs.onUpdated.addListener(this.onUpdated.bind(this)); - - /** - * @type {?number} The window.setInterval ID for checking the loading - * status of the current tab. - * @private - */ - this.pageLoadIntervalID_ = null; - - /** - * @type {?number} The tab ID of the tab being polled because it's loading. - * @private - */ - this.pageLoadTabID_ = null; - } - - /** - * Handles chrome.tabs.onCreated. - * @param {Object} tab - */ - onCreated(tab) { - this.runOnlyIfTabIsActive_(tab.id, () => { - if (TabsApiHandler.shouldOutputSpeechAndBraille) { - ChromeVox.tts.speak( - this.msg_('chrome_tab_created'), QueueMode.FLUSH, - AbstractTts.PERSONALITY_ANNOUNCEMENT); - ChromeVox.braille.write( - NavBraille.fromText(this.msg_('chrome_tab_created'))); - } - ChromeVox.earcons.playEarcon(Earcon.OBJECT_OPEN); - }); - } - - /** - * Handles chrome.tabs.onRemoved. - * @param {Object} tab - */ - onRemoved(tab) { - this.runOnlyIfTabIsActive_(tab.id, () => { - ChromeVox.earcons.playEarcon(Earcon.OBJECT_CLOSE); - - chrome.tabs.query({active: true}, function(tabs) { - if (tabs.length === 0 && this.isPlayingPageLoadingSound_()) { - ChromeVox.earcons.cancelEarcon(Earcon.PAGE_START_LOADING); - this.cancelPageLoadTimer_(); - } - }.bind(this)); - }); - } - - /** - * Handles chrome.tabs.onActivated. - * @param {Object} activeInfo - */ - onActivated(activeInfo) { - this.runOnlyIfTabIsActive_(activeInfo.tabId, () => { - this.updateLoadingSoundsWhenTabFocusChanges_(activeInfo.tabId); - chrome.tabs.get(activeInfo.tabId, function(tab) { - if (tab.status === 'loading') { - return; - } - - if (TabsApiHandler.shouldOutputSpeechAndBraille) { - const title = tab.title ? tab.title : tab.url; - ChromeVox.tts.speak( - this.msg_('chrome_tab_selected', [title]), QueueMode.FLUSH, - AbstractTts.PERSONALITY_ANNOUNCEMENT); - ChromeVox.braille.write( - NavBraille.fromText(this.msg_('chrome_tab_selected', [title]))); - } - ChromeVox.earcons.playEarcon(Earcon.OBJECT_SELECT); - }.bind(this)); - }); - } - - /** - * Called when a tab becomes active or focused. - * @param {number} tabId the id of the tab that's now focused and active. - * @private - */ - updateLoadingSoundsWhenTabFocusChanges_(tabId) { - chrome.tabs.get(tabId, function(tab) { - this.lastActiveTabLoaded_ = tab.status === 'complete'; - if (tab.status === 'loading' && !this.isPlayingPageLoadingSound_()) { - ChromeVox.earcons.playEarcon(Earcon.PAGE_START_LOADING); - this.startPageLoadTimer_(tabId); - } else { - ChromeVox.earcons.cancelEarcon(Earcon.PAGE_START_LOADING); - this.cancelPageLoadTimer_(); - } - }.bind(this)); - } - - /** - * Handles chrome.tabs.onUpdated. - * @param {number} tabId - * @param {Object} selectInfo - */ - onUpdated(tabId, selectInfo) { - chrome.tabs.get(tabId, function(tab) { - if (!tab.active) { - return; - } - if (tab.status === 'loading') { - this.lastActiveTabLoaded_ = false; - if (!this.isPlayingPageLoadingSound_()) { - ChromeVox.earcons.playEarcon(Earcon.PAGE_START_LOADING); - this.startPageLoadTimer_(tabId); - } - } else if (!this.lastActiveTabLoaded_) { - this.lastActiveTabLoaded_ = true; - ChromeVox.earcons.playEarcon(Earcon.PAGE_FINISH_LOADING); - this.cancelPageLoadTimer_(); - } - }.bind(this)); - } - - /** - * The chrome.tabs API doesn't always fire an onUpdated event when a - * page finishes loading, so we poll it. - * @param {number} tabId The id of the tab to monitor. - * @private - */ - startPageLoadTimer_(tabId) { - if (this.pageLoadIntervalID_) { - if (tabId === this.pageLoadTabID_) { - return; - } - this.cancelPageLoadTimer_(); - } - - this.pageLoadTabID_ = tabId; - this.pageLoadIntervalID_ = window.setInterval(function() { - if (this.pageLoadTabID_) { - this.onUpdated(this.pageLoadTabID_, {}); - } - }.bind(this), 1000); - } - - /** - * Cancel the page loading timer because the active tab is loaded. - * @private - */ - cancelPageLoadTimer_() { - if (this.pageLoadIntervalID_) { - window.clearInterval(this.pageLoadIntervalID_); - this.pageLoadIntervalID_ = null; - this.pageLoadTabID_ = null; - } - } - - /** - * @return {boolean} True if the page loading sound is playing and our - * page loading timer is active. - */ - isPlayingPageLoadingSound_() { - return this.pageLoadIntervalID_ != null; - } - - /** - * @param {number} tabId - * @private - */ - runOnlyIfTabIsActive_(tabId, callback) { - try { - chrome.windows.getLastFocused({populate: true}, w => { - if (!w.focused) { - return; - } - for (let i = 0; i < w.tabs.length; i++) { - const tab = w.tabs[i]; - if (tab.active && tab.id === tabId) { - callback(); - return; - } - } - }); - } catch (e) { - // Throws if there's no last focused window. - } - } -}; - -/** - * @type {boolean} - */ -TabsApiHandler.shouldOutputSpeechAndBraille = true;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js index c05c0d7..22aaded 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
@@ -595,7 +595,6 @@ .call(doCmd('nextObject')) .expectSpeech('ChromeVox Command Reference', 'Link') .call(doCmd('forceClickOnCurrentItem')) - .expectSpeech('tab created') .expectSpeech('support.google.com') .replay(); });
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb index 9242060..374af0412 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fr-CA.xtb
@@ -475,7 +475,7 @@ <translation id="4221012616705981690">Aucune liste précédente</translation> <translation id="4225355998815256469">Commandes de formulaire</translation> <translation id="4230834257931120629">Gris ardoise clair</translation> -<translation id="4231102694147661229">Activer les options pour les concepteurs</translation> +<translation id="4231102694147661229">Activer les options pour les développeurs</translation> <translation id="423428485095722850">Appuyez sur Recherche+Espace pour basculer la commande</translation> <translation id="4243624244759495699"><ph name="LOCALE" />, niveau <ph name="GRADE" /></translation> <translation id="4246217262268234757">Bleu acier</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb index 801177c4..b917feac 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
@@ -830,7 +830,7 @@ <translation id="6994042831499278539">Глоссарий анықтамасы</translation> <translation id="6996566555547746822">Келесі тізімді өріс</translation> <translation id="6997224546856374593">Бас әріптерді оқығанда:</translation> -<translation id="6999752561504308105">ChromeVox оқулығына қош келдіңіз. Осы оқулықтан кез келген уақытта шығу үшін екі саусақпен оңнан солға сырғытыңыз. ChromeVox құралын кез келген уақытта қосу немесе өшіру үшін екі дыбыс деңгейі түймесін бес секунд басып ұстап тұрыңыз. Дайын болған кезде, келесі сабаққа өту үшін экранды бір саусақпен екі рет түртіңіз.</translation> +<translation id="6999752561504308105">ChromeVox оқулығына қош келдіңіз. Осы оқулықтан кез келген уақытта шығу үшін екі саусақпен оңнан солға сырғытыңыз. ChromeVox құралын кез келген уақытта қосу немесе өшіру үшін екі дыбыс деңгейі түймесін бес секунд басып тұрыңыз. Дайын болған кезде, келесі сабаққа өту үшін экранды бір саусақпен екі рет түртіңіз.</translation> <translation id="700202842116345659">Әдебиет жазбасы</translation> <translation id="7005146664810010831">URL табылмады</translation> <translation id="7026338066939101231">Кему</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn index 40f73b0c..8dbb504 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/BUILD.gn
@@ -116,6 +116,7 @@ "nodes/tab_node_test.js", "point_scan_manager_test.js", "switch_access_predicate_test.js", + "switch_access_test.js", "text_navigation_manager_test.js", ] gen_include_files = [
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager_test.js index 120f0f0..2441013 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/focus_ring_manager_test.js
@@ -17,6 +17,7 @@ await importModule('Navigator', '/switch_access/navigator.js'); await importModule( 'SAConstants', '/switch_access/switch_access_constants.js'); + await importModule('ActionManager', '/switch_access/action_manager.js'); runTest(); })(); } @@ -48,6 +49,31 @@ }); }); +TEST_F('FocusRingManagerTest', 'BackButtonForMenuFocus', function() { + const site = '<input type="text">'; + this.runWithLoadedTree(site, async (root) => { + // Open the menu and focus the back button. + const input = root.find({role: chrome.automation.RoleType.TEXT_FIELD}); + assertNotNullNorUndefined(input); + Navigator.byItem.moveTo_(input); + ActionManager.onSelect(); + let found = false; + while (!found) { + Navigator.byItem.moveForward(); + if (Navigator.byItem.node_ instanceof BackButtonNode) { + found = true; + } + } + + const rings = FocusRingManager.instance.rings_; + const primary = rings.get(SAConstants.Focus.ID.PRIMARY); + const preview = rings.get(SAConstants.Focus.ID.PREVIEW); + // Primary and preview focus should be empty. + assertEquals(0, primary.rects.length); + assertEquals(0, preview.rects.length); + }); +}); + TEST_F('FocusRingManagerTest', 'ButtonFocus', function() { const site = '<button>Test</button>'; this.runWithLoadedTree(site, async (root) => {
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js index 17da7f9..8e0e24d 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/item_scan_manager_test.js
@@ -504,7 +504,6 @@ }); }); - TEST_F('SwitchAccessItemScanManagerTest', 'SyncFocusToNewWindow', function() { const website1 = `<button autofocus>one</button>`; const website2 = `<button autofocus>two</button>`; @@ -574,49 +573,3 @@ }); }); }); - -TEST_F( - 'SwitchAccessItemScanManagerTest', 'LockScreenBlocksUserSession', - function() { - const website = `<button autofocus>kitties!</button>`; - this.runWithLoadedTree(website, async (root) => { - let button = - await this.untilFocusIs({role: chrome.automation.RoleType.BUTTON}); - assertEquals('kitties!', button.automationNode.name); - - // Lock the screen. - EventGenerator.sendKeyPress(KeyCode.L, {search: true}); - - // Wait for focus to move to the password field. - await this.untilFocusIs({ - role: chrome.automation.RoleType.TEXT_FIELD, - name: 'Password for stub-user@example.com' - }); - - // The button is no longer in the tree because the screen is locked. - const predicate = (node) => node.name === 'kitties!' && - node.role === chrome.automation.RoleType.BUTTON; - assertNotNullNorUndefined( - this.desktop_, 'this.desktop_ is null or undefined.'); - const treeWalker = new AutomationTreeWalker( - this.desktop_, constants.Dir.FORWARD, {visit: predicate}); - const node = treeWalker.next().node; - assertEquals(null, node); - - // Log in again and confirm that the button is back and gets focus - // again. - EventGenerator.sendKeyPress(KeyCode.T); - EventGenerator.sendKeyPress(KeyCode.E); - EventGenerator.sendKeyPress(KeyCode.S); - EventGenerator.sendKeyPress(KeyCode.T); - EventGenerator.sendKeyPress(KeyCode.ZERO); - EventGenerator.sendKeyPress(KeyCode.ZERO); - EventGenerator.sendKeyPress(KeyCode.ZERO); - EventGenerator.sendKeyPress(KeyCode.ZERO); - EventGenerator.sendKeyPress(KeyCode.RETURN); - - button = - await this.untilFocusIs({role: chrome.automation.RoleType.BUTTON}); - assertEquals('kitties!', button.automationNode.name); - }); - });
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager_test.js index d68bc233..782fc6e 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager_test.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/point_scan_manager_test.js
@@ -79,3 +79,33 @@ await new Promise(menuItemLoaded()); }); }); + +// Verifies that chrome.accessibilityPrivate.setFocusRings() is not called when +// point scanning is running. +TEST_F('SwitchAccessPointScanManagerTest', 'PointScanNoFocusRings', function() { + const sleep = () => { + return new Promise(resolve => setTimeout(resolve, 2 * 1000)); + }; + + const site = '<button>Test</button>'; + this.runWithLoadedTree(site, async (root) => { + let setFocusRingsCallCount = 0; + // Mock this API to track how many times it's called. + chrome.accessibilityPrivate.setFocusRings = (focusRings) => { + setFocusRingsCallCount += 1; + }; + assertEquals(0, setFocusRingsCallCount); + Navigator.byPoint.start(); + // When point scanning starts, setFocusRings() gets called once to clear + // the focus rings. + assertEquals(1, setFocusRingsCallCount); + // Simulate the page focusing the button. + const button = root.find({role: chrome.automation.RoleType.BUTTON}); + assertNotNullNorUndefined(button); + button.focus(); + // Allow point scanning to run for 2 seconds and ensure no extra calls to + // setFocusRings(). + await sleep(); + assertEquals(1, setFocusRingsCallCount); + }); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js index 2039108a..3324fb4 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js
@@ -20,12 +20,36 @@ SwitchAccess.instance = new SwitchAccess(); chrome.automation.getDesktop((desktop) => { - // Navigator must be initialized first. - Navigator.initializeSingletonInstance(desktop); + chrome.automation.getFocus(focus => { + // Focus is available. Finish init without waiting for further events. + // Disallow web view nodes, which indicate a root web area is still + // loading and pending focus. + if (focus && focus.role !== chrome.automation.RoleType.WEB_VIEW) { + SwitchAccess.finishInit_(desktop); + return; + } - Commands.initialize(); - KeyboardRootNode.startWatchingVisibility(); - PreferenceManager.initialize(); + // Wait for the focus to be sent. If |focus| was undefined, this is + // guaranteed. Otherwise, also set a timed callback to ensure we do + // eventually init. + let callbackId = 0; + const listener = maybeEvent => { + if (maybeEvent && + maybeEvent.target.role === chrome.automation.RoleType.WEB_VIEW) { + return; + } + + desktop.removeEventListener( + chrome.automation.EventType.FOCUS, listener, false); + window.clearTimeout(callbackId); + + SwitchAccess.finishInit_(desktop); + }; + + desktop.addEventListener( + chrome.automation.EventType.FOCUS, listener, false); + callbackId = window.setTimeout(listener, 5000); + }); }); } @@ -122,4 +146,17 @@ /** @type {number} */ (errorType), errorTypeCountForUMA); return new Error(errorString); } + + /** + * @param {!chrome.automation.AutomationNode} desktop + * @private + */ + static finishInit_(desktop) { + // Navigator must be initialized first. + Navigator.initializeSingletonInstance(desktop); + + Commands.initialize(); + KeyboardRootNode.startWatchingVisibility(); + PreferenceManager.initialize(); + } }
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_test.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_test.js new file mode 100644 index 0000000..640fee5b --- /dev/null +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_test.js
@@ -0,0 +1,44 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +GEN_INCLUDE(['switch_access_e2e_test_base.js']); + +/** Test fixture for the SwitchAccess class. */ +SwitchAccessSwitchAccessTest = class extends SwitchAccessE2ETest { + /** @override */ + setUp() { + var runTest = this.deferRunTest(WhenTestDone.EXPECT); + (async () => { + await importModule('SwitchAccess', '/switch_access/switch_access.js'); + + runTest(); + })(); + } +}; + +SYNC_TEST_F('SwitchAccessSwitchAccessTest', 'NoFocusDefersInit', function() { + // Build a new SwitchAccess instance with hooks. + let initCount = 0; + SwitchAccess.finishInit_ = () => initCount++; + + // A fake desktop. + const fakeDesktop = {}; + fakeDesktop.addEventListener = () => {}; + fakeDesktop.removeEventListener = () => {}; + + // Stub out this to be synchronous. + chrome.automation.getDesktop = callback => callback(fakeDesktop); + + // Stub this out as well so that focus is undefined. + chrome.automation.getFocus = callback => callback(); + + // Initialize; we should not have called finishInit_ since there's no focus. + SwitchAccess.initialize(); + assertEquals(0, initCount); + + // Restub this to pass a "focused" node. + chrome.automation.getFocus = callback => callback({}); + SwitchAccess.initialize(); + assertEquals(1, initCount); +});
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn index d562df2..ddf3d6f 100644 --- a/chrome/browser/resources/chromeos/login/components/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -38,6 +38,7 @@ group("closure_compile_module") { deps = [ ":oobe_icons.m", + "behaviors:closure_compile_module", ] }
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn b/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn index 7640279c..7bfcf894 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//third_party/closure_compiler/compile_js.gni") +import("//ui/webui/resources/tools/js_modulizer.gni") js_type_check("closure_compile") { uses_legacy_modules = true @@ -16,6 +17,14 @@ ] } +js_type_check("closure_compile_module") { + is_polymer3 = true + deps = [ + ":oobe_i18n_behavior.m", + ] +} + + js_library("oobe_dialog_host_behavior") { } @@ -37,4 +46,22 @@ } js_library("multi_step_behavior") { -} \ No newline at end of file +} + +#### Polymer3 / JS Modules + +js_library("oobe_i18n_behavior.m") { + sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.m.js" ] + deps = [ + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:i18n_behavior.m" + ] + extra_deps = [ ":modulize" ] +} + +js_modulizer("modulize") { + input_files = [ + "oobe_i18n_behavior.js" + ] + namespace_rewrites = [] +}
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.html b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.html index 73f809b..cc94129 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.html +++ b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.html
@@ -1,2 +1,4 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <script src="oobe_i18n_behavior.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js index d81f140..192f8903 100644 --- a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js +++ b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
@@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// clang-format off +// #import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; +// #import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// clang-format on + /** * @fileoverview * 'OobeI18nBehavior' is extended I18nBehavior with automatic locale change @@ -33,7 +38,7 @@ // TODO(crbug.com/955194): move i18nUpdateLocale from I18nBehavior to this // class. I18nBehavior.i18nUpdateLocale.call(this); - var matches = Polymer.dom(this.root).querySelectorAll('.i18n-dynamic'); + var matches = this.shadowRoot.querySelectorAll('.i18n-dynamic'); for (var child of matches) { if (typeof (child.i18nUpdateLocale) === 'function') { child.i18nUpdateLocale();
diff --git a/chrome/browser/resources/chromeos/login/os_install.js b/chrome/browser/resources/chromeos/login/os_install.js index acc6dfbd..6d063cf 100644 --- a/chrome/browser/resources/chromeos/login/os_install.js +++ b/chrome/browser/resources/chromeos/login/os_install.js
@@ -26,9 +26,10 @@ ], EXTERNAL_API: [ - 'currentUIStep', 'showConfirmStep', 'showInProgressStep', + 'showErrorStep', + 'showSuccessStep', ], UI_STEPS: UIState, @@ -40,13 +41,6 @@ return UIState.INTRO; }, - /** - * @return {string} - */ - currentUIStep() { - return this.uiStep; - }, - ready() { this.initializeLoginScreen('OsInstallScreen', { resetAllowed: true, @@ -61,6 +55,14 @@ this.setUIStep(UIState.IN_PROGRESS); }, + showErrorStep() { + this.setUIStep(UIState.ERROR); + }, + + showSuccessStep() { + this.setUIStep(UIState.SUCCESS); + }, + onIntroNextButtonPressed_() { this.userActed('os-install-intro-next'); },
diff --git a/chrome/browser/resources/read_later/side_panel/bookmark_folder.html b/chrome/browser/resources/read_later/side_panel/bookmark_folder.html index 5c750c4..9846458 100644 --- a/chrome/browser/resources/read_later/side_panel/bookmark_folder.html +++ b/chrome/browser/resources/read_later/side_panel/bookmark_folder.html
@@ -7,6 +7,10 @@ .row { align-items: center; + appearance: none; + background: transparent; + border: none; + box-sizing: border-box; cursor: pointer; display: grid; grid-template-areas: 'arrow icon title'; @@ -14,10 +18,14 @@ height: 40px; line-height: 40px; padding-inline-start: calc(var(--node-depth) * 17px); + text-align: start; + width: 100%; } - .row:hover { + .row:hover, + .row:focus-visible:focus { background-color: var(--cr-hover-background-color); + outline: none; } .row:active { @@ -70,29 +78,32 @@ text-decoration: none; } </style> -<div class="row" on-click="onFolderClick_"> +<button class="row" on-click="onFolderClick_" tabindex="0"> <div id="arrow" hidden$="[[!folder.children.length]]"> <cr-icon-button id="arrowIcon" iron-icon="cr:arrow-drop-down" - open$="[[open_]]"> + open$="[[open_]]" + tabindex="-1"> </cr-icon-button> </div> <div id="folderIcon" class="icon"></div> <div class="title">[[folder.title]]</div> -</div> +</button> -<div id="children"> +<div id="children" role="group"> <template is="dom-if" if="[[open_]]"> <template is="dom-repeat" items="[[folder.children]]"> <template is="dom-if" if="[[!item.url]]"> - <bookmark-folder folder="[[item]]" depth="[[childDepth_]]" + <bookmark-folder role="treeitem" folder="[[item]]" + depth="[[childDepth_]]" open-folders="[[openFolders]]"> </bookmark-folder> </template> <template is="dom-if" if="[[item.url]]"> - <a href="[[item.url]]" class="bookmark row" on-click="onBookmarkClick_"> + <a role="treeitem" href="[[item.url]]" class="bookmark row" + on-click="onBookmarkClick_"> <div class="icon" style="background-image: [[getBookmarkIcon_(item.url)]]">
diff --git a/chrome/browser/resources/read_later/side_panel/bookmarks_list.html b/chrome/browser/resources/read_later/side_panel/bookmarks_list.html index e24c162..eb325be 100644 --- a/chrome/browser/resources/read_later/side_panel/bookmarks_list.html +++ b/chrome/browser/resources/read_later/side_panel/bookmarks_list.html
@@ -1,4 +1,5 @@ <template is="dom-repeat" items="[[folders_]]"> - <bookmark-folder folder="[[item]]" open-folders="[[openFolders_]]"> + <bookmark-folder role="treeitem" folder="[[item]]" + open-folders="[[openFolders_]]"> </bookmark-folder> </template> \ No newline at end of file
diff --git a/chrome/browser/resources/read_later/side_panel/bookmarks_list.js b/chrome/browser/resources/read_later/side_panel/bookmarks_list.js index af84457..3c4ac4a 100644 --- a/chrome/browser/resources/read_later/side_panel/bookmarks_list.js +++ b/chrome/browser/resources/read_later/side_panel/bookmarks_list.js
@@ -68,6 +68,7 @@ connectedCallback() { super.connectedCallback(); + this.setAttribute('role', 'tree'); this.bookmarksApi_.getFolders().then(folders => { this.folders_ = folders;
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/DevicePickerBottomSheetContent.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/DevicePickerBottomSheetContent.java index 1b3de8e..e8b0e898 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/DevicePickerBottomSheetContent.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/send_tab_to_self/DevicePickerBottomSheetContent.java
@@ -17,6 +17,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; @@ -181,9 +182,25 @@ mProfile, mUrl, mTitle, mNavigationTime, targetDeviceInfo.cacheGuid); Resources res = mContext.getResources(); - String toastMessage = - res.getString(R.string.send_tab_to_self_toast, targetDeviceInfo.deviceName); - Toast.makeText(mContext, toastMessage, Toast.LENGTH_SHORT).show(); + + if (ChromeFeatureList.isEnabled(ChromeFeatureList.SEND_TAB_TO_SELF_V2)) { + String deviceType = res.getString(R.string.send_tab_to_self_device_type_generic); + if (targetDeviceInfo.deviceType == TargetDeviceInfo.DeviceType.PHONE) { + deviceType = res.getString(R.string.send_tab_to_self_device_type_phone); + } else if (targetDeviceInfo.deviceType == TargetDeviceInfo.DeviceType.WIN + || targetDeviceInfo.deviceType == TargetDeviceInfo.DeviceType.MACOSX + || targetDeviceInfo.deviceType == TargetDeviceInfo.DeviceType.LINUX + || targetDeviceInfo.deviceType == TargetDeviceInfo.DeviceType.CHROMEOS) { + deviceType = res.getString(R.string.send_tab_to_self_device_type_computer); + } + + String toastMessage = res.getString(R.string.send_tab_to_self_v2_toast, deviceType); + Toast.makeText(mContext, toastMessage, Toast.LENGTH_SHORT).show(); + } else { + String toastMessage = + res.getString(R.string.send_tab_to_self_toast, targetDeviceInfo.deviceName); + Toast.makeText(mContext, toastMessage, Toast.LENGTH_SHORT).show(); + } mController.hideContent(this, true); }
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc index fd0693c8..1f8078ea 100644 --- a/chrome/browser/speech/speech_recognition_service_browsertest.cc +++ b/chrome/browser/speech/speech_recognition_service_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/files/file_util.h" #include "base/notreached.h" #include "base/path_service.h" @@ -186,7 +188,13 @@ void SpeechRecognitionServiceTest::OnSpeechRecognitionRecognitionEvent( const media::SpeechRecognitionResult& result, OnSpeechRecognitionRecognitionEventCallback reply) { - recognition_results_.push_back(std::move(result.transcription)); + std::string transcription = result.transcription; + // The language pack used by the MacOS builder is newer and has punctuation + // enabled whereas the one used by the Linux builder does not. + transcription.erase( + std::remove(transcription.begin(), transcription.end(), ','), + transcription.end()); + recognition_results_.push_back(std::move(transcription)); std::move(reply).Run(is_client_requesting_speech_recognition_); }
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc index 3f2e9aa..2b680ae 100644 --- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -41,7 +41,6 @@ #include "components/sync/nigori/nigori_test_utils.h" #include "components/sync/test/fake_server/fake_server_nigori_helper.h" #include "components/sync/trusted_vault/fake_security_domains_server.h" -#include "components/sync/trusted_vault/standalone_trusted_vault_client.h" #include "components/sync/trusted_vault/trusted_vault_server_constants.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_launcher.h" @@ -1084,22 +1083,21 @@ IN_PROC_BROWSER_TEST_F(SingleClientNigoriWithRecoverySyncTest, ShouldReportDegradedTrustedVaultRecoverability) { - const std::vector<uint8_t> kTestEncryptionKey = {1, 2, 3, 4}; - const GURL recoverability_url = GetTrustedVaultRecoverabilityURL(*embedded_test_server()); - // Mimic the account being already using a trusted vault passphrase. - SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics({kTestEncryptionKey}), - GetFakeServer()); - // Mimic the key being available upon startup but recoverability degraded. + const std::vector<uint8_t> trusted_vault_key = + GetSecurityDomainsServer()->RotateTrustedVaultKey( + /*last_trusted_vault_key=*/syncer::GetConstantTrustedVaultKey()); + GetSecurityDomainsServer()->SetRecoverabilityDegraded(); + SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics( + /*trusted_vault_keys=*/{trusted_vault_key}), + GetFakeServer()); ASSERT_TRUE(SetupClients()); - static_cast<syncer::StandaloneTrustedVaultClient*>( - GetSyncService(0)->GetSyncClientForTest()->GetTrustedVaultClient()) - ->SetRecoverabilityDegradedForTesting(); GetSyncService(0)->AddTrustedVaultDecryptionKeysFromWeb( - kGaiaId, {kTestEncryptionKey}, /*last_key_version=*/1); + kGaiaId, {trusted_vault_key}, + /*last_key_version=*/GetSecurityDomainsServer()->GetCurrentEpoch()); ASSERT_TRUE(SetupSync()); ASSERT_EQ(syncer::PassphraseType::kTrustedVaultPassphrase, @@ -1117,7 +1115,7 @@ GetSyncService(0), GetProfile(0)->GetPrefs())); #if !BUILDFLAG(IS_CHROMEOS_ASH) - // Verify the profile-menu error string is empty. + // Verify the profile-menu error string. EXPECT_EQ( sync_ui_util::TRUSTED_VAULT_RECOVERABILITY_DEGRADED_FOR_PASSWORDS_ERROR, sync_ui_util::GetAvatarSyncErrorType(GetProfile(0))); @@ -1148,27 +1146,30 @@ // Verify the profile-menu error string is empty. EXPECT_FALSE(sync_ui_util::GetAvatarSyncErrorType(GetProfile(0)).has_value()); #endif // !BUILDFLAG(IS_CHROMEOS_ASH) + + // TODO(crbug.com/1201659): Verify the recovery method hint added to the fake + // server. } IN_PROC_BROWSER_TEST_F(SingleClientNigoriWithRecoverySyncTest, ShouldDeferAddingTrustedVaultRecoverabilityMethod) { - const std::vector<uint8_t> kTestEncryptionKey = {1, 2, 3, 4}; const std::vector<uint8_t> kTestRecoveryMethodPublicKey = {1, 2, 3, 4}; const int kTestMethodTypeHint = 8; // Mimic the account being already using a trusted vault passphrase. - SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics({kTestEncryptionKey}), + const std::vector<uint8_t> trusted_vault_key = + GetSecurityDomainsServer()->RotateTrustedVaultKey( + /*last_trusted_vault_key=*/syncer::GetConstantTrustedVaultKey()); + SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics( + /*trusted_vault_keys=*/{trusted_vault_key}), GetFakeServer()); ASSERT_TRUE(SetupClients()); - syncer::StandaloneTrustedVaultClient* const trusted_vault_client = - static_cast<syncer::StandaloneTrustedVaultClient*>( - GetSyncService(0)->GetSyncClientForTest()->GetTrustedVaultClient()); - // Mimic the key being available upon startup but recoverability degraded. - trusted_vault_client->SetRecoverabilityDegradedForTesting(); + GetSecurityDomainsServer()->SetRecoverabilityDegraded(); GetSyncService(0)->AddTrustedVaultDecryptionKeysFromWeb( - kGaiaId, {kTestEncryptionKey}, /*last_key_version=*/1); + kGaiaId, {trusted_vault_key}, + /*last_key_version=*/GetSecurityDomainsServer()->GetCurrentEpoch()); // Mimic a recovery method being added before or during sign-in, which should // be deferred until sign-in completes. @@ -1315,18 +1316,18 @@ IN_PROC_BROWSER_TEST_F( SingleClientNigoriWithRecoveryAndPasswordsAccountStorageTest, ShouldReportDegradedTrustedVaultRecoverability) { - // Mimic the account using a trusted vault passphrase. - const std::vector<uint8_t> kTestEncryptionKey = {1, 2, 3, 4}; - SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics({kTestEncryptionKey}), + // Mimic the key being available upon startup but recoverability degraded. + const std::vector<uint8_t> trusted_vault_key = + GetSecurityDomainsServer()->RotateTrustedVaultKey( + /*last_trusted_vault_key=*/syncer::GetConstantTrustedVaultKey()); + GetSecurityDomainsServer()->SetRecoverabilityDegraded(); + SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics( + /*trusted_vault_keys=*/{trusted_vault_key}), GetFakeServer()); - - // The key is available on startup but recoverability is degraded. ASSERT_TRUE(SetupClients()); - static_cast<syncer::StandaloneTrustedVaultClient*>( - GetSyncService(0)->GetSyncClientForTest()->GetTrustedVaultClient()) - ->SetRecoverabilityDegradedForTesting(); GetSyncService(0)->AddTrustedVaultDecryptionKeysFromWeb( - kGaiaId, {kTestEncryptionKey}, /*last_key_version=*/1); + kGaiaId, {trusted_vault_key}, + /*last_key_version=*/GetSecurityDomainsServer()->GetCurrentEpoch()); SetupSyncTransport();
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index ca428b5b..e924652d 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1609,6 +1609,7 @@ "//chrome/common/search:mojo_bindings", "//chrome/common/themes:autogenerated_theme_util", "//components/autofill/content/browser/webauthn", + "//components/enterprise/common/proto:download_item_reroute_info_proto", "//components/feedback/proto", "//components/keep_alive_registry", "//components/media_router/common/mojom:media_router", @@ -2765,6 +2766,7 @@ "//chromeos/dbus/cryptohome:cryptohome_proto", "//chromeos/dbus/hermes", "//chromeos/dbus/kerberos:kerberos_proto", + "//chromeos/dbus/os_install", "//chromeos/dbus/pciguard:pciguard", "//chromeos/dbus/power", "//chromeos/dbus/session_manager", @@ -3493,14 +3495,6 @@ deps += [ "//ui/gfx/x" ] } - if (use_ozone) { - if (!is_linux && !is_chromeos_lacros) { - sources += [ - "views/frame/browser_desktop_window_tree_host_platform.cc", - "views/frame/browser_desktop_window_tree_host_platform.h", - ] - } - } if (is_linux || is_chromeos_lacros) { sources += [ "views/frame/browser_desktop_window_tree_host_linux.cc",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index f46a726..2c2e393 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4092,6 +4092,18 @@ <message name="IDS_SEND_TAB_TO_SELF_DEVICE_LAST_ACTIVE_TODAY" desc="String displayed in the device picker indicating the last time the device was synced to the user's account today."> Active today </message> + <message name="IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_GENERIC" desc="String displayed in the toast message when the type of the selected device can't be determined."> + device + </message> + <message name="IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_PHONE" desc="String displayed in the toast message when the selected device is a phone."> + phone + </message> + <message name="IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_COMPUTER" desc="String displayed in the toast message when the selected device is a computer."> + computer + </message> + <message name="IDS_SEND_TAB_TO_SELF_V2_TOAST" desc="Toast message shown after a device is selected from the device picker."> + Page sent. To see it, open Chrome on your <ph name="device_type">%1$s<ex>phone</ex></ph> + </message> <!-- Sharing --> <message name="IDS_SHARING_SENDING_NOTIFICATION_TITLE" desc="Title text displayed in a sharing sending notification.">
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_COMPUTER.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_COMPUTER.png.sha1 new file mode 100644 index 0000000..fcd96e5b --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_COMPUTER.png.sha1
@@ -0,0 +1 @@ +2c7e3cc0236aac3d0d1b808a631acd64b42e7866 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_GENERIC.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_GENERIC.png.sha1 new file mode 100644 index 0000000..5986146 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_GENERIC.png.sha1
@@ -0,0 +1 @@ +9c903d6e9eb0dc6a3dab6693bc65f51a2400c48b \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_PHONE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_PHONE.png.sha1 new file mode 100644 index 0000000..5986146 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_DEVICE_TYPE_PHONE.png.sha1
@@ -0,0 +1 @@ +9c903d6e9eb0dc6a3dab6693bc65f51a2400c48b \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_V2_TOAST.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_V2_TOAST.png.sha1 new file mode 100644 index 0000000..5986146 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SEND_TAB_TO_SELF_V2_TOAST.png.sha1
@@ -0,0 +1 @@ +9c903d6e9eb0dc6a3dab6693bc65f51a2400c48b \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index f1e35a6e..9e5cd45 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Vertaal …</translation> <translation id="4881695831933465202">Maak oop</translation> <translation id="488187801263602086">Hernoem lêer</translation> -<translation id="4882831918239250449">Beheer hoe jou blaaigeskiedenis gebruik word om Search, advertensies en meer te personaliseer</translation> <translation id="4885273946141277891">Ongesteunde aantal Chrome-gevalle.</translation> <translation id="4905269543817054577">Geskiedenis word nie in Incognito gestoor nie</translation> <translation id="4908869848243824489">Ontdek deur Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">As jy wagwoorde wil kopieer, moet jy eers 'n skermslot op jou toestel stel</translation> <translation id="5793665092639000975">Gebruik tans <ph name="SPACE_USED" /> van <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Soek en blaai</translation> -<translation id="5797070761912323120">Google kan jou geskiedenis gebruik om Search, advertensies en ander Google-dienste te personaliseer</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# uur gelede}other{# uur gelede}}</translation> <translation id="5810288467834065221">Kopiereg <ph name="YEAR" /> Google LLC. Alle regte voorbehou.</translation> <translation id="5810864297166300463">Webbystand</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 3681a71..473c133 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ተርጉም…</translation> <translation id="4881695831933465202">ክፈት</translation> <translation id="488187801263602086">ፋይልን ዳግም ይሰይሙ</translation> -<translation id="4882831918239250449">ፍለጋን፣ ማስታወቂያዎችን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> <translation id="4885273946141277891">የማይደገፍ የChrome አብነቶች ብዛት።</translation> <translation id="4905269543817054577">ታሪክ ማንነት በማያሳውቅ ውስጥ አልተቀመጠም</translation> <translation id="4908869848243824489">ምርምር በGoogle</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">የይለፍ ቃላትን ለመቅዳት መጀመሪያ በመሣሪያዎ ላይ የማያ ገጽ መቆለፊያን ያቀናብሩ</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> ከ<ph name="SPACE_AVAILABLE" /> በመጠቀም ላይ</translation> <translation id="5795872532621730126">ይፈልጉ እና ያስሱ</translation> -<translation id="5797070761912323120">Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ የእርስዎን ታሪክ ሊጠቀም ይችላል</translation> <translation id="5809361687334836369">{HOURS,plural, =1{ከ# ሰዓት በፊት}one{ከ# ሰዓቶች በፊት}other{ከ# ሰዓቶች በፊት}}</translation> <translation id="5810288467834065221">የቅጂ መብት <ph name="YEAR" /> Google LLC. ሁሉም መብቶች በህግ የተጠበቁ ናቸው።</translation> <translation id="5810864297166300463">የድር እርዳታ</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 a23fa54..8188197 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ترجمة…</translation> <translation id="4881695831933465202">فتح</translation> <translation id="488187801263602086">إعادة تسمية الملف</translation> -<translation id="4882831918239250449">التحكُّم في كيفية استخدامنا لسِجل التصفُّح الخاص بك لتخصيص البحث والإعلانات والمزيد</translation> <translation id="4885273946141277891">عدد نسخ Chrome غير متوافق.</translation> <translation id="4905269543817054577">لا يتم حفظ السجلّ في "وضع التصفُّح المتخفي"</translation> <translation id="4908869848243824489">اقتراحات من Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">لنسخ كلمات المرور، عليك أولاً إعداد قفل الشاشة على جهازك.</translation> <translation id="5793665092639000975">يتم استخدام <ph name="SPACE_USED" /> من أصل <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">البحث والتصفُّح</translation> -<translation id="5797070761912323120">قد تستخدم Google سجلّك لتخصيص البحث والإعلانات وخدمات Google الأخرى.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{قبل ساعة واحدة (#)}zero{قبل # ساعة}two{قبل ساعتين (#)}few{قبل # ساعات}many{قبل # ساعة}other{قبل # ساعة}}</translation> <translation id="5810288467834065221">حقوق الطبع والنشر لعام <ph name="YEAR" /> لشركة Google LLC. جميع الحقوق محفوظة.</translation> <translation id="5810864297166300463">المساعدة على الويب</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 2fd84f22..1aee364 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">অনুবাদ কৰক…</translation> <translation id="4881695831933465202">খোলক</translation> <translation id="488187801263602086">ফাইলটোৰ নতুন নাম দিয়ক</translation> -<translation id="4882831918239250449">Search, বিজ্ঞাপন আৰু অন্য সুবিধাসমূহ ব্যক্তিগতকৰণ কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস কেনেদৰে ব্যৱহাৰ কৰা হয় সেয়া নিয়ন্ত্ৰণ কৰক</translation> <translation id="4885273946141277891">অসমর্থিত সংখ্যক Chromeৰ কাৰ্যকলাপ।</translation> <translation id="4905269543817054577">ইনক’গনিট’ ম’ডত ইতিহাস ছেভ কৰা নহয়</translation> <translation id="4908869848243824489">Googleৰ Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">পাছৱৰ্ডসমূহৰ প্ৰতিলিপি কৰিবলৈ, আপোনাৰ ডিভাইচত প্ৰথমে এটা স্ক্ৰীন লক ছেট কৰক</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />ৰ <ph name="SPACE_USED" /> ব্যৱহাৰ কৰা হৈছে</translation> <translation id="5795872532621730126">সন্ধান আৰু ব্ৰাউজ কৰক</translation> -<translation id="5797070761912323120">Googleএ Search, বিজ্ঞাপন আৰু অন্য Google সেৱা ব্যক্তিকৃত কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস ব্যৱহাৰ কৰিব পাৰে</translation> <translation id="5809361687334836369">{HOURS,plural, =1{#ঘণ্টা পূৰ্বে}one{#ঘণ্টা পূৰ্বে}other{#ঘণ্টা পূৰ্বে}}</translation> <translation id="5810288467834065221">স্বত্বাধিকাৰ <ph name="YEAR" /> Google Inc। সর্বস্বত্ব সংৰক্ষিত।</translation> <translation id="5810864297166300463">ৱেবৰ সহায়ক</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 8a45f3f..8f172b2 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tərcümə edin...</translation> <translation id="4881695831933465202">Açın</translation> <translation id="488187801263602086">Faylın adını dəyişin</translation> -<translation id="4882831918239250449">Axtarış tarixçəsinin Axtarış, reklam və sairəni necə fərdiləşdirdiyinə nəzarət edin</translation> <translation id="4885273946141277891">Dəstəklənməyən Chrome nümunələrinin sayı.</translation> <translation id="4905269543817054577">Tarixçə Anonim rejimdə yadda saxlanılmır</translation> <translation id="4908869848243824489">Google Təkliflər</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Parolları kopyalamaq üçün öncə cihazınızda ekran kilidi ayarlayın</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" />/<ph name="SPACE_AVAILABLE" /> istifadə edilib</translation> <translation id="5795872532621730126">Axtarış və baxış</translation> -<translation id="5797070761912323120">Axtarış, reklam və digər Google xidmətlərini fərdiləşdirmək üçün Google tarixçədən istifadə edə bilər</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# saat öncə}other{# saat öncə}}</translation> <translation id="5810288467834065221">Müəllif hüquqları <ph name="YEAR" /> Google MMC. Bütün hüquqlar qorunur.</translation> <translation id="5810864297166300463">Veb Yardım</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 98834045..8a83449 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Перакласці…</translation> <translation id="4881695831933465202">Адкрыць</translation> <translation id="488187801263602086">Перайменаваць файл</translation> -<translation id="4882831918239250449">Кіраванне тым, як гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку, рэкламы і інш.</translation> <translation id="4885273946141277891">Недапушчальная колькасць версій Chrome.</translation> <translation id="4905269543817054577">У рэжыме інкогніта гісторыя не захоўваецца</translation> <translation id="4908869848243824489">Рэкамендацыі ад Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Каб капіраваць паролі, наладзьце на прыладзе блакіроўку экрана</translation> <translation id="5793665092639000975">Выкарыстоўваецца: <ph name="SPACE_USED" /> з <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Пошук і прагляд</translation> -<translation id="5797070761912323120">Google можа выкарыстоўваць вашу гісторыю, каб персаналізаваць пошук, паказ рэкламы і іншыя сэрвісы Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# гадзіну таму}one{# гадзіну таму}few{# гадзіны таму}many{# гадзін таму}other{# гадзіны таму}}</translation> <translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Усе правы абароненыя.</translation> <translation id="5810864297166300463">Дапамога пры рабоце ў інтэрнэце</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 74462a0..79b43cb 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Превод…</translation> <translation id="4881695831933465202">Отваряне</translation> <translation id="488187801263602086">Преименуване на файла</translation> -<translation id="4882831918239250449">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето, рекламите и др.</translation> <translation id="4885273946141277891">Неподдържан брой екземпляри на Chrome.</translation> <translation id="4905269543817054577">В режим „инкогнито“ историята не се запазва</translation> <translation id="4908869848243824489">Discover от Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">За да копирате пароли, първо настройте заключване на екрана на устройството си</translation> <translation id="5793665092639000975">Използвано място: <ph name="SPACE_USED" /> от <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Търсене и сърфиране</translation> -<translation id="5797070761912323120">Възможно е да използваме историята ви, за да персонализираме търсенето, рекламите и други услуги на Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{преди # час}other{преди # часа}}</translation> <translation id="5810288467834065221">Авторски права <ph name="YEAR" /> г. Google LLC. Всички права запазени.</translation> <translation id="5810864297166300463">Помощ в мрежата</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 76b1a5b..171bd60e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -592,7 +592,6 @@ <translation id="4880127995492972015">অনুবাদ করুন…</translation> <translation id="4881695831933465202">খুলুন</translation> <translation id="488187801263602086">ফাইলটির আবার নাম দিন</translation> -<translation id="4882831918239250449">সার্চ, বিজ্ঞাপনসহ আরও অনেক কিছু ব্যক্তিগতকৃত করার জন্য আপনার ব্রাউজিং ইতিহাস কীভাবে ব্যবহার হবে তা নিয়ন্ত্রণ করুন</translation> <translation id="4885273946141277891">অসমর্থিত সংখ্যার Chrome দৃষ্টান্তগুলি</translation> <translation id="4905269543817054577">'ছদ্মবেশী' মোডে ইতিহাস সেভ করা হয় না</translation> <translation id="4908869848243824489">Google-এর ডিসকভার</translation> @@ -733,7 +732,6 @@ <translation id="5780792035410621042">পাসওয়ার্ড কপি করতে, আপনার ডিভাইসে স্ক্রিন লক সেট করুন</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> এর <ph name="SPACE_USED" /> ব্যবহার করা হচ্ছে</translation> <translation id="5795872532621730126">সার্চ এবং ব্রাউজ করা</translation> -<translation id="5797070761912323120">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ঘণ্টা আগে}one{# ঘণ্টা আগে}other{# ঘণ্টা আগে}}</translation> <translation id="5810288467834065221">কপিরাইট <ph name="YEAR" /> Google LLC সব স্বত্ব সংরক্ষিত আছে।</translation> <translation id="5810864297166300463">ওয়েব সহায়তা</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 0f4fb26a..ee01b6c 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Prevedi…</translation> <translation id="4881695831933465202">Otvori</translation> <translation id="488187801263602086">Promjena naziva fajla</translation> -<translation id="4882831918239250449">Kontrolirajte kako se koristi vaša historija pregledanja za personalizaciju Pretraživanja i još mnogo toga</translation> <translation id="4885273946141277891">Nepodržani broj Chrome instanci.</translation> <translation id="4905269543817054577">Historija se ne pohranjuje u anonimnom načinu rada</translation> <translation id="4908869848243824489">Googleov Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Da kopirate lozinke, najprije postavite zaključavanje ekrana na uređaju</translation> <translation id="5793665092639000975">Koristi se <ph name="SPACE_USED" /> od <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Pretraživanje i pregledanje</translation> -<translation id="5797070761912323120">Google može koristiti vašu historiju za personalizaciju Pretraživanja, oglasa i drugih Googleovih usluga</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Prije # sat}one{Prije # sat}few{Prije # sata}other{Prije # sati}}</translation> <translation id="5810288467834065221">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava zadržana.</translation> <translation id="5810864297166300463">Pomoć na internetu</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 d9ec569..175d3c0 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tradueix…</translation> <translation id="4881695831933465202">Obre</translation> <translation id="488187801263602086">Canvia el nom del fitxer</translation> -<translation id="4882831918239250449">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca, els anuncis i molt més</translation> <translation id="4885273946141277891">No s'admet aquest nombre d'instàncies de Chrome.</translation> <translation id="4905269543817054577">L'historial no es desa en mode d'incògnit</translation> <translation id="4908869848243824489">Discover de Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Per copiar les contrasenyes, primer has d'establir un bloqueig de pantalla al dispositiu</translation> <translation id="5793665092639000975">S'estan utilitzant <ph name="SPACE_USED" /> de <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Cerca i navega</translation> -<translation id="5797070761912323120">És possible que Google utilitzi el teu historial per personalitzar la Cerca, els anuncis i altres serveis de Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{fa # hora}other{fa # hores}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Tots els drets reservats.</translation> <translation id="5810864297166300463">Assistència web</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 915f978..0d0ea849 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Přeložit…</translation> <translation id="4881695831933465202">Otevřít</translation> <translation id="488187801263602086">Přejmenovat soubor</translation> -<translation id="4882831918239250449">Nastavte, jak se má vaše historie procházení používat k personalizaci Vyhledávání, reklam a dalších služeb</translation> <translation id="4885273946141277891">Nepodporovaný počet instancí Chromu.</translation> <translation id="4905269543817054577">V anonymním režimu se neukládá historie</translation> <translation id="4908869848243824489">Kanál Objevit od Googlu</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Chcete-li zkopírovat hesla, nejdříve na zařízení nastavte zámek obrazovky</translation> <translation id="5793665092639000975">Je využito <ph name="SPACE_USED" /> z <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Vyhledávání a procházení internetu</translation> -<translation id="5797070761912323120">Google vaši historii může používat k personalizaci Vyhledávání, reklam a dalších služeb Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{před # hodinou}few{před # hodinami}many{před # hodiny}other{před # hodinami}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Všechna práva vyhrazena.</translation> <translation id="5810864297166300463">Asistence na webu</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 02146a8a..3d14d6d 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Oversæt…</translation> <translation id="4881695831933465202">Åbn</translation> <translation id="488187801263602086">Omdøb fil</translation> -<translation id="4882831918239250449">Styr, hvordan din browserhistorik anvendes til at tilpasse søgeresultater, annoncer og meget mere</translation> <translation id="4885273946141277891">Der er flere forekomster af Chrome, end der understøttes.</translation> <translation id="4905269543817054577">Historik gemmes ikke i inkognitotilstand</translation> <translation id="4908869848243824489">Discover fra Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Hvis du vil kopiere adgangskoder, skal du først konfigurere en skærmlås på din enhed</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> af <ph name="SPACE_AVAILABLE" /> i brug</translation> <translation id="5795872532621730126">Søg og gennemse</translation> -<translation id="5797070761912323120">Google kan bruge din historik til at tilpasse Søgning, annoncer og andre Google-tjenester</translation> <translation id="5809361687334836369">{HOURS,plural, =1{For 1 time siden}one{For # time siden}other{For # timer siden}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Alle rettigheder forbeholdes.</translation> <translation id="5810864297166300463">Webassistance</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 93c4f49..153c082 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Übersetzen…</translation> <translation id="4881695831933465202">Öffnen</translation> <translation id="488187801263602086">Datei umbenennen</translation> -<translation id="4882831918239250449">Legen Sie fest, wie Ihr Browserverlauf zur Personalisierung verwendet wird, z. B. bei der Suche und bei Werbung</translation> <translation id="4885273946141277891">Nicht unterstützte Anzahl von Chrome-Instanzen</translation> <translation id="4905269543817054577">Im Inkognitomodus wird der Verlauf nicht gespeichert</translation> <translation id="4908869848243824489">Discover von Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Wenn Sie Passwörter kopieren möchten, richten Sie zuerst eine Displaysperre auf Ihrem Gerät ein</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> von <ph name="SPACE_AVAILABLE" /> werden verwendet</translation> <translation id="5795872532621730126">Suchen und surfen</translation> -<translation id="5797070761912323120">Anhand Ihres Verlaufs kann Google die Google Suche, Werbung und andere Google-Dienste personalisieren</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Vor # Stunde}other{Vor # Stunden}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC Alle Rechte vorbehalten.</translation> <translation id="5810864297166300463">Web-Unterstützung</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 ef00b7b2..259614c 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Μετάφραση…</translation> <translation id="4881695831933465202">Άνοιγμα</translation> <translation id="488187801263602086">Μετονομασία αρχείου</translation> -<translation id="4882831918239250449">Ελέγξτε τον τρόπο με τον οποίο το ιστορικό περιήγησής σας χρησιμοποιείται για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων στοιχείων</translation> <translation id="4885273946141277891">Μη υποστηριζόμενος αριθμός παρουσιών Chrome.</translation> <translation id="4905269543817054577">Το ιστορικό δεν αποθηκεύεται σε κατάσταση ανώνυμης περιήγησης</translation> <translation id="4908869848243824489">Discover από την Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Για να αντιγράψετε κωδικούς πρόσβασης, ορίστε πρώτα ένα κλείδωμα οθόνης στη συσκευή σας.</translation> <translation id="5793665092639000975">Χρήση <ph name="SPACE_USED" /> από <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Αναζήτηση και περιήγηση</translation> -<translation id="5797070761912323120">Η Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Πριν από # ώρα}other{Πριν από # ώρες}}</translation> <translation id="5810288467834065221">Πνευματικά δικαιώματα <ph name="YEAR" /> Google LLC. Με την επιφύλαξη παντός δικαιώματος.</translation> <translation id="5810864297166300463">Βοήθεια ιστού</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 ee73ca5..95cdc14 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Translate…</translation> <translation id="4881695831933465202">Open</translation> <translation id="488187801263602086">Rename file</translation> -<translation id="4882831918239250449">Control how your browsing history is used to personalise Search, ads and more</translation> <translation id="4885273946141277891">Unsupported number of Chrome instances.</translation> <translation id="4905269543817054577">History isn’t saved in Incognito</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">To copy passwords, first set a screen lock on your device</translation> <translation id="5793665092639000975">Using <ph name="SPACE_USED" /> of <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Search and browse</translation> -<translation id="5797070761912323120">Google may use your history to personalise Search, ads and other Google services</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# hour ago}other{# hours ago}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation> <translation id="5810864297166300463">Web assistance</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 bef9100..f672001b 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traducir…</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="488187801263602086">Cambiar el nombre del archivo</translation> -<translation id="4882831918239250449">Controlar cómo se usa tu historial de navegación para personalizar la Búsqueda, los anuncios y mucho más</translation> <translation id="4885273946141277891">Cantidad de instancias de Chrome no admitidas</translation> <translation id="4905269543817054577">El historial no se guarda en el modo Incógnito</translation> <translation id="4908869848243824489">Descubre de Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Para copiar las contraseñas, primero establece un bloqueo de pantalla en el dispositivo.</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> de <ph name="SPACE_AVAILABLE" /> en uso</translation> <translation id="5795872532621730126">Busca y explora</translation> -<translation id="5797070761912323120">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Hace # hora}other{Hace # horas}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation> <translation id="5810864297166300463">Asistencia web</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 140f371..f3fb196 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traducir…</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="488187801263602086">Cambiar nombre de archivo</translation> -<translation id="4882831918239250449">Controla cómo se usa el historial de navegación para personalizar la Búsqueda, los anuncios y más</translation> <translation id="4885273946141277891">Número de instancias de Chrome no admitido.</translation> <translation id="4905269543817054577">En incógnito, el historial no se guarda</translation> <translation id="4908869848243824489">Discover de Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Para copiar contraseñas, primero debes establecer un bloqueo de pantalla en el dispositivo</translation> <translation id="5793665092639000975">Usando <ph name="SPACE_USED" /> de <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Busca y descubre</translation> -<translation id="5797070761912323120">Es posible que Google utilice tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Hace # hora}other{Hace # horas}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation> <translation id="5810864297166300463">Asistencia en la Web</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 2e6b4b44..de30859 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tõlgi …</translation> <translation id="4881695831933465202">Ava</translation> <translation id="488187801263602086">Faili ümbernimetamine</translation> -<translation id="4882831918239250449">Juhtige, kuidas teie sirvimisajalugu kasutatakse otsingu, reklaamide ja muu isikupärastamiseks</translation> <translation id="4885273946141277891">Toetamata arv Chrome'i eksemplare.</translation> <translation id="4905269543817054577">Ajalugu inkognito režiimis ei salvestata</translation> <translation id="4908869848243824489">Discover Google'ilt</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Paroolide kopeerimiseks määrake esmalt oma seadmes ekraanilukk</translation> <translation id="5793665092639000975">Kasutusel on <ph name="SPACE_USED" /> <ph name="SPACE_AVAILABLE" />-st</translation> <translation id="5795872532621730126">Otsi ja sirvi</translation> -<translation id="5797070761912323120">Google võib kasutada teie ajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# tund tagasi}other{# tundi tagasi}}</translation> <translation id="5810288467834065221">Autoriõigus <ph name="YEAR" /> Google LLC. Kõik õigused on kaitstud.</translation> <translation id="5810864297166300463">Veebipõhine abi</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 2346f42..ac3e22ca 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Itzuli…</translation> <translation id="4881695831933465202">Ireki</translation> <translation id="488187801263602086">Aldatu fitxategiaren izena</translation> -<translation id="4882831918239250449">Kontrolatu arakatze-historia nola erabiltzen den Bilaketa, iragarkiak eta beste pertsonalizatzeko</translation> <translation id="4885273946141277891">Chrome instantzia gehiegi daude irekita.</translation> <translation id="4905269543817054577">Historia ez da gordetzen ezkutuko moduan</translation> <translation id="4908869848243824489">Google-ren Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Pasahitzak kopiatzeko, ezarri lehendabizi pantailaren blokeoa gailuan</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" /> erabilita</translation> <translation id="5795872532621730126">Bilatu eta arakatu</translation> -<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Duela # ordu}other{Duela # ordu}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Eskubide guztiak erreserbatuta.</translation> <translation id="5810864297166300463">Sareko laguntza</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 b67cf870..f8ec30e 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ترجمه…</translation> <translation id="4881695831933465202">باز کردن</translation> <translation id="488187801263602086">تغییر نام فایل</translation> -<translation id="4882831918239250449">کنترل نحوه استفاده از سابقه مرور برای شخصیسازی «جستجو»، آگهیها و موارد دیگر</translation> <translation id="4885273946141277891">این تعداد از نسخههای Chrome پشتیبانی نمیشود.</translation> <translation id="4905269543817054577">سابقه در «حالت ناشناس» ذخیره نمیشود</translation> <translation id="4908869848243824489">«یافتهها» از Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">برای کپی کردن گذرواژهها، ابتدا در دستگاهتان قفل صفحه تنظیم کنید</translation> <translation id="5793665092639000975">درحال استفاده از <ph name="SPACE_USED" /> از <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">جستجو و مرور</translation> -<translation id="5797070761912323120">Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو، آگهیها و سایر سرویسهای Google استفاده کند</translation> <translation id="5809361687334836369">{HOURS,plural, =1{۱ ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}}</translation> <translation id="5810288467834065221">حق نشر <ph name="YEAR" /> Google LLC. کلیه حقوق محفوظ است.</translation> <translation id="5810864297166300463">دستیار وب</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 8321701..7994469b 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Käännä…</translation> <translation id="4881695831933465202">Avaa</translation> <translation id="488187801263602086">Nimeä tiedosto uudelleen</translation> -<translation id="4882831918239250449">Määritä, miten selaushistoria personoi hakua, mainoksia ja muita</translation> <translation id="4885273946141277891">Chromen versioiden määrää ei tueta.</translation> <translation id="4905269543817054577">Historiaa ei tallenneta incognito-tilassa</translation> <translation id="4908869848243824489">Google Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Jos haluat kopioida salasanoja, sinun on asetettava näytön lukitus laitteellesi</translation> <translation id="5793665092639000975">Käytössä <ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Hae ja selaa</translation> -<translation id="5797070761912323120">Google voi muokata Hakua, mainoksia ja muita Googlen palveluita historiasi perusteella</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# tunti sitten}other{# tuntia sitten}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Kaikki oikeudet pidätetään.</translation> <translation id="5810864297166300463">Verkkoapu</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 afb577bf7..5810801 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Isalin…</translation> <translation id="4881695831933465202">Buksan</translation> <translation id="488187801263602086">Palitan ang pangalan ng file</translation> -<translation id="4882831918239250449">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap, mga ad, at iba pa</translation> <translation id="4885273946141277891">Hindi sinusuportahang bilang ng mga instance ng Chrome.</translation> <translation id="4905269543817054577">Hindi nase-save ang history sa Incognito</translation> <translation id="4908869848243824489">Discover ng Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Para kopyahin ang mga password, magtakda muna ng lock ng screen sa iyong device</translation> <translation id="5793665092639000975">Gumagamit ng <ph name="SPACE_USED" /> ng <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Maghanap at mag-browse</translation> -<translation id="5797070761912323120">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# oras ang nakalipas}one{# oras ang nakalipas}other{# na oras ang nakalipas}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Nakalaan ang lahat ng karapatan.</translation> <translation id="5810864297166300463">Tulong sa Web</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 11e9add..85e32b3 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traduire…</translation> <translation id="4881695831933465202">Ouvrir</translation> <translation id="488187801263602086">Renommer le fichier</translation> -<translation id="4882831918239250449">Gérez la façon dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces et plus encore</translation> <translation id="4885273946141277891">Trop d'exécutions simultanées de Google Chrome.</translation> <translation id="4905269543817054577">L'historique n'est pas enregistré en mode de navigation privée</translation> <translation id="4908869848243824489">Découvertes par Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Pour copier les mots de passe, configurez d'abord un verrouillage d'écran sur votre appareil</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> sur <ph name="SPACE_AVAILABLE" /> utilisés</translation> <translation id="5795872532621730126">Rechercher et parcourir</translation> -<translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}</translation> <translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Tous droits réservés.</translation> <translation id="5810864297166300463">Assistance sur le Web</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 f79409f..3f1a18b 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traduire…</translation> <translation id="4881695831933465202">Ouvrir</translation> <translation id="488187801263602086">Renommer le fichier</translation> -<translation id="4882831918239250449">Contrôler la manière dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces, etc.</translation> <translation id="4885273946141277891">Le nombre d'instances de Chrome n'est pas compatible.</translation> <translation id="4905269543817054577">L'historique n'est pas enregistré en navigation privée</translation> <translation id="4908869848243824489">Discover de Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Pour copier les mots de passe, définissez d'abord un verrouillage d'écran sur votre appareil</translation> <translation id="5793665092639000975">Utilisation de <ph name="SPACE_USED" /> sur <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Rechercher et parcourir</translation> -<translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}}</translation> <translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Tous droits réservés.</translation> <translation id="5810864297166300463">Assistance sur le Web</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 bf11cb2..1035d450 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traducir…</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="488187801263602086">Cambia o nome do ficheiro</translation> -<translation id="4882831918239250449">Controla como se utiliza o historial de navegación para personalizar a Busca, os anuncios e moito máis</translation> <translation id="4885273946141277891">Non se admite este número de instancias de Chrome.</translation> <translation id="4905269543817054577">O historial non se garda no modo de incógnito</translation> <translation id="4908869848243824489">Discover, de Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Para poder copiar os contrasinais, define un bloqueo de pantalla no teu dispositivo</translation> <translation id="5793665092639000975">Espazo utilizado: <ph name="SPACE_USED" /> de <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Busca e navegación</translation> -<translation id="5797070761912323120">Google pode utilizar o teu historial para personalizar a Busca, os anuncios e outros servizos seus.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Hai # hora}other{Hai # horas}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos os dereitos reservados.</translation> <translation id="5810864297166300463">Asistencia na Web</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 a810faf..eaa48b933 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">અનુવાદ કરો…</translation> <translation id="4881695831933465202">ખોલો</translation> <translation id="488187801263602086">ફાઇલનું નામ બદલો</translation> -<translation id="4882831918239250449">તમારા બ્રાઉઝિંગ ઇતિહાસને શોધ, જાહેરાતો અને વધુ સુવિધાને વ્યક્તિગત કરવા માટે કેવી રીતે ઉપયોગમાં લેવાય તેને નિયંત્રિત કરો</translation> <translation id="4885273946141277891">અસમર્થિત સંખ્યામાં Chrome આવૃત્તિઓ.</translation> <translation id="4905269543817054577">છૂપા મોડમાં ઇતિહાસ સાચવવામાં આવતો નથી</translation> <translation id="4908869848243824489">Googleનું Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">પાસવર્ડ કૉપિ કરવા માટે, પહેલાં તમારા ડિવાઇસ પર સ્ક્રીન લૉક સેટ કરો</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />માંથી <ph name="SPACE_USED" />નો વપરાશ કરી રહ્યાં છીએ</translation> <translation id="5795872532621730126">શોધો અને બ્રાઉઝ કરો</translation> -<translation id="5797070761912323120">Google, શોધ, જાહેરાતો અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા ઇતિહાસનો ઉપયોગ કરી શકે છે</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# કલાક પહેલાં}one{# કલાક પહેલાં}other{# કલાક પહેલાં}}</translation> <translation id="5810288467834065221">કૉપિરાઇટ <ph name="YEAR" /> Google LLC. સર્વાધિકાર સુરક્ષિત.</translation> <translation id="5810864297166300463">વેબ માટે સહાય</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 1c41a72..d5ba664 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">अनुवाद करें…</translation> <translation id="4881695831933465202">खोलें</translation> <translation id="488187801263602086">फ़ाइल का नाम बदलें</translation> -<translation id="4882831918239250449">यह नियंत्रित करें कि खोज, विज्ञापनों वगैरह को मनमुताबिक बनाने के लिए आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे किया जाए</translation> <translation id="4885273946141277891">Chrome इंस्टेंस की असमर्थित संख्या.</translation> <translation id="4905269543817054577">गुप्त मोड में इतिहास सेव नहीं होता</translation> <translation id="4908869848243824489">Google का 'डिस्कवर'</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">पासवर्ड कॉपी करने के लिए, पहले अपने डिवाइस पर एक स्क्रीन लॉक सेट करें</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> में से <ph name="SPACE_USED" /> का इस्तेमाल किया जा रहा है</translation> <translation id="5795872532621730126">खोजें और ब्राउज़ करें</translation> -<translation id="5797070761912323120">खोज, विज्ञापन, और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता है</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# घंटा पहले}one{# घंटे पहले}other{# घंटे पहले}}</translation> <translation id="5810288467834065221">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्वाधिकार सुरक्षित.</translation> <translation id="5810864297166300463">वेब सहायता</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 4b3af967..817ddb54 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
@@ -589,7 +589,6 @@ <translation id="4880127995492972015">Prevedi…</translation> <translation id="4881695831933465202">Otvori</translation> <translation id="488187801263602086">Promijenite naziv datoteke</translation> -<translation id="4882831918239250449">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja, oglasa i drugog</translation> <translation id="4885273946141277891">Nepodržan broj različitih verzija Chromea.</translation> <translation id="4905269543817054577">Povijest se ne sprema u anonimnom načinu</translation> <translation id="4908869848243824489">Googleov Discover</translation> @@ -730,7 +729,6 @@ <translation id="5780792035410621042">Da biste kopirali zaporke, najprije postavite zaključavanje zaslona na uređaju</translation> <translation id="5793665092639000975">Upotrebljava se <ph name="SPACE_USED" /> od <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Pretražite i pregledajte</translation> -<translation id="5797070761912323120">Google može upotrebljavati vašu povijest za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga</translation> <translation id="5809361687334836369">{HOURS,plural, =1{prije # sata}one{prije # sata}few{prije # sata}other{prije # sati}}</translation> <translation id="5810288467834065221">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava pridržana.</translation> <translation id="5810864297166300463">Pomoć na webu</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 9dfe9d5..b184a10 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Fordítás…</translation> <translation id="4881695831933465202">Megnyitás</translation> <translation id="488187801263602086">Fájl átnevezése</translation> -<translation id="4882831918239250449">Beállíthatja, hogy a rendszer hogyan szabja személyre a Keresést, a hirdetéseket és egyebeket a böngészési előzmények alapján</translation> <translation id="4885273946141277891">Ilyen sok Chrome-példány nem futhat egyszerre.</translation> <translation id="4905269543817054577">Inkognitó módban nem menti az előzményeket a rendszer</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">A jelszavak másolásához először képernyőzárat kell beállítania az eszközön.</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />/<ph name="SPACE_USED" /> használatban</translation> <translation id="5795872532621730126">Keresés és böngészés</translation> -<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# órája}other{# órája}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Minden jog fenntartva.</translation> <translation id="5810864297166300463">Webes segítség</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 51d07fd..6ad8aed 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Թարգմանել…</translation> <translation id="4881695831933465202">Բացել</translation> <translation id="488187801263602086">Ֆայլի վերանվանում</translation> -<translation id="4882831918239250449">Կառավարեք ձեր այցելությունների պատմության օգտագործումը՝ Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> <translation id="4885273946141277891">Chrome-ի բացված էջերի թիվը չի աջակցվում:</translation> <translation id="4905269543817054577">Ինկոգնիտո ռեժիմում պատմությունը չի պահվում</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Գաղտնաբառերը պատճենելու համար նախ ձեր սարքում կարգավորեք էկրանի կողպումը</translation> <translation id="5793665092639000975">Օգտագործվում է՝ <ph name="SPACE_USED" />/<ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Որոնում և դիտարկում</translation> -<translation id="5797070761912323120">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել` Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ժամ առաջ}one{# ժամ առաջ}other{# ժամ առաջ}}</translation> <translation id="5810288467834065221">© Google LLC <ph name="YEAR" />։ Բոլոր իրավունքները պահպանված են:</translation> <translation id="5810864297166300463">Օգնություն համացանցում աշխատելիս</translation> @@ -1226,7 +1224,7 @@ <translation id="8835786707922974220">Համոզվեք, որ ձեր պահված գաղտնաբառերը միշտ հասանելի են ձեզ</translation> <translation id="883806473910249246">Բովանդակությունը ներբեռնելիս սխալ առաջացավ:</translation> <translation id="8840953339110955557">Այս էջը կարող է տարբերվել առցանց տարբերակից։</translation> -<translation id="8849001918648564819">Թաքցված է</translation> +<translation id="8849001918648564819">Ոչ ոք</translation> <translation id="8853345339104747198"><ph name="TAB_TITLE" />, ներդիր</translation> <translation id="8854223127042600341">Դիտեք անցանց ֆայլերը</translation> <translation id="8856607253650333758">Ստանալ նկարագրություններ</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 d64f5d1..b7389520 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Terjemahkan…</translation> <translation id="4881695831933465202">Buka</translation> <translation id="488187801263602086">Ganti nama file</translation> -<translation id="4882831918239250449">Kontrol cara histori browsing digunakan untuk mempersonalisasi Penelusuran, iklan, dan lainnya</translation> <translation id="4885273946141277891">Jumlah kemunculan Chrome tidak didukung.</translation> <translation id="4905269543817054577">Histori tidak disimpan dalam mode Samaran</translation> <translation id="4908869848243824489">Discover oleh Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Untuk menyalin sandi, setel kunci layar di perangkat terlebih dahulu</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> terpakai dari <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Penelusuran dan penjelajahan</translation> -<translation id="5797070761912323120">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# jam yang lalu}other{# jam yang lalu}}</translation> <translation id="5810288467834065221">Hak cipta <ph name="YEAR" /> Google LLC. Semua hak dilindungi undang-undang.</translation> <translation id="5810864297166300463">Bantuan Web</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 8008510..2040ce4 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Þýða…</translation> <translation id="4881695831933465202">Opna</translation> <translation id="488187801263602086">Endurnefna skrá</translation> -<translation id="4882831918239250449">Stjórnaðu því hvernig vefskoðunarferillinn þinn er notaður til að sérsníða leit, auglýsingar og fleira</translation> <translation id="4885273946141277891">Óstuddur fjöldi Chrome tilvika.</translation> <translation id="4905269543817054577">Ferill er ekki vistaður í huliðsstillingu</translation> <translation id="4908869848243824489">Tillögur frá Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Til að afrita aðgangsorð þarftu fyrst að stilla á skjálás í tækinu</translation> <translation id="5793665092639000975">Notar <ph name="SPACE_USED" /> af <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Leita og fletta</translation> -<translation id="5797070761912323120">Google notar hugsanlega ferilinn þinn til að sérsníða leitina, auglýsingar og aðra þjónustu Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Fyrir # klukkustund}one{Fyrir # klukkustund}other{Fyrir # klukkustundum}}</translation> <translation id="5810288467834065221">Höfundarréttur <ph name="YEAR" /> Google LLC. Öll réttindi áskilin.</translation> <translation id="5810864297166300463">Vefhjálp</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 71167c1..7ed193a 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traduci…</translation> <translation id="4881695831933465202">Apri</translation> <translation id="488187801263602086">Rinomina file</translation> -<translation id="4882831918239250449">Controlla il modo in cui la cronologia di navigazione viene utilizzata per personalizzare la Ricerca, gli annunci e altro ancora</translation> <translation id="4885273946141277891">Numero di istanze di Chrome non supportato.</translation> <translation id="4905269543817054577">La cronologia non viene salvata in modalità di navigazione in incognito</translation> <translation id="4908869848243824489">Discover di Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Per copiare le password, imposta prima un blocco schermo sul tuo dispositivo</translation> <translation id="5793665092639000975">Spazio utilizzato: <ph name="SPACE_USED" /> di <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Cerca e sfoglia</translation> -<translation id="5797070761912323120">Google può utilizzare la tua cronologia per personalizzare la Ricerca, gli annunci e altri servizi Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ora fa}other{# ore fa}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC Tutti i diritti riservati.</translation> <translation id="5810864297166300463">Assistenza Web</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 058d260..7d0e625 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">תרגום…</translation> <translation id="4881695831933465202">פתיחה</translation> <translation id="488187801263602086">שינוי שם של קובץ</translation> -<translation id="4882831918239250449">הגדרת השימוש בהיסטוריית הגלישה לצורך התאמה אישית של החיפוש, המודעות ועוד</translation> <translation id="4885273946141277891">מספר בלתי נתמך של מופעי Chrome.</translation> <translation id="4905269543817054577">ההיסטוריה לא נשמרת במצב אנונימי</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">כדי להעתיק סיסמאות, תחילה יש להגדיר נעילת מסך במכשיר</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> מתוך <ph name="SPACE_AVAILABLE" /> נמצאים בשימוש</translation> <translation id="5795872532621730126">חיפוש וגלישה</translation> -<translation id="5797070761912323120">Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים</translation> <translation id="5809361687334836369">{HOURS,plural, =1{לפני שעה}two{לפני שעתיים}many{לפני # שעות}other{לפני # שעות}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. כל הזכויות שמורות.</translation> <translation id="5810864297166300463">סיוע באינטרנט</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 32df37c..2841454b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">翻訳…</translation> <translation id="4881695831933465202">開く</translation> <translation id="488187801263602086">ファイル名を変更してください</translation> -<translation id="4882831918239250449">検索、広告などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="4885273946141277891">Chrome のインスタンス数の上限を超えています。</translation> <translation id="4905269543817054577">シークレット モードでは履歴は保存されません</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">パスワードをコピーするには、まずデバイスで画面ロックを設定してください</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> 中 <ph name="SPACE_USED" /> を使用中</translation> <translation id="5795872532621730126">検索とブラウジング</translation> -<translation id="5797070761912323120">検索、広告、その他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# 時間前}other{# 時間前}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation> <translation id="5810864297166300463">ウェブ アシスタント</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 118f6d2..a06b2b9 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">თარგმნა…</translation> <translation id="4881695831933465202">გახსნა</translation> <translation id="488187801263602086">ფაილის გადარქმევა</translation> -<translation id="4882831918239250449">მართეთ თქვენი დათვალიერების ისტორიის გამოყენების სპეციფიკა Search-ის, სარეკლამო კონტენტის და სხვა სერვისების პერსონალიზებისთვის</translation> <translation id="4885273946141277891">Chrome-ის ეგზემპლარების მხარდაუჭერელი რაოდენობა.</translation> <translation id="4905269543817054577">ისტორია არ ინახება ინკოგნიტო რეჟიმში</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">პაროლების კოპირებისთვის, პირველ რიგში, საჭიროა ეკრანის დაბლოკვის მეთოდის დაყენება თქვენს მოწყობილობაზე</translation> <translation id="5793665092639000975">გამოყენებულია <ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" />დან</translation> <translation id="5795872532621730126">ძიება და დათვალიერება</translation> -<translation id="5797070761912323120">Google-მა შეიძლება გამოიყენოს თქვენი ისტორია Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# საათის წინ}other{# საათის წინ}}</translation> <translation id="5810288467834065221">© <ph name="YEAR" />, Google LLC. ყველა უფლება დაცულია.</translation> <translation id="5810864297166300463">ვებ-დახმარება</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 4d77ebc..8af54ee 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
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="kk"> -<translation id="1016498331642356377">Дауыспен жылдам іздеу. Бұл жылдам пәрменді өзгерту үшін оны түртіп ұстап тұрыңыз.</translation> +<translation id="1016498331642356377">Дауыспен жылдам іздеу. Бұл жылдам пәрменді өзгерту үшін оны басып тұрыңыз.</translation> <translation id="1028699632127661925"><ph name="DEVICE_NAME" /> құрылғысына жіберілуде…</translation> <translation id="103269572468856066">Деректер өшірілсін бе?</translation> <translation id="1036348656032585052">Өшіру</translation> @@ -163,7 +163,7 @@ <translation id="2100314319871056947">Мәтін тым үлкен, аз-аздан бөлісіп көріңіз.</translation> <translation id="2109711654079915747">Беттен шықпай, веб-сайттардағы тақырыптар туралы мәлімет алуға болады. "Түртіп іздеу" функциясы сөзді оның айналасындағы мәнмәтінімен бірге Google Search қызметіне жіберіп, оның анықтамаларын, қатысты суреттерді, іздеу нәтижелерін және басқа мәліметтерді қайтарады. -Іздеу үшін кез келген сөзді түртіңіз. Іздеу сұрауын нақтылау және көбірек не азырақ сөз таңдау үшін оны түртіп, ұстап тұрыңыз. Іздеу сұрауын өзгерту үшін панельді ашыңыз, жаңа қойындыда ашу үшін белгішені түртіңіз, одан кейін іздеу өрісінде өзгертіңіз.</translation> +Іздеу үшін кез келген сөзді түртіңіз. Іздеу сұрауын нақтылау және көбірек не азырақ сөз таңдау үшін оны басып тұрыңыз. Іздеу сұрауын өзгерту үшін панельді ашыңыз, жаңа қойындыда ашу үшін белгішені түртіңіз, одан кейін іздеу өрісінде өзгертіңіз.</translation> <translation id="2111511281910874386">Бетке өту</translation> <translation id="2122601567107267586">Қолданбаны ашу мүмкін емес</translation> <translation id="2126426811489709554">Chrome арқылы</translation> @@ -204,7 +204,7 @@ <ph name="BEGIN_LIST_ITEM2" />Жарнама берушілер сіздің сайттарда жасаған әрекеттеріңізді бақыламай-ақ, жарнамалардың тиімділігін біле алады.<ph name="END_LIST_ITEM2" /></translation> <translation id="2337236196941929873">Chrome браузері сіз кіруіңіз мүмкін деп есептеген беттерді алдын ала жүктейді. Бұл үшін Chrome браузері cookie файлдарын (егер cookie файлдарына рұқсат берсеңіз) пайдалануы, сондай-ақ жеке басыңыз туралы ақпаратты сайттардан жасыру үшін беттерді Google арқылы шифрлап, жіберуі мүмкін.</translation> <translation id="234265804618409743">Камера ашылмайды. Бірдеңе дұрыс болмады.</translation> -<translation id="2345671828921229300">Іздеу үшін сөзді түртіп, ұстап тұрыңыз.</translation> +<translation id="2345671828921229300">Іздеу үшін сөзді басып тұрыңыз.</translation> <translation id="2349710944427398404">Chrome пайдаланатын жалпы деректер, соның ішінде есептік жазбалар, бетбелгілер және сақталған параметрлер</translation> <translation id="2353636109065292463">Интернет байланысы тексерілуде.</translation> <translation id="2359808026110333948">Жалғастыру</translation> @@ -221,7 +221,7 @@ <translation id="2450083983707403292"><ph name="FILE_NAME" /> файлын жүктеп алуды қайтадан бастағыңыз келе ме?</translation> <translation id="2450907520913474542">Беттен шықпай, веб-сайттардағы тақырыптар туралы мәлімет алуға болады. "Түртіп іздеу" функциясы сөзді оның айналасындағы мәнмәтінімен бірге Google Search қызметіне жіберіп, оның анықтамаларын, қатысты суреттерді, іздеу нәтижелерін және басқа мәліметтерді қайтарады. -Іздеу үшін кез келген сөзді түртіп, ұстап тұрыңыз. Іздеу сұрауын нақтылау үшін көбірек не азырақ сөз таңдаңыз. Іздеу сұрауын өзгерту үшін панельді ашыңыз, жаңа қойындыда ашу үшін белгішені түртіңіз, одан кейін іздеу өрісінде өзгертіңіз.</translation> +Іздеу үшін кез келген сөзді басып тұрыңыз. Іздеу сұрауын нақтылау үшін көбірек не азырақ сөз таңдаңыз. Іздеу сұрауын өзгерту үшін панельді ашыңыз, жаңа қойындыда ашу үшін белгішені түртіңіз, одан кейін іздеу өрісінде өзгертіңіз.</translation> <translation id="2459390580524506445">Жетілдірілген дауыспен іздеу</translation> <translation id="246532703174860178">Бөлісу</translation> <translation id="247737702124049222">Кескін сипаттамалары қосулы.</translation> @@ -365,7 +365,7 @@ <translation id="3341262203274374114">Жазылудан бас тарту мүмкін емес. Бірдеңе дұрыс болмады.</translation> <translation id="3359667936385849800">Қазіргі қызмет көрсетушіні пайдалану</translation> <translation id="3367813778245106622">Синхрондауды бастау үшін қайтадан кіріңіз</translation> -<translation id="337236281855091893">Іздеу үшін сөзді түртудің орнына оны басып ұстап тұрыңыз</translation> +<translation id="337236281855091893">Іздеу үшін сөзді түртудің орнына оны басып тұрыңыз</translation> <translation id="3373979091428520308">Бұл бетті басқа құрылғымен бөлісу үшін екінші құрылғыдағы Chrome параметрлерінен синхрондау функциясын қосыңыз.</translation> <translation id="3374023511497244703">Бетбелгілер, тарих, құпия сөздер және Chrome браузерінің басқа деректері сіздің Google есептік жазбаңызбен синхрондалмайды.</translation> <translation id="3384347053049321195">Сурет бөлісу</translation> @@ -375,7 +375,7 @@ <translation id="3398320232533725830">Бетбелгі менеджерін ашу</translation> <translation id="3414952576877147120">Көлемі:</translation> <translation id="3429160811076349561">Сынақ нұсқасының функциялары өшірулі</translation> -<translation id="3440975416244667276">Басқа сәйкес ақпарат алу үшін түртіп ұстап тұрыңыз.</translation> +<translation id="3440975416244667276">Басқа сәйкес ақпарат алу үшін басып тұрыңыз.</translation> <translation id="3443221991560634068">Ағымдағы бетті жаңарту</translation> <translation id="3451542610083122179">Privacy Sandbox — сізді бақылау механизмдерінен қорғауға көмектесетін әрі интернетті ашық қолдануға мүмкіндік беретін технология. @@ -590,7 +590,6 @@ <translation id="4880127995492972015">Аудару...</translation> <translation id="4881695831933465202">Ашу</translation> <translation id="488187801263602086">Файлдың атын өзгерту</translation> -<translation id="4882831918239250449">Іздеу, жарнама қызметтерін, т.б. жекелендіру үшін шолу тарихын қалай пайдалану керектігін көрсетіңіз</translation> <translation id="4885273946141277891">Chrome нұсқаларының қайшылығы орын алды.</translation> <translation id="4905269543817054577">Тарих инкогнито режимінде сақталмайды</translation> <translation id="4908869848243824489">Google ұсынатын Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Құпия сөздерді көшіру үшін алдымен құрылғыңызда экран құлпын орнатыңыз.</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" /> жад көлемі қолданылуда</translation> <translation id="5795872532621730126">Іздеу және шолу</translation> -<translation id="5797070761912323120">Search, жарнамалар және басқа да Google қызметтерін жеке қажеттеліктерге бейімдеу үшін Google интернеттегі әрекеттеріңізді пайдалануы мүмкін.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# сағат бұрын}other{# сағат бұрын}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Барлық құқықтары қорғалған.</translation> <translation id="5810864297166300463">Интернетті пайдалану кезінде көмек алу</translation> @@ -905,12 +903,12 @@ <translation id="671481426037969117"><ph name="FQDN" /> таймерінің уақыты бітті. Ол ертең қайта басталады.</translation> <translation id="6738516213925468394">Деректеріңіз <ph name="TIME" /> күні <ph name="BEGIN_LINK" />синхрондаудың құпия фразасымен<ph name="END_LINK" /> шифрланған. Синхрондау үшін оны енгізіңіз.</translation> <translation id="6738867403308150051">Жүктелуде…</translation> -<translation id="6751521182688001123">Жаңа қойындыны жылдам ашу. Бұл жылдам пәрменді өзгерту үшін оны түртіп ұстап тұрыңыз.</translation> +<translation id="6751521182688001123">Жаңа қойындыны жылдам ашу. Бұл жылдам пәрменді өзгерту үшін оны басып тұрыңыз.</translation> <translation id="6767294960381293877">Қойынды жіберілетін құрылғылар тізімі жарты экранға ашылған.</translation> <translation id="6783942555455976443">Бұл бетті кейінірек көруге сақтап, еске салғыш алыңыз.</translation> <translation id="6811034713472274749">Бетті көре беруге болады.</translation> <translation id="6813446258015311409">Chrome-ға кіру, ашық.</translation> -<translation id="6817747507826986771">Осы бетті жылдам бөлісу. Бұл жылдам пәрменді өзгерту үшін оны түртіп ұстап тұрыңыз.</translation> +<translation id="6817747507826986771">Осы бетті жылдам бөлісу. Бұл жылдам пәрменді өзгерту үшін оны басып тұрыңыз.</translation> <translation id="6820686453637990663">CVC коды</translation> <translation id="6824899148643461612"><ph name="TAB_TITLE" />, қойынды, таңдалды</translation> <translation id="6846298663435243399">Жүктелуде…</translation> @@ -1001,7 +999,7 @@ <translation id="7475688122056506577">SD картасы табылмады. Кейбір файлдарыңыз жоқ болуы мүмкін.</translation> <translation id="7479104141328977413">Қойындыны басқару</translation> <translation id="7481312909269577407">Басқаға жіберу</translation> -<translation id="7481864133709957613">Бұл беттен іздеу үшін сөздерді түртудің орнына басып ұстап тұрыңыз.</translation> +<translation id="7481864133709957613">Бұл беттен іздеу үшін сөздерді түртудің орнына басып тұрыңыз.</translation> <translation id="7482656565088326534">"Алдын ала қарау" қойындысы</translation> <translation id="7484997419527351112">Discover – өшірулі</translation> <translation id="7493994139787901920"><ph name="VERSION" /> (Жаңартылған <ph name="TIME_SINCE_UPDATE" />)</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 5f8b77e..585a78d4 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">បកប្រែ…</translation> <translation id="4881695831933465202">បើក</translation> <translation id="488187801263602086">ប្តូរឈ្មោះឯកសារ</translation> -<translation id="4882831918239250449">គ្រប់គ្រងរបៀបដែលប្រវត្តិរុករករបស់អ្នកត្រូវបានប្រើ ដើម្បីកំណត់ឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងអ្វីៗជាច្រើនទៀតស្របនឹងអ្នក</translation> <translation id="4885273946141277891">លេខមិនគាំទ្ររបស់ Chrome instances។</translation> <translation id="4905269543817054577">ប្រវត្តិមិនត្រូវបានរក្សាទុកនៅក្នុងមុខងារឯកជនទេ</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">ដើម្បីចម្លងពាក្យសម្ងាត់ សូមកំណត់ការចាក់សោអេក្រង់នៅលើឧបករណ៍របស់អ្នកជាមុនសិន</translation> <translation id="5793665092639000975">ប្រើអស់ <ph name="SPACE_USED" /> នៃ <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">ស្វែងរក និងរុករក</translation> -<translation id="5797070761912323120">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ម៉ោងមុន}other{# ម៉ោងមុន}}</translation> <translation id="5810288467834065221">រក្សាសិទ្ធិ <ph name="YEAR" /> Google LLC ។ រក្សាសិទ្ធិគ្រប់យ៉ាង។</translation> <translation id="5810864297166300463">ជំនួយនៅលើបណ្ដាញ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index aa5df49..b0a41c12 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ಅನುವಾದಿಸಿ…</translation> <translation id="4881695831933465202">ತೆರೆ</translation> <translation id="488187801263602086">ಫೈಲ್ ಮರುಹೆಸರಿಸಿ</translation> -<translation id="4882831918239250449">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="4885273946141277891">ಬೆಂಬಲಿಸದಿರುವ Chrome ನಿದರ್ಶನಗಳ ಸಂಖ್ಯೆ.</translation> <translation id="4905269543817054577">ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಇತಿಹಾಸವನ್ನು ಉಳಿಸಲಾಗಿಲ್ಲ</translation> <translation id="4908869848243824489">Google ನಿಂದ Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಕಲಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> ಯಲ್ಲಿ <ph name="SPACE_USED" /> ಬಳಸಲಾಗುತ್ತಿದೆ</translation> <translation id="5795872532621730126">ಹುಡುಕಿ ಮತ್ತು ಬ್ರೌಸ್ ಮಾಡಿ</translation> -<translation id="5797070761912323120">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ಗಂಟೆಯ ಹಿಂದೆ}one{# ಗಂಟೆಗಳ ಹಿಂದೆ}other{# ಗಂಟೆಗಳ ಹಿಂದೆ}}</translation> <translation id="5810288467834065221">ಕೃತಿಸ್ವಾಮ್ಯ <ph name="YEAR" /> Google LLC. ಎಲ್ಲ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation> <translation id="5810864297166300463">ವೆಬ್ ಸಹಾಯ ವಿಭಾಗ</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 4adc2a6..e89889d 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">번역...</translation> <translation id="4881695831933465202">열기</translation> <translation id="488187801263602086">파일 이름 변경</translation> -<translation id="4882831918239250449">검색, 광고 등을 맞춤설정하는 데 인터넷 방문 기록이 사용되는 방식 관리</translation> <translation id="4885273946141277891">지원되지 않는 Chrome 인스턴스 수입니다.</translation> <translation id="4905269543817054577">시크릿 모드에서는 기록이 저장되지 않음</translation> <translation id="4908869848243824489">Google 디스커버</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">비밀번호를 복사하려면 먼저 기기에 화면 잠금을 설정하세요.</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> 중 <ph name="SPACE_USED" /> 사용 중</translation> <translation id="5795872532621730126">검색 및 탐색</translation> -<translation id="5797070761912323120">Google에서 내 방문 기록을 사용하여 Google 검색, 광고 및 다른 Google 서비스를 맞춤설정할 수 있습니다.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{#시간 전}other{#시간 전}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation> <translation id="5810864297166300463">웹 어시스턴트</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 1ab54e2..5fb1479 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Которуу…</translation> <translation id="4881695831933465202">Ачуу</translation> <translation id="488187801263602086">Файлдын аталышын өзгөртүү</translation> -<translation id="4882831918239250449">Издөөнү, жарнамаларды жана башка кызматтарды жекечелештирүү үчүн серептөө таржымалыңыз кандайча пайдаланыларын көзөмөлдөңүз</translation> <translation id="4885273946141277891">Мындай сандагы Chrome нускалары колдоого алынбайт.</translation> <translation id="4905269543817054577">Таржымал Жашыруун режимде сакталбайт</translation> <translation id="4908869848243824489">Google сунуштары</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Сырсөздөрдү көчүрүү үчүн түзмөгүңүздө экранды кулпулоо функциясын жөндөңүз</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> ичинен <ph name="SPACE_USED" /> колдонулууда</translation> <translation id="5795872532621730126">Издөө жана серептөө</translation> -<translation id="5797070761912323120">Издөө, жарнама жана башка Google кызматтарын жекечелештирүү үчүн, Google таржымалыңызды колдонушу мүмкүн</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# саат мурун}other{# саат мурун}}</translation> <translation id="5810288467834065221">© Google LLC, <ph name="YEAR" /> Баардык укуктар корголгон.</translation> <translation id="5810864297166300463">Интернетте жардам алуу</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 5bd0bfa0..e42b198 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ແປພາສາ…</translation> <translation id="4881695831933465202">ເປີດ</translation> <translation id="488187801263602086">ປ່ຽນຊື່ໄຟລ໌</translation> -<translation id="4882831918239250449">ຄວບຄຸມວ່າຈະໃຫ້ໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານແນວໃດເພື່ອປັບແຕ່ງການຊອກຫາ, ໂຄສະນາ ແລະ ອື່ນໆອີກໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="4885273946141277891">ຈໍານວນຂອງຕົວຢ່າງ Chrome ທີ່ບໍ່ຮອງຮັບ.</translation> <translation id="4905269543817054577">ບໍ່ໄດ້ບັນທຶກປະຫວັດໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="4908869848243824489">Discover ໂດຍ Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">ເພື່ອສຳເນົາລະຫັດຜ່ານ, ໃຫ້ຕັ້ງໜ້າຈໍລັອກຢູ່ອຸປະກອນຂອງທ່ານກ່ອນ</translation> <translation id="5793665092639000975">ໃຊ້ <ph name="SPACE_USED" /> ຈາກທັງໝົດ <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">ຊອກຫາ ແລະ ເປີດເບິ່ງ</translation> -<translation id="5797070761912323120">Google ອາດຈະໃຊ້ປະຫວັດຂອງທ່ານເພື່ອປັບແຕ່ງຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນຂອງ Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ຊົ່ວໂມງກ່ອນນີ້}other{# ຊົ່ວໂມງກ່ອນນີ້}}</translation> <translation id="5810288467834065221">ລິຂະສິດ <ph name="YEAR" /> Google LLC. ສະຫງວນສິດທັງໝົດ.</translation> <translation id="5810864297166300463">ການຊ່ວຍເຫຼືອທາງເວັບ</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 e95d5162..4f3406a 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Versti…</translation> <translation id="4881695831933465202">Atidaryti</translation> <translation id="488187801263602086">Failo pervardijimas</translation> -<translation id="4882831918239250449">Naršymo istorijos naudojimo paieškai, skelbimams ir kitoms funkcijoms suasmeninti valdymas</translation> <translation id="4885273946141277891">Nepalaikomas „Chrome“ atvejų skaičius.</translation> <translation id="4905269543817054577">Istorija nėra saugoma inkognito režimu</translation> <translation id="4908869848243824489">„Google“ funkcija „Discover“</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Jei norite nukopijuoti slaptažodžius, pirmiausia nustatykite įrenginio ekrano užraktą</translation> <translation id="5793665092639000975">Naudojama <ph name="SPACE_USED" /> iš <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Ieškoti ir naršyti</translation> -<translation id="5797070761912323120">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Prieš 1 valandą}one{Prieš # valandą}few{Prieš # valandas}many{Prieš # valandos}other{Prieš # valandų}}</translation> <translation id="5810288467834065221">Autorių teisės „Google LLC.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation> <translation id="5810864297166300463">Žiniatinklio pagalba</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 e33f3ee9..da1b1ba00 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tulkot</translation> <translation id="4881695831933465202">Atvērt</translation> <translation id="488187801263602086">Faila pārdēvēšana</translation> -<translation id="4882831918239250449">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas, reklāmu un cita satura personalizēšanai</translation> <translation id="4885273946141277891">Neatbalstīts Chrome instanču skaits</translation> <translation id="4905269543817054577">Inkognito režīmā vēsture netiek saglabāta.</translation> <translation id="4908869848243824489">Google funkcija Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Lai kopētu paroles, vispirms iestatiet ekrāna bloķēšanu savā ierīcē.</translation> <translation id="5793665092639000975">Izmantotais apjoms: <ph name="SPACE_USED" /> no <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Meklēšana un pārlūkošana</translation> -<translation id="5797070761912323120">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{pirms # stundas}zero{pirms # stundām}one{pirms # stundas}other{pirms # stundām}}</translation> <translation id="5810288467834065221">Autortiesības: <ph name="YEAR" /> Google LLC. Visas tiesības paturētas.</translation> <translation id="5810864297166300463">Palīdzība tīmeklī</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 803f380..36e586c 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Преведи…</translation> <translation id="4881695831933465202">Отвори</translation> <translation id="488187801263602086">Преименување датотеката</translation> -<translation id="4882831918239250449">Контролирајте како вашата историја на прелистување се користи за персонализирање на „Пребарувањето“, рекламите и друго</translation> <translation id="4885273946141277891">Неподдржан број примероци на Chrome.</translation> <translation id="4905269543817054577">Историјата не се зачувува кога сте во „Инкогнито“</translation> <translation id="4908869848243824489">Discover од Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">За да ги копирате лозинките, прво поставете заклучување екран на уредот</translation> <translation id="5793665092639000975">Искористен простор: <ph name="SPACE_USED" /> од <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Пребарување и прелистување</translation> -<translation id="5797070761912323120">Google може да ја користи вашата историја за да го персонализира „Пребарувањето“, рекламите и другите услуги на Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Пред # час}one{Пред # час}other{Пред # часа}}</translation> <translation id="5810288467834065221">Авторски права <ph name="YEAR" /> Google LLC. Сите права се задржани.</translation> <translation id="5810864297166300463">Помош на интернет</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 4cc902e..c34741c 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">വിവർത്തനം ചെയ്യുക…</translation> <translation id="4881695831933465202">തുറക്കുക</translation> <translation id="488187801263602086">ഫയലിന്റെ പേര് മാറ്റുക</translation> -<translation id="4882831918239250449">തിരയൽ, പരസ്യങ്ങൾ എന്നിവയും മറ്റും വ്യക്തിപരമാക്കുന്നതിനായി നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="4885273946141277891">പിന്തുണയ്ക്കാത്തത്ര Chrome പതിപ്പുകൾ</translation> <translation id="4905269543817054577">അദൃശ്യ മോഡിൽ ചരിത്രം സംരക്ഷിച്ചിട്ടില്ല</translation> <translation id="4908869848243824489">Google-ന്റെ Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">പാസ്വേഡുകൾ പകർത്താൻ, ആദ്യം നിങ്ങളുടെ ഉപകരണത്തിൽ സ്ക്രീൻ ലോക്ക് സജ്ജീകരിക്കുക</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" /> ഉപയോഗിക്കുന്നു</translation> <translation id="5795872532621730126">തിരയുക, ബ്രൗസ് ചെയ്യുക</translation> -<translation id="5797070761912323120">തിരയലും പരസ്യവും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# മണിക്കൂര് മുമ്പ്}other{# മണിക്കൂര് മുമ്പ്}}</translation> <translation id="5810288467834065221">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</translation> <translation id="5810864297166300463">വെബ് സഹായം</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 28990b7..e7126e17 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
@@ -589,7 +589,6 @@ <translation id="4880127995492972015">Орчуулах…</translation> <translation id="4881695831933465202">Нээх</translation> <translation id="488187801263602086">Файлын нэрийг өөрчлөх</translation> -<translation id="4882831918239250449">Таны хайлтын түүхийг Хайлт, зар болон бусад үйлчилгээг тохируулахад хэрхэн ашигладгийг удирдах</translation> <translation id="4885273946141277891">Chrome-ийн хэд хэдэн дэмжигдээгүй тохиолдол</translation> <translation id="4905269543817054577">Нууцлалын горимд түүхийг хадгалдаггүй</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -730,7 +729,6 @@ <translation id="5780792035410621042">Нууц үгнүүдийг хуулахын тулд эхлээд төхөөрөмж дээрээ дэлгэцийн түгжээ тохируулна уу</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />-н <ph name="SPACE_USED" />-г ашиглаж байна</translation> <translation id="5795872532621730126">Хайх болон үзэх</translation> -<translation id="5797070761912323120">Google таны түүхийг Хайлт, зар болон Google-н бусад үйлчилгээг хувийн болгох зорилгоор ашиглаж болзошгүй</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# цагийн өмнө}other{# цагийн өмнө}}</translation> <translation id="5810288467834065221">Зохиогчийн эрх <ph name="YEAR" /> Google ХХК. Бүх эрх хуулиар хамгаалагдсан.</translation> <translation id="5810864297166300463">Вебийн тусламж</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 8106285..8f987eca 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">भाषांतर करा…</translation> <translation id="4881695831933465202">उघडा</translation> <translation id="488187801263602086">फाइलला पुन्हा नाव द्या</translation> -<translation id="4882831918239250449">तुम्ही ब्राउझ करत असलेला इतिहास पर्सनलाइझ शोध, जाहिराती आणि बरेच काही करण्यासाठी कसा वापरला जातो ते नियंत्रित करा</translation> <translation id="4885273946141277891">Chrome उदाहरणांची असमर्थित संख्या.</translation> <translation id="4905269543817054577">गुप्त मोडमध्ये इतिहास सेव्ह केला जात नाही</translation> <translation id="4908869848243824489">Google चे Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">पासवर्ड कॉपी करण्यासाठी, सर्वप्रथम तुमच्या डिव्हाइसवर स्क्रीन लॉक सेट करा</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> पैकी <ph name="SPACE_USED" /> वापरत आहे</translation> <translation id="5795872532621730126">शोधा आणि ब्राउझ करा</translation> -<translation id="5797070761912323120">शोध, जाहिरात आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# तासापूर्वी}other{# तासांपूर्वी}}</translation> <translation id="5810288467834065221">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्व हक्क राखीव.</translation> <translation id="5810864297166300463">वेब साहाय्य</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 f098b1a..0e19430f 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Terjemah…</translation> <translation id="4881695831933465202">Buka</translation> <translation id="488187801263602086">Namakan semula fail</translation> -<translation id="4882831918239250449">Kawal cara sejarah penyemakan imbas anda digunakan untuk memperibadikan Carian, iklan dan pelbagai lagi</translation> <translation id="4885273946141277891">Bilangan kejadian Chrome tidak disokong.</translation> <translation id="4905269543817054577">Sejarah tidak disimpan dalam Inkognito</translation> <translation id="4908869848243824489">Discover oleh Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Untuk menyalin kata laluan, pertama sekali, tetapkan kunci skrin pada peranti anda</translation> <translation id="5793665092639000975">Menggunakan <ph name="SPACE_USED" /> daripada <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Cari dan semak imbas</translation> -<translation id="5797070761912323120">Google boleh menggunakan sejarah anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# jam yang lalu}other{# jam yang lalu}}</translation> <translation id="5810288467834065221">Hak Cipta <ph name="YEAR" /> Google LLC. Hak cipta terpelihara.</translation> <translation id="5810864297166300463">Bantuan Web</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 3145288..a1d8299 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ဘာသာပြန်ရန်…</translation> <translation id="4881695831933465202">ဖွင့်</translation> <translation id="488187801263602086">ဖိုင်ကို အမည်ပြောင်းခြင်း</translation> -<translation id="4882831918239250449">Search၊ ကြော်ငြာနှင့် အခြားအရာများကို ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်ရာတွင် အသုံးပြုမှုရာဇဝင်ကို မည်သို့အသုံးပြုကြောင်း ထိန်းချုပ်ပါ</translation> <translation id="4885273946141277891">Chrome ဖြစ်စဉ်များ၏ အရေအတွက်ကို ပံ့ပိုးမပေးပါ။</translation> <translation id="4905269543817054577">‘ရုပ်ဖျက်မုဒ်’ တွင် မှတ်တမ်းကို မသိမ်းပါ</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">စကားဝှက်များမိတ္တူကူးရန် သင့်စက်တွင် ဖန်သားပြင်လော့ခ်တစ်ခု ဦးစွာသတ်မှတ်ပါ</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> အနက် <ph name="SPACE_USED" /> ကို သုံးနေသည်</translation> <translation id="5795872532621730126">ရှာဖွေခြင်းနှင့် ကြည့်ရှုခြင်း</translation> -<translation id="5797070761912323120">Search၊ ကြော်ငြာနှင့် အခြား Google ဝန်ဆောင်မှုများအား ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် Google က သင့်မှတ်တမ်းကို သုံးနိုင်သည်</translation> <translation id="5809361687334836369">{HOURS,plural, =1{လွန်ခဲ့သည့် # နာရီက}other{လွန်ခဲ့သည့် # နာရီက}}</translation> <translation id="5810288467834065221">မူပိုင် <ph name="YEAR" /> Google LLC. မူပိုင်ခွင့်အားလုံး ယူထားသည်။</translation> <translation id="5810864297166300463">ဝဘ်အထောက်အကူ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 687e80f..ddda52f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -588,7 +588,6 @@ <translation id="4880127995492972015">अनुवाद गर्नुहोस्…</translation> <translation id="4881695831933465202">खोल्नुहोस्</translation> <translation id="488187801263602086">फाइलको पुनः नामकरण गर्नुहोस्</translation> -<translation id="4882831918239250449">खोज, विज्ञापन र थप कुराहरू वैयक्तीकृत गर्ने प्रयोजनका लागि तपाईंको ब्राउजिङ इतिहासको प्रयोग गरिने तरिका नियन्त्रण गर्नुहोस्</translation> <translation id="4885273946141277891">असमर्थित संख्याका Chrome दृष्टान्तहरू।</translation> <translation id="4905269543817054577">इन्कोग्निटो मोडमा ब्राउज गर्दा इतिहास सेभ गरिँदैन</translation> <translation id="4908869848243824489">Google को Discover</translation> @@ -729,7 +728,6 @@ <translation id="5780792035410621042">पासवर्ड कपी गर्न सर्वप्रथम आफ्नो यन्त्रमा स्क्रिन लक सेट गर्नुहोस्</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> मध्ये <ph name="SPACE_USED" /> प्रयोग गरिँदै</translation> <translation id="5795872532621730126">खोज्नुहोस् तथा ब्राउज गर्नुहोस्</translation> -<translation id="5797070761912323120">Google ले खोज, विज्ञापन र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको इतिहाससम्बन्धी जानकारी प्रयोग गर्न सक्छ</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# घन्टा अघि}other{# घन्टा अघि}}</translation> <translation id="5810288467834065221">प्रतिलिपि अधिकार <ph name="YEAR" /> Google LLC। सर्वाधिकार सुरक्षित।</translation> <translation id="5810864297166300463">वेबसम्बन्धी सहायता</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 e36de50..05b0da6 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Vertalen…</translation> <translation id="4881695831933465202">Openen</translation> <translation id="488187801263602086">Naam van bestand wijzigen</translation> -<translation id="4882831918239250449">Beheren hoe je browsegeschiedenis wordt gebruikt om Google Zoeken, advertenties en meer te personaliseren</translation> <translation id="4885273946141277891">Niet-ondersteund aantal Chrome-instanties.</translation> <translation id="4905269543817054577">De geschiedenis wordt niet opgeslagen in de incognitomodus</translation> <translation id="4908869848243824489">Discover van Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Als je wachtwoorden wilt kopiëren, moet je eerst een schermvergrendeling instellen op je apparaat</translation> <translation id="5793665092639000975">Er wordt <ph name="SPACE_USED" /> van de <ph name="SPACE_AVAILABLE" /> gebruikt</translation> <translation id="5795872532621730126">Zoeken en browsen</translation> -<translation id="5797070761912323120">Google kan je geschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# uur geleden}other{# uur geleden}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Alle rechten voorbehouden.</translation> <translation id="5810864297166300463">Webhulp</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 8ee7734..cd682e17 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Oversett</translation> <translation id="4881695831933465202">Åpne</translation> <translation id="488187801263602086">Endre navnet på filen</translation> -<translation id="4882831918239250449">Kontrollér hvordan nettleserloggen din brukes til personlig tilpasning av søk, annonser med mer</translation> <translation id="4885273946141277891">For mange Chrome-forekomster.</translation> <translation id="4905269543817054577">Loggen lagres ikke i Inkognito</translation> <translation id="4908869848243824489">Discover fra Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">For å kopiere passord må du først angi en skjermlås på enheten</translation> <translation id="5793665092639000975">Bruker <ph name="SPACE_USED" /> av <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Søk etter og bla gjennom</translation> -<translation id="5797070761912323120">Google kan bruke loggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation> <translation id="5809361687334836369">{HOURS,plural, =1{for # time siden}other{for # timer siden}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Med enerett.</translation> <translation id="5810864297166300463">Netthjelp</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 d17af0794..ef78ccec 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ଅନୁବାଦ କରନ୍ତୁ…</translation> <translation id="4881695831933465202">ଖୋଲନ୍ତୁ</translation> <translation id="488187801263602086">ଫାଇଲ୍କୁ ରିନେମ୍ କରନ୍ତୁ</translation> -<translation id="4882831918239250449">ସର୍ଚ୍ଚ, ବିଜ୍ଞପ୍ତି ଏବଂ ଆହୁରି ଅଧିକକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି କିପରି ବ୍ୟବହାର ହେଉଛି ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="4885273946141277891">Chrome ଇନ୍ଷ୍ଟାନ୍ସଗୁଡ଼ିକର ଅସମର୍ଥିତ ସଂଖ୍ୟା।</translation> <translation id="4905269543817054577">ଇନକଗ୍ନିଟୋ ମୋଡରେ ଇତିହାସ ସେଭ୍ ହୁଏ ନାହିଁ</translation> <translation id="4908869848243824489">Googleର Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">ପାସୱାର୍ଡଗୁଡ଼ିକୁ କପି କରିବା ପାଇଁ, ପ୍ରଥମେ ଆପଣଙ୍କ ଡିଭାଇସରେ ଏକ ସ୍କ୍ରିନ୍ ଲକ୍ ସେଟ୍ କରନ୍ତୁ</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />ର <ph name="SPACE_USED" /> ବ୍ୟବହାର କରୁଛନ୍ତି</translation> <translation id="5795872532621730126">ସର୍ଚ୍ଚ କରି ବ୍ରାଉଜ୍ କରନ୍ତୁ</translation> -<translation id="5797070761912323120">ଆପଣ କରୁଥିବା ସର୍ଚ୍ଚ, ଦେଖୁଥିବା ବିଜ୍ଞାପନ, ଏବଂ ଅନ୍ୟାନ୍ୟ Google ସେବାକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ Google ଆପଣଙ୍କର ଇତିବୃତ୍ତିକୁ ବ୍ୟବହାର କରିପାରେ</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ଘଣ୍ଟା ପୂର୍ବେ}other{# ଘଣ୍ଟା ପୂର୍ବେ}}</translation> <translation id="5810288467834065221">କପିରାଇଟ୍ <ph name="YEAR" /> Google LLC। ସର୍ବସ୍ୱତ୍ୱ ସଂରକ୍ଷିତ।</translation> <translation id="5810864297166300463">ୱେବ୍ ସହାୟତା</translation> @@ -792,7 +790,7 @@ <translation id="6111020039983847643">ବ୍ୟବହୃତ ଡାଟା</translation> <translation id="6112702117600201073">ପୃଷ୍ଠା ରିଫ୍ରେସ୍ ହେଉଛି</translation> <translation id="6122831415929794347">ସେଫ୍ ବ୍ରାଉଜିଂ ବନ୍ଦ କରିବେ?</translation> -<translation id="6127379762771434464">ଆଇଟମ୍ କଢ଼ାଗଲା</translation> +<translation id="6127379762771434464">ଆଇଟମକୁ କାଢ଼ି ଦିଆଯାଇଛି</translation> <translation id="6137022273846704445"><ph name="APP_NAME" />ର ଭାଷା</translation> <translation id="6138832295072039549">ଏଠାରେ ଆପଣଙ୍କ ସାଇଟର ସେଟିଂସ୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> <translation id="6140709049082532940">ଉନ୍ନତ ସୁରକ୍ଷା:</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 702e7c5..23cb6bec 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ਅਨੁਵਾਦ ਕਰੋ…</translation> <translation id="4881695831933465202">ਖੋਲ੍ਹੋ</translation> <translation id="488187801263602086">ਫ਼ਾਈਲ ਦਾ ਨਾਮ ਬਦਲੋ</translation> -<translation id="4882831918239250449">'ਖੋਜ', ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਵਰਤੇ ਜਾਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ</translation> <translation id="4885273946141277891">Chrome ਦੇ ਕਈ ਅਸਮਰਥਿਤ ਵਰਜਨ</translation> <translation id="4905269543817054577">ਇਨਕੋਗਨਿਟੋ ਵਿੱਚ ਇਤਿਹਾਸ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ</translation> <translation id="4908869848243824489">Google ਵੱਲੋਂ Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">ਪਾਸਵਰਡ ਕਾਪੀ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਸਕ੍ਰੀਨ ਲਾਕ ਸੈੱਟ ਕਰੋ</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> ਵਿੱਚੋਂ <ph name="SPACE_USED" /> ਦੀ ਵਰਤੋਂ ਹੋ ਰਹੀ ਹੈ</translation> <translation id="5795872532621730126">ਖੋਜੋ ਅਤੇ ਬ੍ਰਾਊਜ਼ ਕਰੋ</translation> -<translation id="5797070761912323120">Google ਖੋਜ, ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰਾਂ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹੈ</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ਘੰਟਾ ਪਹਿਲਾਂ}one{# ਘੰਟੇ ਪਹਿਲਾਂ}other{# ਘੰਟੇ ਪਹਿਲਾਂ}}</translation> <translation id="5810288467834065221">ਕਾਪੀਰਾਈਟ <ph name="YEAR" /> Google LLC. ਸਾਰੇ ਹੱਕ ਰਾਖਵੇਂ ਹਨ।</translation> <translation id="5810864297166300463">ਵੈੱਬ ਸਹਾਇਤਾ</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 e9d16f80..c119ff93 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Przetłumacz…</translation> <translation id="4881695831933465202">Otwórz</translation> <translation id="488187801263602086">Zmień nazwę pliku</translation> -<translation id="4882831918239250449">Zarządzaj personalizacją wyszukiwarki, reklam i innych funkcji na podstawie historii przeglądania</translation> <translation id="4885273946141277891">Nieobsługiwana liczba wystąpień Chrome.</translation> <translation id="4905269543817054577">W trybie incognito historia nie jest zapisywana</translation> <translation id="4908869848243824489">Discover od Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Aby skopiować hasła, najpierw ustaw blokadę ekranu na urządzeniu</translation> <translation id="5793665092639000975">Zajmują <ph name="SPACE_USED" /> z <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Wyszukiwanie i przeglądanie</translation> -<translation id="5797070761912323120">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania, reklamy i działanie innych usług</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# godzinę temu}few{# godziny temu}many{# godzin temu}other{# godziny temu}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Wszelkie prawa zastrzeżone.</translation> <translation id="5810864297166300463">Pomoc dotycząca sieci</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 cb870fb..f5e528c 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
@@ -591,7 +591,6 @@ <translation id="4880127995492972015">Traduzir…</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="488187801263602086">Renomear arquivo</translation> -<translation id="4882831918239250449">Controla como o histórico de navegação é usado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="4885273946141277891">Número de instâncias do Google Chrome não suportado.</translation> <translation id="4905269543817054577">O histórico não é salvo na navegação anônima</translation> <translation id="4908869848243824489">Discover do Google</translation> @@ -732,7 +731,6 @@ <translation id="5780792035410621042">Para poder copiar senhas, configure um bloqueio de tela no dispositivo</translation> <translation id="5793665092639000975">Usando <ph name="SPACE_USED" /> de <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Pesquisar e navegar</translation> -<translation id="5797070761912323120">O histórico será usado para personalizar a Pesquisa, anúncios e outros serviços Google.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# hora atrás}one{# horas atrás}other{# horas atrás}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos os direitos reservados.</translation> <translation id="5810864297166300463">Assistência na Web</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 32629fe..9db2f16 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Traduzir…</translation> <translation id="4881695831933465202">Abrir</translation> <translation id="488187801263602086">Mudar o nome do ficheiro</translation> -<translation id="4882831918239250449">Controlar a forma como o histórico de navegação é utilizado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="4885273946141277891">Número não suportado de instâncias do Chrome.</translation> <translation id="4905269543817054577">O histórico não é guardado na Navegação anónima</translation> <translation id="4908869848243824489">Discover da Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Para copiar palavras-passe, defina primeiro um bloqueio de ecrã no dispositivo.</translation> <translation id="5793665092639000975">A utilizar <ph name="SPACE_USED" /> de <ph name="SPACE_AVAILABLE" />.</translation> <translation id="5795872532621730126">Pesquisar e procurar</translation> -<translation id="5797070761912323120">A Google pode utilizar o seu histórico para personalizar a Pesquisa, os anúncios e outros serviços Google.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Há # hora}other{Há # horas}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos os direitos reservados.</translation> <translation id="5810864297166300463">Assistência Web</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 8ce860d..9462c3be 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tradu…</translation> <translation id="4881695831933465202">Deschide</translation> <translation id="488187801263602086">Redenumește fișierul</translation> -<translation id="4882831918239250449">Controlează modul în care istoricul de navigare este folosit pentru a personaliza Căutarea, anunțurile și alte servicii</translation> <translation id="4885273946141277891">Număr de instanțe Chrome neacceptat.</translation> <translation id="4905269543817054577">Istoricul nu este salvat în modul incognito</translation> <translation id="4908869848243824489">Discover de la Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Pentru a copia parolele, mai întâi setează o blocare a ecranului pe dispozitiv</translation> <translation id="5793665092639000975">Se utilizează <ph name="SPACE_USED" /> din <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Caută și răsfoiește</translation> -<translation id="5797070761912323120">Google poate folosi istoricul pentru a personaliza Căutarea, anunțurile și alte servicii Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Acum # oră}few{Acum # ore}other{Acum # de ore}}</translation> <translation id="5810288467834065221">Drept de autor <ph name="YEAR" /> Google LLC. Toate drepturile rezervate.</translation> <translation id="5810864297166300463">Asistență pe web</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 44ca58d..33828173 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Перевести…</translation> <translation id="4881695831933465202">Открыть</translation> <translation id="488187801263602086">Необходимо переименовать файл</translation> -<translation id="4882831918239250449">Использование данных о посещенных страницах для персонализации Поиска, рекламы и т. д.</translation> <translation id="4885273946141277891">Конфликт версий Chrome</translation> <translation id="4905269543817054577">История не сохраняется</translation> <translation id="4908869848243824489">Рекомендации от Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Чтобы копировать пароли, включите на устройстве блокировку экрана.</translation> <translation id="5793665092639000975">Использовано: <ph name="SPACE_USED" /> из <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Просмотр страниц и поиск</translation> -<translation id="5797070761912323120">Google может использовать вашу историю, чтобы персонализировать рекламу, а также Поиск и другие сервисы.</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# час назад}one{# час назад}few{# часа назад}many{# часов назад}other{# часа назад}}</translation> <translation id="5810288467834065221">© Google LLC, <ph name="YEAR" />. Все права защищены.</translation> <translation id="5810864297166300463">Помощь при работе в Интернете</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 5f0d31ed..445cd85f 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">පරිවර්තන කරන්න…</translation> <translation id="4881695831933465202">විවෘත කරන්න</translation> <translation id="488187801263602086">ගොනුව නැවත නම් කරන්න</translation> -<translation id="4882831918239250449">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය සෙවීම, වෙළඳ දැන්වීම් සහ තවත් දේ පෞද්ගලිකකරණය කිරීමට භාවිත කරන ආකාරය පාලනය කිරීම</translation> <translation id="4885273946141277891">සහාය නොදක්වන Chrome අවස්ථා සංඛ්යාව.</translation> <translation id="4905269543817054577">ඉතිහාසය අප්රසිද්ධ ප්රකාරයේදී සුරකිනු නොලැබේ.</translation> <translation id="4908869848243824489">Google වෙතින් Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">මුරපද පිටපත් කිරීමට, ඔබගේ උපාංගයේ තිර අගුලක් සකසන්න</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> න් <ph name="SPACE_USED" /> භාවිතා කරමින්</translation> <translation id="5795872532621730126">සොයන්න සහ බ්රවස් කරන්න</translation> -<translation id="5797070761912323120">සෙවීම, දැන්වීම් සහ අනෙකුත් Google සේවා පුද්ගලායන කිරීමට Google ඔබේ ඉතිහාසය භාවිත කළ හැක</translation> <translation id="5809361687334836369">{HOURS,plural, =1{පැය #කට පෙර}one{පැය #කට පෙර}other{පැය #කට පෙර}}</translation> <translation id="5810288467834065221">ප්රකාශන හිමිකම <ph name="YEAR" /> Google LLC. සියලුම හිමිකම් ඇවිරිණි.</translation> <translation id="5810864297166300463">වෙබ් සහාය</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 6ea4ee4..f26386d3 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Preložiť…</translation> <translation id="4881695831933465202">Otvoriť</translation> <translation id="488187801263602086">Premenovanie súboru</translation> -<translation id="4882831918239250449">Ovládajte, ako sa pomocou histórie prehliadania prispôsobuje Vyhľadávanie, reklamy a ďalší obsah</translation> <translation id="4885273946141277891">Nepodporovaný počet inštancií prehliadača Chrome.</translation> <translation id="4905269543817054577">V režime inkognito sa história neukladá</translation> <translation id="4908869848243824489">Kanál Objaviť od Googlu</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Ak chcete kopírovať heslá, najprv v zariadení nastavte zámku obrazovky</translation> <translation id="5793665092639000975">Využité: <ph name="SPACE_USED" /> z <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Vyhľadávanie a prehliadanie</translation> -<translation id="5797070761912323120">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie, reklamy a ďalšie služby Googlu</translation> <translation id="5809361687334836369">{HOURS,plural, =1{pred # hodinou}few{pred # hodinami}many{pred # hodinou}other{pred # hodinami}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Všetky práva vyhradené.</translation> <translation id="5810864297166300463">Internetová pomoc</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 2e44c4b..4addd62 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Prevedi …</translation> <translation id="4881695831933465202">Odpri</translation> <translation id="488187801263602086">Preimenovanje datoteke</translation> -<translation id="4882831918239250449">Nadziranje, kako se zgodovina brskanja uporabi za prilagajanje Iskanja Google, oglasov in drugega</translation> <translation id="4885273946141277891">To število primerkov Chroma ni podprto.</translation> <translation id="4905269543817054577">Zgodovina se v anonimnem načinu ne shranjuje</translation> <translation id="4908869848243824489">Googlovo Odkrivanje</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Če želite kopirati gesla, najprej v napravi nastavite zaklepanje zaslona.</translation> <translation id="5793665092639000975">Uporaba <ph name="SPACE_USED" /> od <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Iskanje in brskanje</translation> -<translation id="5797070761912323120">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Pred # uro}one{Pred # uro}two{Pred # urama}few{Pred # urami}other{Pred # urami}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Vse pravice pridržane.</translation> <translation id="5810864297166300463">Spletna pomoč</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 df81b9b..53fe1903 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Përkthe…</translation> <translation id="4881695831933465202">Hap</translation> <translation id="488187801263602086">Riemërto skedarin</translation> -<translation id="4882831918239250449">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin", reklamat dhe shumë të tjera</translation> <translation id="4885273946141277891">Numër i pambështetur i versioneve të Chrome.</translation> <translation id="4905269543817054577">Historiku nuk ruhet në "I fshehtë"</translation> <translation id="4908869848243824489">"Zbulo" nga Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Për të kopjuar fjalëkalimet, në fillim cakto një kyçje ekrani në pajisjen tënde</translation> <translation id="5793665092639000975">Po përdoret <ph name="SPACE_USED" /> nga <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Kërko dhe shfleto</translation> -<translation id="5797070761912323120">Google mund ta përdorë historikun tënd për të personalizuar "Kërko me Google", reklamat dhe shërbime të tjera të Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# orë më parë}other{# orë më parë}}</translation> <translation id="5810288467834065221">Të drejtat e autorit <ph name="YEAR" /> Google LLC. Të gjitha të drejtat e rezervuara.</translation> <translation id="5810864297166300463">Asistenca në ueb</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 10f85ac..bd8c9d9 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Prevedi…</translation> <translation id="4881695831933465202">Otvori</translation> <translation id="488187801263602086">Preimenujte datoteku</translation> -<translation id="4882831918239250449">Kontrolišite način na koji se istorija pregledanja koristi za personalizaciju Pretrage, oglasa i drugih usluga</translation> <translation id="4885273946141277891">Nepodržan broj Chrome instanci.</translation> <translation id="4905269543817054577">Istorija se ne čuva u režimu bez arhiviranja</translation> <translation id="4908869848243824489">Google Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Da biste kopirali lozinke, prvo podesite zaključavanje ekrana na uređaju</translation> <translation id="5793665092639000975">Koristi se <ph name="SPACE_USED" /> od <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Pretražite i pregledajte</translation> -<translation id="5797070761912323120">Google može da koristi istoriju za personalizaciju Pretrage, oglasa i drugih Google usluga</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Pre # sata}one{Pre # sata}few{Pre # sata}other{Pre # sati}}</translation> <translation id="5810288467834065221">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava zadržana.</translation> <translation id="5810864297166300463">Pomoć na vebu</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 a3d6917..72925446 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Преведи…</translation> <translation id="4881695831933465202">Отвори</translation> <translation id="488187801263602086">Преименујте датотеку</translation> -<translation id="4882831918239250449">Контролишите начин на који се историја прегледања користи за персонализацију Претраге, огласа и других услуга</translation> <translation id="4885273946141277891">Неподржан број Chrome инстанци.</translation> <translation id="4905269543817054577">Историја се не чува у режиму без архивирања</translation> <translation id="4908869848243824489">Google Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Да бисте копирали лозинке, прво подесите закључавање екрана на уређају</translation> <translation id="5793665092639000975">Користи се <ph name="SPACE_USED" /> од <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Претражите и прегледајте</translation> -<translation id="5797070761912323120">Google може да користи историју за персонализацију Претраге, огласа и других Google услуга</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Пре # сата}one{Пре # сата}few{Пре # сата}other{Пре # сати}}</translation> <translation id="5810288467834065221">Ауторска права <ph name="YEAR" />. Google LLC. Сва права задржана.</translation> <translation id="5810864297166300463">Помоћ на вебу</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 44db1de..c0eed864 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Översätt …</translation> <translation id="4881695831933465202">Öppna</translation> <translation id="488187801263602086">Byt namn på fil</translation> -<translation id="4882831918239250449">Styr hur Sök, annonser och annat ska anpassas utifrån webbhistoriken</translation> <translation id="4885273946141277891">Fler Chrome-förekomster än det finns stöd för.</translation> <translation id="4905269543817054577">Historik sparas inte i inkognitoläge.</translation> <translation id="4908869848243824489">Förslag från Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Om du vill kunna kopiera lösenorden måste du först ställa in ett skärmlås på enheten</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> av <ph name="SPACE_AVAILABLE" /> används</translation> <translation id="5795872532621730126">Sök och utforska</translation> -<translation id="5797070761912323120">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån historiken</translation> <translation id="5809361687334836369">{HOURS,plural, =1{för # timme sedan}other{för # timmar sedan}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Med ensamrätt.</translation> <translation id="5810864297166300463">Webbhjälp</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 2424da2..da514f3 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tafsiri…</translation> <translation id="4881695831933465202">Fungua</translation> <translation id="488187801263602086">Badilisha jina la faili</translation> -<translation id="4882831918239250449">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo ya Kutafuta matangazo na zaidi</translation> <translation id="4885273946141277891">Idadi ya matukio ya Chrome isiyoweza kutumika.</translation> <translation id="4905269543817054577">Historia haihifadhiwi katika hali fiche</translation> <translation id="4908869848243824489">Dokezo kutoka Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Ili unakili manenosiri, weka kwanza mipangilio ya kufunga skrini kwenye kifaa chako</translation> <translation id="5793665092639000975">Inatumia <ph name="SPACE_USED" /> kati ya <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Tafuta na uvinjari</translation> -<translation id="5797070761912323120">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{Saa # iliyopita}other{Saa # zilizopita}}</translation> <translation id="5810288467834065221">Hakimiliki <ph name="YEAR" /> Google LLC. Haki zote zimehifadhiwa.</translation> <translation id="5810864297166300463">Usaidizi wa Wavuti</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 ef32722..608521f 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">மொழிபெயர்…</translation> <translation id="4881695831933465202">திற</translation> <translation id="488187801263602086">கோப்பின் பெயரை மாற்றவும்</translation> -<translation id="4882831918239250449">தேடல், விளம்பரங்கள் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்துதல்</translation> <translation id="4885273946141277891">ஆதரிக்கப்படாத Chrome நிகழ்வுகளின் எண்ணிக்கை.</translation> <translation id="4905269543817054577">மறைநிலைப் பயன்முறையில் தேடல் விவரங்கள் சேமிக்கப்படாது</translation> <translation id="4908869848243824489">Discover by Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">கடவுச்சொற்களை நகலெடுக்க, முதலில் உங்கள் சாதனத்தில் திரைப் பூட்டை அமைக்கவும்</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> இல் <ph name="SPACE_USED" /> பயன்படுத்தப்படுகிறது</translation> <translation id="5795872532621730126">தேடல் & உலாவல்</translation> -<translation id="5797070761912323120">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# மணிநேரம் முன்பு}other{# மணிநேரம் முன்பு}}</translation> <translation id="5810288467834065221">பதிப்புரிமை <ph name="YEAR" /> Google LLC. அனைத்து உரிமைகளும் பாதுகாக்கப்பட்டுள்ளன.</translation> <translation id="5810864297166300463">இணைய உதவி</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 038f3e92..d4bd0ed 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">అనువదించు…</translation> <translation id="4881695831933465202">తెరువు</translation> <translation id="488187801263602086">ఫైల్ పేరు మార్చండి</translation> -<translation id="4882831918239250449">Search, యాడ్స్లతో పాటు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ హిస్టరీ ఎలా ఉపయోగించబడుతుందో నియంత్రించండి</translation> <translation id="4885273946141277891">మద్దతు లేనన్ని సార్లు Chromeను ప్రారంభించడానికి ప్రయత్నించారు.</translation> <translation id="4905269543817054577">అజ్ఞాత మోడ్లో హిస్టరీ సేవ్ అవ్వదు</translation> <translation id="4908869848243824489">Google ద్వారా Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">పాస్వర్డ్లను కాపీ చేయడానికి, ముందుగా మీ పరికరంలో స్క్రీన్ లాక్ను సెట్ చేయండి</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" />లో <ph name="SPACE_USED" /> ఉపయోగించబడింది</translation> <translation id="5795872532621730126">శోధన, బ్రౌజ్</translation> -<translation id="5797070761912323120">శోధన, ప్రకటనలు, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# గంట క్రితం}other{# గంటల క్రితం}}</translation> <translation id="5810288467834065221">కాపీరైట్ <ph name="YEAR" /> Google LLC. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation> <translation id="5810864297166300463">వెబ్ సహాయం</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 6e6bb9a8..c4740c00 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">แปลภาษา…</translation> <translation id="4881695831933465202">เปิด</translation> <translation id="488187801263602086">เปลี่ยนชื่อไฟล์</translation> -<translation id="4882831918239250449">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="4885273946141277891">อินสแตนซ์ของ Chrome เกินจำนวนที่สนับสนุน</translation> <translation id="4905269543817054577">ระบบจะไม่บันทึกประวัติการเข้าชมในโหมดไม่ระบุตัวตน</translation> <translation id="4908869848243824489">Discover โดย Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">หากต้องการคัดลอกรหัสผ่าน ให้ตั้งค่าการล็อกหน้าจอในอุปกรณ์ก่อน</translation> <translation id="5793665092639000975">ใช้ไป <ph name="SPACE_USED" /> จาก <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">ค้นหาและเรียกดู</translation> -<translation id="5797070761912323120">Google อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ของ Google ให้เข้ากับคุณ</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ชั่วโมงที่ผ่านมา}other{# ชั่วโมงที่ผ่านมา}}</translation> <translation id="5810288467834065221">ลิขสิทธิ์ <ph name="YEAR" /> Google LLC สงวนลิขสิทธิ์</translation> <translation id="5810864297166300463">ความช่วยเหลือบนเว็บ</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 4be9d6d..b8ffdd1 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Çevir...</translation> <translation id="4881695831933465202">Aç</translation> <translation id="488187801263602086">Dosyayı yeniden adlandırın</translation> -<translation id="4882831918239250449">Göz atma geçmişinizin Arama, reklamlar ve diğer hizmetleri kişiselleştirmek için nasıl kullanıldığını kontrol edin</translation> <translation id="4885273946141277891">Desteklenmeyen sayıda Chrome örneği var.</translation> <translation id="4905269543817054577">Geçmiş Gizli modda kaydedilmez</translation> <translation id="4908869848243824489">Google'dan Keşfet</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Şifreleri kopyalamak için önce cihazınızda ekran kilidi ayarlayın</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> / <ph name="SPACE_AVAILABLE" /> kullanılıyor</translation> <translation id="5795872532621730126">Arama ve göz atma</translation> -<translation id="5797070761912323120">Google; Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# saat önce}other{# saat önce}}</translation> <translation id="5810288467834065221">Telif hakkı <ph name="YEAR" /> Google LLC. Tüm hakları saklıdır.</translation> <translation id="5810864297166300463">Web Yardımı</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 3b6efee..d097562e 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Перекласти…</translation> <translation id="4881695831933465202">Відкрити</translation> <translation id="488187801263602086">Перейменувати файл</translation> -<translation id="4882831918239250449">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку, оголошень тощо</translation> <translation id="4885273946141277891">Забагато копій Chrome.</translation> <translation id="4905269543817054577">Історія в анонімному режимі не зберігається</translation> <translation id="4908869848243824489">Рекомендації від Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Щоб скопіювати паролі, спершу налаштуйте блокування екрана на пристрої</translation> <translation id="5793665092639000975">Використано <ph name="SPACE_USED" /> з <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Пошук і перегляд</translation> -<translation id="5797070761912323120">Google може використовувати вашу історію, щоб персоналізувати Пошук, оголошення й інші сервіси Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# годину тому}one{# годину тому}few{# години тому}many{# годин тому}other{# години тому}}</translation> <translation id="5810288467834065221">© Google LLC <ph name="YEAR" />. Усі права захищено.</translation> <translation id="5810864297166300463">Допомога в Інтернеті</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 46e2163..fd8a0b1 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">ترجمہ کریں…</translation> <translation id="4881695831933465202">کھولیں</translation> <translation id="488187801263602086">فائل کا نام تبدیل کریں</translation> -<translation id="4882831918239250449">تلاش، اشتہارات وغیرہ کو ذاتی نوعیت کا بنانے کیلئے آپ کی براؤزنگ کی سرگزشت جس طریقے سے استعمال کی جاتی ہے اس کو کنٹرول کریں</translation> <translation id="4885273946141277891">Chrome وقوعات کی غیر تعاون یافتہ تعداد۔</translation> <translation id="4905269543817054577">سرگزشت پوشیدگی میں محفوظ نہیں ہوتی ہے</translation> <translation id="4908869848243824489">Discover منجانب Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">پاس ورڈز کاپی کرنے کیلئے پہلے اپنے آلے پر اسکرین لاک سیٹ کریں</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> میں سے <ph name="SPACE_USED" /> استعمال کرنا</translation> <translation id="5795872532621730126">تلاش اور براؤز کریں</translation> -<translation id="5797070761912323120">تلاش، اشتہارات اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کے لیے Google آپ کی سرگزشت کا استعمال کر سکتا ہے</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# گھنٹہ پہلے}other{# گھنٹے پہلے}}</translation> <translation id="5810288467834065221">کاپی رائٹ<ph name="YEAR" /> Google LLC۔ جملہ حقوق محفوظ ہیں۔</translation> <translation id="5810864297166300463">ویب مدد</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 ee24596..bc870737 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Tarjima qilish…</translation> <translation id="4881695831933465202">Ochish</translation> <translation id="488187801263602086">Faylni qayta nomlash</translation> -<translation id="4882831918239250449">Moslashtirilgan qidiruv, reklama va boshqa tashriflar tarixi parametrlarini tanlang</translation> <translation id="4885273946141277891">Bir nechta Chrome versiyalari birdaniga ishlamaydi.</translation> <translation id="4905269543817054577">Inkognito rejimda tarix saqlanmaydi</translation> <translation id="4908869848243824489">Google Discover</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Parollardan nusxa olish uchun qurilmangizda avval ekran qulfini sozlang</translation> <translation id="5793665092639000975"><ph name="SPACE_USED" /> band, jami: <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Qidiruv va saytlarni kezish</translation> -<translation id="5797070761912323120">Qidiruv, rekama va boshqa xizmatlarni sizga moslashtirish uchun Google tarix maʼlumotlaringizdan foydalanishi mumkin</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# soat oldin}other{# soat oldin}}</translation> <translation id="5810288467834065221">© Google LLC, <ph name="YEAR" /> Barcha huquqlar himoyalangan.</translation> <translation id="5810864297166300463">Internetda yordam</translation> @@ -792,7 +790,7 @@ <translation id="6111020039983847643">sarflangan trafik</translation> <translation id="6112702117600201073">Sahifa yangilanmoqda</translation> <translation id="6122831415929794347">Saytlarni xavfsiz kezish faolsizlantirilsinmi?</translation> -<translation id="6127379762771434464">Havola o‘chirildi</translation> +<translation id="6127379762771434464">Havola olib tashlandi</translation> <translation id="6137022273846704445"><ph name="APP_NAME" /> ilovasidagi til</translation> <translation id="6138832295072039549">Sayt sozlamalarini shu yerda oʻzgartiring</translation> <translation id="6140709049082532940">Kuchaytirilgan himoya:</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 cdae6d0..86a1450 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Dịch…</translation> <translation id="4881695831933465202">Mở</translation> <translation id="488187801263602086">Đổi tên tệp</translation> -<translation id="4882831918239250449">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm, quảng cáo và các dịch vụ khác</translation> <translation id="4885273946141277891">Số phiên bản Chrome không được hỗ trợ.</translation> <translation id="4905269543817054577">Nhật ký duyệt web không được lưu khi ở chế độ Ẩn danh</translation> <translation id="4908869848243824489">Tính năng Khám phá của Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Để sao chép mật khẩu, trước tiên, hãy thiết lập một phương thức khóa màn hình trên thiết bị của bạn</translation> <translation id="5793665092639000975">Đang dùng: <ph name="SPACE_USED" />/<ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Tìm kiếm và duyệt xem</translation> -<translation id="5797070761912323120">Google có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm, quảng cáo và các dịch vụ khác của Google cho phù hợp với bạn</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# giờ trước}other{# giờ trước}}</translation> <translation id="5810288467834065221">Bản quyền <ph name="YEAR" /> Google LLC. Mọi quyền được bảo lưu.</translation> <translation id="5810864297166300463">Hỗ trợ trên web</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 15dfc722..1dade59 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">翻译…</translation> <translation id="4881695831933465202">打开</translation> <translation id="488187801263602086">重命名文件</translation> -<translation id="4882831918239250449">控制 Google 如何利用您的浏览记录为您提供个性化的搜索、广告和其他服务</translation> <translation id="4885273946141277891">Chrome 实例数量已超出上限。</translation> <translation id="4905269543817054577">在无痕模式下,系统不会保存历史记录</translation> <translation id="4908869848243824489">Google 探索</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">若要复制密码,请先在设备上设置屏幕锁定</translation> <translation id="5793665092639000975">已使用 <ph name="SPACE_USED" />,共 <ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">搜索和浏览</translation> -<translation id="5797070761912323120">Google 可能会利用您的历史记录为您提供个性化的 Google 搜索、广告和其他 Google 服务</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# 小时前}other{# 小时前}}</translation> <translation id="5810288467834065221">版权所有 <ph name="YEAR" /> Google LLC. 保留所有权利。</translation> <translation id="5810864297166300463">网上协助</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 68bba2b..9e28195 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">翻譯…</translation> <translation id="4881695831933465202">開啟</translation> <translation id="488187801263602086">重新命名檔案</translation> -<translation id="4882831918239250449">控制系統如何使用您的瀏覽記錄為您提供個人化的搜尋內容、廣告和其他服務</translation> <translation id="4885273946141277891">Chrome 實例的數量已超出上限。</translation> <translation id="4905269543817054577">在無痕模式下無法儲存記錄</translation> <translation id="4908869848243824489">Google 探索</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">如要複製密碼,請先在裝置上設定螢幕鎖定</translation> <translation id="5793665092639000975">已使用 <ph name="SPACE_USED" /> (共 <ph name="SPACE_AVAILABLE" />)</translation> <translation id="5795872532621730126">搜尋和瀏覽</translation> -<translation id="5797070761912323120">Google 可能會使用您的記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# 小時前}other{# 小時前}}</translation> <translation id="5810288467834065221">版權所有 <ph name="YEAR" /> Google LLC。保留所有權利。</translation> <translation id="5810864297166300463">網絡協助</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 2da8bac0..4877d0c 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">翻譯...</translation> <translation id="4881695831933465202">開啟</translation> <translation id="488187801263602086">重新命名檔案</translation> -<translation id="4882831918239250449">控制 Google 使用瀏覽記錄提供個人化搜尋服務、廣告和其他內容的方式</translation> <translation id="4885273946141277891">Chrome 實例的數量已超出上限。</translation> <translation id="4905269543817054577">在無痕模式下無法儲存歷史記錄</translation> <translation id="4908869848243824489">Google 探索</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">如要複製密碼,請先在裝置上設定螢幕鎖定功能</translation> <translation id="5793665092639000975">使用量:<ph name="SPACE_USED" /> (共 <ph name="SPACE_AVAILABLE" />)</translation> <translation id="5795872532621730126">搜尋和瀏覽</translation> -<translation id="5797070761912323120">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# 小時前}other{# 小時前}}</translation> <translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. 保留所有權利。</translation> <translation id="5810864297166300463">網路協助</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 20bd75d2..7ab5f6f 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
@@ -590,7 +590,6 @@ <translation id="4880127995492972015">Humusha…</translation> <translation id="4881695831933465202">Vula</translation> <translation id="488187801263602086">Qamba kabusha ifayela</translation> -<translation id="4882831918239250449">Lawula ukuthi umlando wakho wokuphequlula usetshenziswa kanjani ukuze kwenziwe kube ngokwakho usesho, izikhangiso, nokuningi</translation> <translation id="4885273946141277891">Inombolo yezikhathi ezingasekelwe ye-Chrome.</translation> <translation id="4905269543817054577">Umlando awulondolozwanga ku-Incognito</translation> <translation id="4908869848243824489">I-Discover nge-Google</translation> @@ -731,7 +730,6 @@ <translation id="5780792035410621042">Ukuze ukopishe amaphasiwedi, qala ngokusetha ukukhiya isikrini kudivayisi yakho</translation> <translation id="5793665092639000975">Kusetshenziswa okungu-<ph name="SPACE_USED" /> kokungu-<ph name="SPACE_AVAILABLE" /></translation> <translation id="5795872532621730126">Sesha futhi phequlula</translation> -<translation id="5797070761912323120">I-Google ingasebenzisa umlando wakho ukuze yenze kube ngokwakho usesho, izikhangiso, namanye amasevisi e-Google</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ihora eledlule}one{# amahora adlule}other{# amahora adlule}}</translation> <translation id="5810288467834065221">© <ph name="YEAR" /> Google LLC. Wonke amalungelo agodliwe.</translation> <translation id="5810864297166300463">Umsizi Wewebhu</translation>
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn index dee5afb4..c1693ed 100644 --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -71,6 +71,7 @@ "//chrome/browser/android/lifecycle:java", "//chrome/browser/browser_controls/android:java", "//chrome/browser/device:java", + "//chrome/browser/feature_engagement:java", "//chrome/browser/flags:java", "//chrome/browser/fullscreen/android:java", "//chrome/browser/preferences:java", @@ -160,6 +161,7 @@ "java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java", "java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonControllerTest.java", "java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java", + "java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java", "java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java", "java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java", "java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java", @@ -172,8 +174,11 @@ "//base:base_junit_test_support", "//chrome/browser/android/lifecycle:java", "//chrome/browser/browser_controls/android:java", + "//chrome/browser/feature_engagement:java", "//chrome/browser/flags:java", + "//chrome/browser/profiles/android:java", "//chrome/browser/tab:java", + "//chrome/browser/tabmodel:java", "//chrome/browser/ui/android/layouts:java", "//chrome/browser/ui/android/theme:java", "//chrome/browser/user_education:java", @@ -207,6 +212,7 @@ ":java_resources", "//base:base_java", "//base:base_java_test_support", + "//chrome/browser/flags:java", "//chrome/browser/preferences:java", "//chrome/browser/settings:test_support_java", "//chrome/browser/tab:java",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonController.java index 56b26da..18cda37 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonController.java
@@ -25,7 +25,9 @@ import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightParams; import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightShape; import org.chromium.components.embedder_support.util.UrlUtilities; +import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver; import org.chromium.ui.modelutil.PropertyModel; @@ -47,6 +49,7 @@ private static final String IPH_PROMO_PARAM = "generic_message"; private final Supplier<Tab> mActiveTabSupplier; + private final Supplier<Tracker> mTrackerSupplier; private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private final ModalDialogManager mModalDialogManager; @@ -78,17 +81,20 @@ /** * Creates a VoiceToolbarButtonController object. * @param context The Context for retrieving resources, etc. + * @param buttonDrawable Drawable for the voice button. * @param activeTabSupplier Provides the currently displayed {@link Tab}. + * @param trackerSupplier Supplier for the current profile tracker. * @param activityLifecycleDispatcher Dispatcher for activity lifecycle events, e.g. * configuration changes. * @param modalDialogManager Dispatcher for modal lifecycle events * @param voiceSearchDelegate Provides interaction with voice search. */ public VoiceToolbarButtonController(Context context, Drawable buttonDrawable, - Supplier<Tab> activeTabSupplier, + Supplier<Tab> activeTabSupplier, Supplier<Tracker> trackerSupplier, ActivityLifecycleDispatcher activityLifecycleDispatcher, ModalDialogManager modalDialogManager, VoiceSearchDelegate voiceSearchDelegate) { mActiveTabSupplier = activeTabSupplier; + mTrackerSupplier = trackerSupplier; // Register for onConfigurationChanged events, which notify on changes to screen width. mActivityLifecycleDispatcher = activityLifecycleDispatcher; @@ -115,6 +121,11 @@ OnClickListener onClickListener = (view) -> { RecordUserAction.record("MobileTopToolbarVoiceButton"); mVoiceSearchDelegate.startVoiceRecognition(); + + if (mTrackerSupplier.hasValue()) { + mTrackerSupplier.get().notifyEvent( + EventConstants.ADAPTIVE_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_OPENED); + } }; mButtonData = new ButtonDataImpl(/*canShow=*/false, buttonDrawable, onClickListener, @@ -172,32 +183,26 @@ */ private void maybeSetIphCommandBuilder(Tab tab) { if (mButtonData.getButtonSpec().getIPHCommandBuilder() != null || tab == null - || !FeatureList.isInitialized() - || !ChromeFeatureList.isEnabled(ChromeFeatureList.VOICE_BUTTON_IN_TOP_TOOLBAR) - || !ChromeFeatureList.isEnabled(ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID)) { + || !FeatureList.isInitialized()) { return; } - boolean useGenericMessage = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( - ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID, IPH_PROMO_PARAM, true); - @StringRes - int text = useGenericMessage ? R.string.iph_mic_toolbar_generic_message_text - : R.string.iph_mic_toolbar_example_query_text; - @StringRes - int accessibilityText = - useGenericMessage ? R.string.iph_mic_toolbar_generic_message_accessibility_text - : R.string.iph_mic_toolbar_example_query_accessibility_text; - - HighlightParams params = new HighlightParams(HighlightShape.CIRCLE); - params.setBoundsRespectPadding(true); - IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(tab.getContext().getResources(), - FeatureConstants.IPH_MIC_TOOLBAR_FEATURE, text, accessibilityText) - .setHighlightParams(params); + IPHCommandBuilder iphCommandBuilder = null; + if (ChromeFeatureList.isEnabled(ChromeFeatureList.VOICE_BUTTON_IN_TOP_TOOLBAR) + && ChromeFeatureList.isEnabled(ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID)) { + iphCommandBuilder = createVoiceButtonIPHCommandBuilder(tab); + } else if (AdaptiveToolbarFeatures.isCustomizationEnabled()) { + iphCommandBuilder = createCustomizationIPHCommandBuilder(tab); + } else { + // No IPH features enabled. + return; + } ButtonData.ButtonSpec currentSpec = mButtonData.getButtonSpec(); ButtonData.ButtonSpec newSpec = new ButtonData.ButtonSpec(currentSpec.getDrawable(), currentSpec.getOnClickListener(), currentSpec.getContentDescriptionResId(), - currentSpec.getSupportsTinting(), iphCommandBuilder); + currentSpec.getSupportsTinting(), iphCommandBuilder, + currentSpec.getButtonVariant()); mButtonData.setButtonSpec(newSpec); } @@ -236,4 +241,36 @@ observer.buttonDataChanged(hint); } } + + private IPHCommandBuilder createVoiceButtonIPHCommandBuilder(Tab tab) { + boolean useGenericMessage = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( + ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID, IPH_PROMO_PARAM, true); + @StringRes + int text = useGenericMessage ? R.string.iph_mic_toolbar_generic_message_text + : R.string.iph_mic_toolbar_example_query_text; + @StringRes + int accessibilityText = + useGenericMessage ? R.string.iph_mic_toolbar_generic_message_accessibility_text + : R.string.iph_mic_toolbar_example_query_accessibility_text; + + HighlightParams params = new HighlightParams(HighlightShape.CIRCLE); + params.setBoundsRespectPadding(true); + IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(tab.getContext().getResources(), + FeatureConstants.IPH_MIC_TOOLBAR_FEATURE, text, accessibilityText) + .setHighlightParams(params); + + return iphCommandBuilder; + } + + private IPHCommandBuilder createCustomizationIPHCommandBuilder(Tab tab) { + HighlightParams params = new HighlightParams(HighlightShape.CIRCLE); + params.setBoundsRespectPadding(true); + IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(tab.getContext().getResources(), + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_FEATURE, + /* stringId = */ R.string.adaptive_toolbar_button_voice_search_iph, + /* accessibilityStringId = */ R.string.adaptive_toolbar_button_voice_search_iph) + .setHighlightParams(params); + + return iphCommandBuilder; + } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java index 3094b84..161a1269 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java
@@ -10,11 +10,14 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.view.View; import org.junit.Before; import org.junit.Rule; @@ -22,9 +25,11 @@ import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; @@ -34,6 +39,9 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.url.GURL; @@ -63,6 +71,8 @@ private VoiceToolbarButtonController.VoiceSearchDelegate mVoiceSearchDelegate; @Mock private Drawable mDrawable; + @Mock + private Tracker mTracker; private Configuration mConfiguration = new Configuration(); private VoiceToolbarButtonController mVoiceToolbarButtonController; @@ -87,15 +97,19 @@ AdaptiveToolbarFeatures.clearParsedParamsForTesting(); // clang-format off mVoiceToolbarButtonController = new VoiceToolbarButtonController(mContext, mDrawable, - () -> mTab, mActivityLifecycleDispatcher, mModalDialogManager, + () -> mTab, () -> mTracker, mActivityLifecycleDispatcher, mModalDialogManager, mVoiceSearchDelegate); // clang-format on + + TrackerFactory.setTrackerForTests(mTracker); } @EnableFeatures({ChromeFeatureList.VOICE_BUTTON_IN_TOP_TOOLBAR}) - @DisableFeatures({ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID}) + @DisableFeatures({ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID, + ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) @Test - public void onConfigurationChanged_screenWidthChanged() { + public void + onConfigurationChanged_screenWidthChanged() { CachedFeatureFlags.setForTesting(ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR, false); AdaptiveToolbarFeatures.MODE_PARAM.setForTesting(AdaptiveToolbarFeatures.ALWAYS_NONE); @@ -138,6 +152,24 @@ } @Test + @EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) + @DisableFeatures({ChromeFeatureList.VOICE_BUTTON_IN_TOP_TOOLBAR, + ChromeFeatureList.TOOLBAR_MIC_IPH_ANDROID}) + public void + testIPHEvent() { + CachedFeatureFlags.setForTesting(ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR, false); + AdaptiveToolbarFeatures.MODE_PARAM.setForTesting(AdaptiveToolbarFeatures.ALWAYS_NONE); + doReturn(true).when(mTracker).shouldTriggerHelpUI( + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_FEATURE); + + View view = Mockito.mock(View.class); + mVoiceToolbarButtonController.get(mTab).getButtonSpec().getOnClickListener().onClick(view); + + verify(mTracker, times(1)) + .notifyEvent(EventConstants.ADAPTIVE_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_OPENED); + } + + @Test public void isToolbarMicEnabled_adaptiveButtons_nonVoice() { CachedFeatureFlags.setForTesting(ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR, true); AdaptiveToolbarFeatures.MODE_PARAM.setForTesting(AdaptiveToolbarFeatures.ALWAYS_SHARE);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java index 7ae2af5..7d43b10 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarFeatures.java
@@ -91,7 +91,7 @@ /** * @return The main feature flag for segmentation based adaptive toolbar customization. */ - static boolean isCustomizationEnabled() { + public static boolean isCustomizationEnabled() { return ChromeFeatureList.isEnabled( ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION); }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor.java index a656051..e1f87b6 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictor.java
@@ -62,6 +62,13 @@ * use cached result, but seems unnecessary. */ public void recomputeUiState(Callback<UiState> callback) { + // Early return if the feature isn't enabled. + if (!AdaptiveToolbarFeatures.isCustomizationEnabled()) { + callback.onResult(new UiState(false, AdaptiveToolbarButtonVariant.UNKNOWN, + AdaptiveToolbarButtonVariant.UNKNOWN, AdaptiveToolbarButtonVariant.UNKNOWN)); + return; + } + int manualOverride = readManualOverrideFromPrefs(); int finchDefault = AdaptiveToolbarFeatures.getSegmentationDefault(); boolean toolbarToggle = readToolbarToggleStateFromPrefs();
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java index 0710147..93faabd 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarStatePredictorTest.java
@@ -23,6 +23,7 @@ import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures.AdaptiveToolbarButtonVariant; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarStatePredictor.UiState; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; /** Unit tests for the {@code AdaptiveToolbarStatePredictor} */ @@ -45,6 +46,20 @@ @Test @SmallTest + @DisableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) + public void testDisableFeature() { + AdaptiveToolbarFeatures.setDefaultSegmentForTesting(AdaptiveToolbarFeatures.SHARE); + AdaptiveToolbarFeatures.setIgnoreSegmentationResultsForTesting(false); + + AdaptiveToolbarStatePredictor statePredictor = buildStatePredictor( + true, AdaptiveToolbarButtonVariant.VOICE, true, AdaptiveToolbarButtonVariant.SHARE); + UiState expected = new UiState(false, AdaptiveToolbarButtonVariant.UNKNOWN, + AdaptiveToolbarButtonVariant.UNKNOWN, AdaptiveToolbarButtonVariant.UNKNOWN); + statePredictor.recomputeUiState(verifyResultCallback(expected)); + } + + @Test + @SmallTest public void testManualOverride() { AdaptiveToolbarFeatures.setDefaultSegmentForTesting(AdaptiveToolbarFeatures.SHARE); AdaptiveToolbarFeatures.setIgnoreSegmentationResultsForTesting(false);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController.java index bb058f26..0981fc9 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonController.java
@@ -6,12 +6,13 @@ import android.content.Context; import android.content.res.Configuration; +import android.graphics.drawable.Drawable; import android.view.View; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import androidx.appcompat.content.res.AppCompatResources; +import org.chromium.base.FeatureList; import org.chromium.base.ObserverList; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; @@ -25,7 +26,13 @@ import org.chromium.chrome.browser.toolbar.ButtonDataProvider; import org.chromium.chrome.browser.toolbar.R; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures.AdaptiveToolbarButtonVariant; +import org.chromium.chrome.browser.user_education.IPHCommandBuilder; +import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightParams; +import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightShape; import org.chromium.components.embedder_support.util.UrlUtilities; +import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.ui.base.DeviceFormFactor; /** @@ -84,6 +91,7 @@ private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private final ButtonDataImpl mButtonData; private final ObserverList<ButtonDataObserver> mObservers = new ObserverList<>(); + private final Supplier<Tracker> mTrackerSupplier; private boolean mIsTablet; private int mScreenWidthDp; @@ -92,19 +100,23 @@ * Creates {@code OptionalNewTabButtonController}. * * @param context The Context for retrieving resources, etc. + * @param buttonDrawable Drawable for the new tab button. * @param activityLifecycleDispatcher Dispatcher for activity lifecycle events, e.g. * configuration changes. * @param tabCreatorManagerSupplier Used to open new tabs. * @param tabModelSelectorSupplier Used to access the current incognito state. + * @param trackerSupplier Supplier for the current profile tracker. */ - public OptionalNewTabButtonController(Context context, + public OptionalNewTabButtonController(Context context, Drawable buttonDrawable, ActivityLifecycleDispatcher activityLifecycleDispatcher, Supplier<TabCreatorManager> tabCreatorManagerSupplier, - Supplier<TabModelSelector> tabModelSelectorSupplier) { + Supplier<TabModelSelector> tabModelSelectorSupplier, + Supplier<Tracker> trackerSupplier) { mContext = context; mActivityLifecycleDispatcher = activityLifecycleDispatcher; mActivityLifecycleDispatcher.register(this); mDelegate = new Delegate(tabCreatorManagerSupplier, tabModelSelectorSupplier); + mTrackerSupplier = trackerSupplier; View.OnClickListener onClickListener = view -> { TabModelSelector tabModelSelector = mDelegate.getTabModelSelector(); @@ -116,11 +128,16 @@ boolean isIncognito = tabModelSelector.isIncognitoSelected(); RecordUserAction.record("MobileTopToolbarOptionalButtonNewTab"); tabCreatorManager.getTabCreator(isIncognito).launchNTP(); + + if (mTrackerSupplier.hasValue()) { + mTrackerSupplier.get().notifyEvent( + EventConstants.ADAPTIVE_TOOLBAR_CUSTOMIZATION_NEW_TAB_OPENED); + } }; - mButtonData = new ButtonDataImpl(/*canShow=*/false, - AppCompatResources.getDrawable(mContext, R.drawable.new_tab_icon), onClickListener, - R.string.button_new_tab, /*supportsTinting=*/true, /*iphCommandBuilder=*/null, + mButtonData = new ButtonDataImpl(/*canShow=*/false, buttonDrawable, onClickListener, + R.string.button_new_tab, /*supportsTinting=*/true, + /*iphCommandBuilder=*/null, /*isEnabled=*/true, AdaptiveToolbarButtonVariant.NEW_TAB); mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext); @@ -158,6 +175,7 @@ @Override public ButtonData get(Tab tab) { updateCanShow(tab); + maybeSetIphCommandBuilder(tab); return mButtonData; } @@ -204,4 +222,33 @@ return true; } + + /** + * Since Features are not yet initialized when ButtonData is created, use the + * fist available opportunity to create and set IPHCommandBuilder. Once set it's + * never updated. + */ + private void maybeSetIphCommandBuilder(Tab tab) { + if (mButtonData.getButtonSpec().getIPHCommandBuilder() != null || tab == null + || !FeatureList.isInitialized() + || !AdaptiveToolbarFeatures.isCustomizationEnabled()) { + return; + } + + HighlightParams params = new HighlightParams(HighlightShape.CIRCLE); + params.setBoundsRespectPadding(true); + IPHCommandBuilder iphCommandBuilder = new IPHCommandBuilder(tab.getContext().getResources(), + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_NEW_TAB_FEATURE, + /* stringId = */ R.string.adaptive_toolbar_button_new_tab_iph, + /* accessibilityStringId = */ R.string.adaptive_toolbar_button_new_tab_iph) + .setHighlightParams(params); + + ButtonData.ButtonSpec currentSpec = mButtonData.getButtonSpec(); + ButtonData.ButtonSpec newSpec = new ButtonData.ButtonSpec(currentSpec.getDrawable(), + currentSpec.getOnClickListener(), currentSpec.getContentDescriptionResId(), + currentSpec.getSupportsTinting(), iphCommandBuilder, + currentSpec.getButtonVariant()); + + mButtonData.setButtonSpec(newSpec); + } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java new file mode 100644 index 0000000..e606f0d2 --- /dev/null +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java
@@ -0,0 +1,130 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.toolbar.adaptive; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.view.View; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tabmodel.TabCreator; +import org.chromium.chrome.browser.tabmodel.TabCreatorManager; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.user_education.IPHCommandBuilder; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +/** Unit tests for {@link OptionalNewTabButtonController}. */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public final class OptionalNewTabButtonControllerUnitTest { + private static final int WIDTH_DELTA = 50; + + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + + @Mock + private Context mContext; + @Mock + private Resources mResources; + @Mock + private Tab mTab; + @Mock + private Drawable mDrawable; + @Mock + private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; + @Mock + private TabCreatorManager mTabCreatorManager; + @Mock + TabCreator mTabCreator; + @Mock + private TabModelSelector mTabModelSelector; + @Mock + private Tracker mTracker; + + private Configuration mConfiguration = new Configuration(); + private OptionalNewTabButtonController mOptionalNewTabButtonController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + doReturn(mContext).when(mTab).getContext(); + doReturn(mResources).when(mContext).getResources(); + + mConfiguration.screenWidthDp = OptionalNewTabButtonController.MIN_WIDTH_DP + WIDTH_DELTA; + doReturn(mConfiguration).when(mResources).getConfiguration(); + + doReturn(mTabCreator).when(mTabCreatorManager).getTabCreator(anyBoolean()); + + AdaptiveToolbarFeatures.clearParsedParamsForTesting(); + + mOptionalNewTabButtonController = new OptionalNewTabButtonController(mContext, mDrawable, + mActivityLifecycleDispatcher, + () -> mTabCreatorManager, () -> mTabModelSelector, () -> mTracker); + + TrackerFactory.setTrackerForTests(mTracker); + } + + @EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) + @Test + public void testIPHCommandHelper() { + assertNull(mOptionalNewTabButtonController.get(/*tab*/ null) + .getButtonSpec() + .getIPHCommandBuilder()); + + // Verify that IPHCommandBuilder is set just once; + IPHCommandBuilder builder = + mOptionalNewTabButtonController.get(mTab).getButtonSpec().getIPHCommandBuilder(); + + assertNotNull( + mOptionalNewTabButtonController.get(mTab).getButtonSpec().getIPHCommandBuilder()); + + // Verify that IPHCommandBuilder is same as before, get(Tab) did not create a new one. + assertEquals(builder, + mOptionalNewTabButtonController.get(mTab).getButtonSpec().getIPHCommandBuilder()); + } + + @Test + @EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) + public void testIPHEvent() { + doReturn(true).when(mTracker).shouldTriggerHelpUI( + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_NEW_TAB_FEATURE); + + View view = Mockito.mock(View.class); + mOptionalNewTabButtonController.get(mTab).getButtonSpec().getOnClickListener().onClick( + view); + + verify(mTracker, times(1)) + .notifyEvent(EventConstants.ADAPTIVE_TOOLBAR_CUSTOMIZATION_NEW_TAB_OPENED); + } +}
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/settings/AdaptiveToolbarPreferenceFragmentTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/settings/AdaptiveToolbarPreferenceFragmentTest.java index ae193fd5..4c18c2f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/settings/AdaptiveToolbarPreferenceFragmentTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/settings/AdaptiveToolbarPreferenceFragmentTest.java
@@ -19,6 +19,7 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.toolbar.R; @@ -26,6 +27,7 @@ import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarPrefs; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarStatePredictor; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.browser_ui.settings.ChromeSwitchPreference; import org.chromium.components.browser_ui.widget.RadioButtonWithDescription; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -34,6 +36,7 @@ * Tests for {@link AdaptiveToolbarPreferenceFragment}. */ @RunWith(ChromeJUnit4ClassRunner.class) +@EnableFeatures({ChromeFeatureList.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION}) public class AdaptiveToolbarPreferenceFragmentTest { @Rule public SettingsActivityTestRule<AdaptiveToolbarPreferenceFragment> mSettingsActivityTestRule =
diff --git a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc index e6ec919..b38701fd 100644 --- a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc +++ b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc
@@ -43,7 +43,12 @@ class AssistantBrowserTest : public MixinBasedInProcessBrowserTest { public: - AssistantBrowserTest() = default; + AssistantBrowserTest() { + // TODO(b/190633242): enable sandbox in browser tests. + feature_list_.InitAndDisableFeature( + chromeos::assistant::features::kEnableLibAssistantSandbox); + } + ~AssistantBrowserTest() override = default; AssistantTestMixin* tester() { return &tester_; }
diff --git a/chrome/browser/ui/ash/assistant/assistant_client_impl.cc b/chrome/browser/ui/ash/assistant/assistant_client_impl.cc index dca9cd11..5701aa1 100644 --- a/chrome/browser/ui/ash/assistant/assistant_client_impl.cc +++ b/chrome/browser/ui/ash/assistant/assistant_client_impl.cc
@@ -33,9 +33,9 @@ #include "content/public/common/content_switches.h" #include "services/network/public/cpp/shared_url_loader_factory.h" -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/services/libassistant/public/mojom/service.mojom.h" -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) AssistantClientImpl::AssistantClientImpl() { auto* session_manager = session_manager::SessionManager::Get(); @@ -167,7 +167,7 @@ ash::GetNetworkConfigService(std::move(receiver)); } -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) void AssistantClientImpl::RequestLibassistantService( mojo::PendingReceiver<chromeos::libassistant::mojom::LibassistantService> receiver) { @@ -177,7 +177,7 @@ .WithDisplayName("Libassistant Service") .Pass()); } -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) void AssistantClientImpl::OnExtendedAccountInfoUpdated( const AccountInfo& info) {
diff --git a/chrome/browser/ui/ash/assistant/assistant_client_impl.h b/chrome/browser/ui/ash/assistant/assistant_client_impl.h index e255d727..79d24fd 100644 --- a/chrome/browser/ui/ash/assistant/assistant_client_impl.h +++ b/chrome/browser/ui/ash/assistant/assistant_client_impl.h
@@ -79,11 +79,11 @@ void RequestNetworkConfig( mojo::PendingReceiver<chromeos::network_config::mojom::CrosNetworkConfig> receiver) override; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) void RequestLibassistantService( mojo::PendingReceiver<chromeos::libassistant::mojom::LibassistantService> receiver) override; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) private: // signin::IdentityManager::Observer:
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc index 01d8a235..5799f3a7 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.cc
@@ -176,10 +176,11 @@ HoldingSpaceItem* HoldingSpaceBrowserTestBase::AddItem( Profile* profile, HoldingSpaceItem::Type type, - const base::FilePath& file_path) { + const base::FilePath& file_path, + const absl::optional<float>& progress) { auto item = HoldingSpaceItem::CreateFileBackedItem( type, file_path, - holding_space_util::ResolveFileSystemUrl(profile, file_path), + holding_space_util::ResolveFileSystemUrl(profile, file_path), progress, base::BindLambdaForTesting( [&](HoldingSpaceItem::Type type, const base::FilePath& path) { return std::make_unique<HoldingSpaceImage>(
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h index 4d85326..42e7a64 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h +++ b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h
@@ -58,10 +58,12 @@ HoldingSpaceItem* AddScreenRecordingFile(); // Adds and returns a holding space item of the specified `type` backed by the - // file at the specified `file_path`. + // file at the specified `file_path` with optional `progress`. + // NOTE: If present, `progress` must be >= `0.f` and <= `1.f`. HoldingSpaceItem* AddItem(Profile* profile, HoldingSpaceItem::Type type, - const base::FilePath& file_path); + const base::FilePath& file_path, + const absl::optional<float>& progress = 1.f); // Removes the specified holding space `item`. void RemoveItem(const HoldingSpaceItem* item);
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_client_impl.cc b/chrome/browser/ui/ash/holding_space/holding_space_client_impl.cc index c0803f0f..7c94494 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_client_impl.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_client_impl.cc
@@ -256,8 +256,11 @@ const std::vector<const HoldingSpaceItem*>& items) { std::vector<storage::FileSystemURL> file_system_urls; + // NOTE: In-progress holding space items are neither pin- nor unpin-able. HoldingSpaceKeyedService* service = GetHoldingSpaceKeyedService(profile_); for (const HoldingSpaceItem* item : items) { + if (item->IsInProgress()) + continue; const storage::FileSystemURL& file_system_url = file_manager::util::GetFileManagerFileSystemContext(profile_)->CrackURL( item->file_system_url()); @@ -301,8 +304,11 @@ const std::vector<const HoldingSpaceItem*>& items) { std::vector<storage::FileSystemURL> file_system_urls; + // NOTE: In-progress holding space items are neither pin- nor unpin-able. HoldingSpaceKeyedService* service = GetHoldingSpaceKeyedService(profile_); for (const HoldingSpaceItem* item : items) { + if (item->IsInProgress()) + continue; const storage::FileSystemURL& file_system_url = file_manager::util::GetFileManagerFileSystemContext(profile_)->CrackURL( item->file_system_url());
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc index 6b97492b..6b4a309 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_downloads_delegate.cc
@@ -73,6 +73,12 @@ // invoked in direct response to an explicit user action. void Resume() { download_item_->Resume(/*from_user=*/true); } + // Returns the number of bytes received from the underlying `download_item`. + absl::optional<int64_t> GetBytesReceived() const { + const int64_t bytes = download_item_->GetReceivedBytes(); + return bytes >= 0 ? absl::make_optional(bytes) : absl::nullopt; + } + // Returns the file path associated with the underlying `download_item_`. // NOTE: The file path may be empty before a target file path has been picked. const base::FilePath& GetFilePath() const { @@ -386,6 +392,7 @@ ->SetBackingFile(in_progress_download->GetFilePath(), holding_space_util::ResolveFileSystemUrl( profile(), in_progress_download->GetFilePath())) + .SetCurrentSizeInBytes(in_progress_download->GetBytesReceived()) .SetPaused(in_progress_download->IsPaused()) .SetProgress(in_progress_download->GetProgress()); }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc index 54f9ec8..761d083 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
@@ -851,6 +851,85 @@ ASSERT_FALSE(test_api().IsShowingInShelf()); } +// Verifies that pinning and unpinning holding space items works as intended. +IN_PROC_BROWSER_TEST_F(HoldingSpaceUiBrowserTest, PinAndUnpinItems) { + ui::ScopedAnimationDurationScaleMode scoped_animation_duration_scale_mode( + ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); + + // Add an item of every type. For downloads, also add an in-progress item. + for (HoldingSpaceItem::Type type : GetHoldingSpaceItemTypes()) + AddItem(GetProfile(), type, CreateFile()); + AddItem(GetProfile(), HoldingSpaceItem::Type::kDownload, CreateFile(), + /*progress=*/0.f); + + // Show holding space UI. + test_api().Show(); + ASSERT_TRUE(test_api().IsShowing()); + + // Verify existence of views for pinned files, screen captures, and downloads. + using ViewList = std::vector<views::View*>; + ViewList pinned_file_chips = test_api().GetPinnedFileChips(); + ASSERT_EQ(pinned_file_chips.size(), 1u); + ViewList screen_capture_views = test_api().GetScreenCaptureViews(); + ASSERT_GE(screen_capture_views.size(), 1u); + ViewList download_chips = test_api().GetDownloadChips(); + ASSERT_GE(download_chips.size(), 2u); + + // Attempt to pin a screen capture via context menu. + RightClick(screen_capture_views.front()); + ASSERT_TRUE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kPinItem)); + PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN); + pinned_file_chips = test_api().GetPinnedFileChips(); + ASSERT_EQ(pinned_file_chips.size(), 2u); + ASSERT_EQ( + test_api().GetHoldingSpaceItemFilePath(pinned_file_chips.front()), + test_api().GetHoldingSpaceItemFilePath(screen_capture_views.front())); + + // Attempt to pin a completed download via context menu. Note that the first + // download is the in-progress download, so don't select that one. + RightClick(download_chips.at(1)); + ASSERT_TRUE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kPinItem)); + PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN); + pinned_file_chips = test_api().GetPinnedFileChips(); + ASSERT_EQ(pinned_file_chips.size(), 3u); + ASSERT_EQ(test_api().GetHoldingSpaceItemFilePath(pinned_file_chips.front()), + test_api().GetHoldingSpaceItemFilePath(download_chips.at(1))); + + // Attempt to pin an in-progress download via context menu. Because the + // download is in-progress, it should neither be pin- or unpin-able. + RightClick(download_chips.front()); + ASSERT_TRUE(views::MenuController::GetActiveInstance()); + ASSERT_FALSE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kPinItem)); + ASSERT_FALSE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kUnpinItem)); + PressAndReleaseKey(ui::KeyboardCode::VKEY_ESCAPE); + + // Attempt to unpin the pinned download via context menu without de-selecting + // the in-progress download. Because the selection contains items which are + // not in-progress and all of those items are pinned, the selection should be + // unpin-able. + RightClick(download_chips.at(1), ui::EF_CONTROL_DOWN); + ASSERT_TRUE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kUnpinItem)); + PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN); + pinned_file_chips = test_api().GetPinnedFileChips(); + ASSERT_EQ(pinned_file_chips.size(), 2u); + ASSERT_EQ( + test_api().GetHoldingSpaceItemFilePath(pinned_file_chips.front()), + test_api().GetHoldingSpaceItemFilePath(screen_capture_views.front())); + + // Select the pinned file and again attempt to pin the completed download via + // context menu, still without de-selecting the in-progress download. Because + // the selection contains items which are not in-progress and at least one of + // those items are unpinned, the selection should be pin-able. + Click(pinned_file_chips.front(), ui::EF_CONTROL_DOWN); + RightClick(download_chips.front()); + ASSERT_TRUE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kPinItem)); + PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN); + pinned_file_chips = test_api().GetPinnedFileChips(); + ASSERT_EQ(pinned_file_chips.size(), 3u); + ASSERT_EQ(test_api().GetHoldingSpaceItemFilePath(pinned_file_chips.front()), + test_api().GetHoldingSpaceItemFilePath(download_chips.at(1))); +} + // Verifies that opening holding space items works. IN_PROC_BROWSER_TEST_F(HoldingSpaceUiBrowserTest, OpenItem) { // Install the Media App, which we expect to open holding space items.
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.cc b/chrome/browser/ui/ash/projector/projector_client_impl.cc index 1817f05..5c1b41a 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_client_impl.cc
@@ -10,6 +10,8 @@ #include "components/soda/soda_installer.h" #include "media/base/media_switches.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/display/display.h" +#include "ui/display/screen.h" namespace { // On-device speech recognition is only available in US English. @@ -61,7 +63,9 @@ } void ProjectorClientImpl::ShowSelfieCam() { - selfie_cam_bubble_manager_.Show(ProfileManager::GetPrimaryUserProfile()); + selfie_cam_bubble_manager_.Show( + ProfileManager::GetPrimaryUserProfile(), + display::Screen::GetScreen()->GetPrimaryDisplay().work_area()); } void ProjectorClientImpl::CloseSelfieCam() {
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc index 4a29dd8..d689117 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.cc
@@ -99,6 +99,12 @@ user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); } +void AppServiceAppWindowArcTracker::HandleWindowActivatedChanged( + aura::Window* window) { + OnTaskSetActive(active_task_id_); + active_session_id_ = arc::GetWindowSessionId(window).value_or(arc::kNoTaskId); +} + void AppServiceAppWindowArcTracker::HandleWindowDestroying( aura::Window* window) { app_service_controller_->UnregisterWindow(window); @@ -111,8 +117,11 @@ info->set_window(nullptr); auto session_id = arc::GetWindowSessionId(window); - if (session_id.has_value()) + if (session_id.has_value()) { session_id_to_arc_app_window_info_.erase(*session_id); + if (session_id == active_session_id_) + active_session_id_ = arc::kNoTaskId; + } } void AppServiceAppWindowArcTracker::OnAppStatesChanged( @@ -144,6 +153,18 @@ arc::ArcAppShelfId::FromIntentAndAppId(intent, arc_app_id); task_id_to_arc_app_window_info_[task_id] = std::make_unique<ArcAppWindowInfo>( arc_app_shelf_id, intent, package_name); + + // If there is a ghost window for `session_id`, reuse the ghost window info, + // and clear the ghost window info from `session_id_to_arc_app_window_info_`, + // and reset `active_session_id_`. + auto it = session_id_to_arc_app_window_info_.find(session_id); + if (it != session_id_to_arc_app_window_info_.end()) { + task_id_to_arc_app_window_info_[task_id]->set_window(it->second->window()); + session_id_to_arc_app_window_info_.erase(it); + if (session_id == active_session_id_) + active_session_id_ = arc::kNoTaskId; + } + // Hide from shelf if there already is some task representing the window. if (GetTaskIdSharingLogicalWindow(task_id) != arc::kNoTaskId) task_id_to_arc_app_window_info_[task_id]->set_hidden_from_shelf(true); @@ -317,15 +338,12 @@ if (*task_or_session_id == arc::kSystemWindowTaskId) return; - auto it = task_id_to_arc_app_window_info_.find(*task_or_session_id); - if (it == task_id_to_arc_app_window_info_.end()) + ArcAppWindowInfo* const info = GetArcAppWindowInfo(window); + if (!info) return; window->SetProperty<int>(ash::kShelfItemTypeKey, ash::TYPE_APP); - ArcAppWindowInfo* const info = it->second.get(); - DCHECK(info); - // Check if we have set the AppWindowBase for this task. if (app_service_controller_->GetAppWindow(window)) return; @@ -334,7 +352,14 @@ DCHECK(widget); info->set_window(window); const ash::ShelfID shelf_id = info->shelf_id(); - AttachControllerToTask(*task_or_session_id); + + const auto task_id = arc::GetWindowTaskId(window); + const auto session_id = arc::GetWindowSessionId(window); + if (task_id.has_value()) + AttachControllerToTask(*task_id); + else if (session_id.has_value()) + AttachControllerToSession(*session_id); + app_service_controller_->AddWindowToShelf(window, shelf_id); AppWindowBase* app_window = app_service_controller_->GetAppWindow(window); if (app_window) @@ -418,6 +443,31 @@ app_shelf_group_to_controller_map_[app_shelf_id] = item_controller; } +void AppServiceAppWindowArcTracker::AttachControllerToSession(int session_id) { + ArcAppWindowInfo* const app_window_info = + session_id_to_arc_app_window_info_[session_id].get(); + const arc::ArcAppShelfId& app_shelf_id = app_window_info->app_shelf_id(); + if (base::Contains(app_shelf_group_to_controller_map_, app_shelf_id)) + return; + + const ash::ShelfID shelf_id(app_shelf_id.ToString()); + std::unique_ptr<AppServiceAppWindowShelfItemController> controller = + std::make_unique<AppServiceAppWindowShelfItemController>( + shelf_id, app_service_controller_); + AppServiceAppWindowShelfItemController* item_controller = controller.get(); + + if (!app_service_controller_->owner()->GetItem(shelf_id)) { + app_service_controller_->owner()->CreateAppItem(std::move(controller), + ash::STATUS_RUNNING); + } else { + app_service_controller_->owner()->shelf_model()->SetShelfItemDelegate( + shelf_id, std::move(controller)); + app_service_controller_->owner()->SetItemStatus(shelf_id, + ash::STATUS_RUNNING); + } + app_shelf_group_to_controller_map_[app_shelf_id] = item_controller; +} + void AppServiceAppWindowArcTracker::OnArcOptInManagementCheckStarted() { // In case of retry this time is updated and we measure only successful run. opt_in_management_check_start_time_ = base::Time::Now();
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.h b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.h index cc0bfe8..0949a3183 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.h +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_arc_tracker.h
@@ -59,6 +59,9 @@ // Invoked by controller to notify |window| visibility is changed. void HandleWindowVisibilityChanged(aura::Window* window); + // Invoked by controller to notify |window| activated is changed. + void HandleWindowActivatedChanged(aura::Window* window); + // Invoked by controller to notify |window| is destroying. void HandleWindowDestroying(aura::Window* window); @@ -96,6 +99,8 @@ int active_task_id() const { return active_task_id_; } + int active_session_id() const { return active_session_id_; } + private: using TaskIdToArcAppWindowInfo = std::map<int, std::unique_ptr<ArcAppWindowInfo>>; @@ -109,9 +114,10 @@ std::map<arc::ArcAppShelfId, AppServiceAppWindowShelfItemController*>; // Checks |arc_window_candidates_| and attaches controller when they - // are ARC app windows and have task id. + // are ARC app windows and have task id or session id. void CheckAndAttachControllers(); void AttachControllerToTask(int taskId); + void AttachControllerToSession(int session_id); // arc::ArcSessionManagerObserver: void OnArcOptInManagementCheckStarted() override; @@ -157,6 +163,7 @@ std::set<aura::Window*> arc_window_candidates_; int active_task_id_ = arc::kNoTaskId; + int active_session_id_ = arc::kNoTaskId; // The time when the ARC OptIn management check was started. This happens // right after user agrees the ToS or in some cases for managed user when ARC
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc index b5d7472..85287b8 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
@@ -314,7 +314,7 @@ AppWindowShelfController::OnWindowActivated(reason, new_active, old_active); if (arc_tracker_) - arc_tracker_->OnTaskSetActive(arc_tracker_->active_task_id()); + arc_tracker_->HandleWindowActivatedChanged(new_active); SetWindowActivated(new_active, /*active*/ true); SetWindowActivated(old_active, /*active*/ false); @@ -402,6 +402,12 @@ return arc::kNoTaskId; } +int AppServiceAppWindowShelfController::GetActiveSessionId() const { + if (arc_tracker_) + return arc_tracker_->active_session_id(); + return arc::kNoTaskId; +} + void AppServiceAppWindowShelfController::UnregisterWindow( aura::Window* window) { auto app_window_it = aura_window_to_app_window_.find(window);
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h index be0e179..681c041 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h
@@ -76,6 +76,7 @@ // ArcAppWindowDelegate: int GetActiveTaskId() const override; + int GetActiveSessionId() const override; // Removes an AppWindowBase from its AppWindowShelfItemController by // |window|.
diff --git a/chrome/browser/ui/ash/shelf/arc_app_window.cc b/chrome/browser/ui/ash/shelf/arc_app_window.cc index f53a979b..0360eb56 100644 --- a/chrome/browser/ui/ash/shelf/arc_app_window.cc +++ b/chrome/browser/ui/ash/shelf/arc_app_window.cc
@@ -75,7 +75,10 @@ bool ArcAppWindow::IsActive() const { return widget()->IsActive() && - owner_->GetActiveTaskId() == arc::GetWindowTaskId(GetNativeWindow()); + (owner_->GetActiveTaskId() == + arc::GetWindowTaskId(GetNativeWindow()) || + owner_->GetActiveSessionId() == + arc::GetWindowSessionId(GetNativeWindow())); } void ArcAppWindow::Close() {
diff --git a/chrome/browser/ui/ash/shelf/arc_app_window_delegate.h b/chrome/browser/ui/ash/shelf/arc_app_window_delegate.h index 2d97390b..31bd290 100644 --- a/chrome/browser/ui/ash/shelf/arc_app_window_delegate.h +++ b/chrome/browser/ui/ash/shelf/arc_app_window_delegate.h
@@ -16,6 +16,9 @@ // Returns the active task id. virtual int GetActiveTaskId() const = 0; + + // Returns the active session id for ARC ghost windows. + virtual int GetActiveSessionId() const = 0; }; #endif // CHROME_BROWSER_UI_ASH_SHELF_ARC_APP_WINDOW_DELEGATE_H_
diff --git a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc index 2c87144..d749a67 100644 --- a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc +++ b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
@@ -70,7 +70,7 @@ // A class that installs itself as the sink to handle automation event bundles // from AutomationManagerAura, then waits until an automation event indicates -// that a given node ID is focused. +// that a given node ID is focused or an AX event is sent. class AutomationEventWaiter : public extensions::AutomationEventRouterInterface { public: @@ -293,6 +293,7 @@ auto* cache_ptr = cache.get(); AutomationManagerAura* manager = AutomationManagerAura::GetInstance(); manager->set_ax_aura_obj_cache_for_testing(std::move(cache)); + AutomationEventWaiter waiter; manager->Enable(); auto* tree = manager->tree_.get(); @@ -346,17 +347,25 @@ node_data.GetIntAttribute(ax::mojom::IntAttribute::kScrollYMax), kAllowedError); - // Scroll right and check the X position. + // Scroll right and check a scroll event occurred and the X position. ui::AXActionData action_data; action_data.action = ax::mojom::Action::kScrollRight; scroll_view_wrapper->HandleAccessibleAction(action_data); + auto event_from_views = + waiter.WaitForEvent(ax::mojom::Event::kScrollPositionChanged); + ASSERT_NE(nullptr, event_from_views.get()); + EXPECT_EQ(ax::mojom::EventFrom::kNone, event_from_views->event_from); tree->SerializeNode(scroll_view_wrapper, &node_data); EXPECT_NEAR(200, node_data.GetIntAttribute(ax::mojom::IntAttribute::kScrollX), kAllowedError); - // Scroll down and check the Y position. + // Scroll down and check a scroll event occurred and the Y position. action_data.action = ax::mojom::Action::kScrollDown; scroll_view_wrapper->HandleAccessibleAction(action_data); + event_from_views = + waiter.WaitForEvent(ax::mojom::Event::kScrollPositionChanged); + ASSERT_NE(nullptr, event_from_views.get()); + EXPECT_EQ(ax::mojom::EventFrom::kNone, event_from_views->event_from); tree->SerializeNode(scroll_view_wrapper, &node_data); EXPECT_NEAR(200, node_data.GetIntAttribute(ax::mojom::IntAttribute::kScrollY), kAllowedError); @@ -365,6 +374,10 @@ action_data.action = ax::mojom::Action::kSetScrollOffset; action_data.target_point.SetPoint(50, 315); scroll_view_wrapper->HandleAccessibleAction(action_data); + event_from_views = + waiter.WaitForEvent(ax::mojom::Event::kScrollPositionChanged); + ASSERT_NE(nullptr, event_from_views.get()); + EXPECT_EQ(ax::mojom::EventFrom::kNone, event_from_views->event_from); tree->SerializeNode(scroll_view_wrapper, &node_data); EXPECT_EQ(50, node_data.GetIntAttribute(ax::mojom::IntAttribute::kScrollX)); EXPECT_EQ(315, node_data.GetIntAttribute(ax::mojom::IntAttribute::kScrollY));
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc index 8c71662..ab21e2d 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -61,6 +60,8 @@ class MockAutofillClient : public autofill::TestAutofillClient { public: MockAutofillClient() : prefs_(autofill::test::PrefServiceForTesting()) {} + MockAutofillClient(MockAutofillClient&) = delete; + MockAutofillClient& operator=(MockAutofillClient&) = delete; ~MockAutofillClient() override = default; PrefService* GetPrefs() override { @@ -70,8 +71,6 @@ private: std::unique_ptr<PrefService> prefs_; - - DISALLOW_COPY_AND_ASSIGN(MockAutofillClient); }; class MockAutofillDriver : public ContentAutofillDriver { @@ -84,11 +83,11 @@ kDownloadState, AutofillManager::AutofillManagerFactoryCallback()) {} + MockAutofillDriver(MockAutofillDriver&) = delete; + MockAutofillDriver& operator=(MockAutofillDriver&) = delete; + ~MockAutofillDriver() override = default; MOCK_CONST_METHOD0(GetAxTreeId, ui::AXTreeID()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAutofillDriver); }; class MockBrowserAutofillManager : public BrowserAutofillManager { @@ -98,10 +97,9 @@ client, client->GetPersonalDataManager(), client->GetAutocompleteHistoryManager()) {} + MockBrowserAutofillManager(MockBrowserAutofillManager&) = delete; + MockBrowserAutofillManager& operator=(MockBrowserAutofillManager&) = delete; ~MockBrowserAutofillManager() override = default; - - private: - DISALLOW_COPY_AND_ASSIGN(MockBrowserAutofillManager); }; class MockAutofillExternalDelegate : public AutofillExternalDelegate { @@ -127,6 +125,8 @@ class MockAutofillPopupView : public AutofillPopupView { public: MockAutofillPopupView() = default; + MockAutofillPopupView(MockAutofillPopupView&) = delete; + MockAutofillPopupView& operator=(MockAutofillPopupView&) = delete; ~MockAutofillPopupView() override = default; MOCK_METHOD0(Show, void()); @@ -136,9 +136,6 @@ absl::optional<int> current_row_selection)); MOCK_METHOD0(OnSuggestionsChanged, void()); MOCK_METHOD0(GetAxUniqueId, absl::optional<int32_t>()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAutofillPopupView); }; class TestAutofillPopupController : public AutofillPopupControllerImpl { @@ -182,6 +179,8 @@ class MockAxTreeManager : public ui::AXTreeManager { public: MockAxTreeManager() = default; + MockAxTreeManager(MockAxTreeManager&) = delete; + MockAxTreeManager& operator=(MockAxTreeManager&) = delete; ~MockAxTreeManager() = default; MOCK_CONST_METHOD2(GetNodeFromTree, @@ -196,33 +195,28 @@ MOCK_CONST_METHOD0(GetParentTreeID, ui::AXTreeID()); MOCK_CONST_METHOD0(GetRootAsAXNode, ui::AXNode*()); MOCK_CONST_METHOD0(GetParentNodeFromParentTreeAsAXNode, ui::AXNode*()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAxTreeManager); }; class MockAxPlatformNodeDelegate : public ui::AXPlatformNodeDelegateBase { public: MockAxPlatformNodeDelegate() = default; + MockAxPlatformNodeDelegate(MockAxPlatformNodeDelegate&) = delete; + MockAxPlatformNodeDelegate& operator=(MockAxPlatformNodeDelegate&) = delete; ~MockAxPlatformNodeDelegate() override = default; MOCK_METHOD1(GetFromNodeID, ui::AXPlatformNode*(int32_t id)); MOCK_METHOD2(GetFromTreeIDAndNodeID, ui::AXPlatformNode*(const ui::AXTreeID& tree_id, int32_t id)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAxPlatformNodeDelegate); }; class MockAxPlatformNode : public ui::AXPlatformNodeBase { public: MockAxPlatformNode() = default; + MockAxPlatformNode(MockAxPlatformNode&) = delete; + MockAxPlatformNode& operator=(MockAxPlatformNode&) = delete; ~MockAxPlatformNode() override = default; MOCK_CONST_METHOD0(GetDelegate, ui::AXPlatformNodeDelegate*()); - - private: - DISALLOW_COPY_AND_ASSIGN(MockAxPlatformNode); }; static constexpr absl::optional<int> kNoSelection; @@ -274,7 +268,9 @@ return autofill_popup_controller_; } - MockAutofillExternalDelegate* delegate() { return external_delegate_.get(); } + NiceMock<MockAutofillExternalDelegate>* delegate() { + return external_delegate_.get(); + } MockAutofillPopupView* autofill_popup_view() { return autofill_popup_view_.get(); @@ -293,6 +289,10 @@ public: AutofillPopupControllerAccessibilityUnitTest() : accessibility_mode_setter_(ui::AXMode::kScreenReader) {} + AutofillPopupControllerAccessibilityUnitTest( + AutofillPopupControllerAccessibilityUnitTest&) = delete; + AutofillPopupControllerAccessibilityUnitTest& operator=( + AutofillPopupControllerAccessibilityUnitTest&) = delete; ~AutofillPopupControllerAccessibilityUnitTest() override = default; std::unique_ptr<NiceMock<MockAutofillExternalDelegate>> @@ -309,9 +309,6 @@ std::unique_ptr<MockBrowserAutofillManager> autofill_manager_; std::unique_ptr<NiceMock<MockAutofillDriver>> autofill_driver_; content::testing::ScopedContentAXModeSetter accessibility_mode_setter_; - - private: - DISALLOW_COPY_AND_ASSIGN(AutofillPopupControllerAccessibilityUnitTest); }; #endif @@ -596,8 +593,8 @@ ContentAutofillDriverFactory::FromWebContents(web_contents()); ContentAutofillDriver* driver = factory->DriverForFrame(web_contents()->GetMainFrame()); - MockAutofillExternalDelegate delegate(driver->browser_autofill_manager(), - driver); + NiceMock<MockAutofillExternalDelegate> delegate( + driver->browser_autofill_manager(), driver); WeakPtr<AutofillPopupControllerImpl> controller = AutofillPopupControllerImpl::GetOrCreate(
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 62cf61b..de365247 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -685,7 +685,8 @@ } void ChromeAutofillClient::OnVirtualCardFetched(const CreditCard* credit_card, - const std::u16string& cvc) { + const std::u16string& cvc, + const gfx::Image& card_image) { GetFormDataImporter()->CacheFetchedVirtualCard(credit_card->LastFourDigits()); #if defined(OS_ANDROID) (new AutofillSnackbarControllerImpl(web_contents()))->Show(); @@ -695,7 +696,7 @@ VirtualCardManualFallbackBubbleControllerImpl* controller = VirtualCardManualFallbackBubbleControllerImpl::FromWebContents( web_contents()); - controller->ShowBubble(credit_card, cvc); + controller->ShowBubble(credit_card, cvc, card_image); #endif }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index 1ca15fc..32becbf2 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -150,7 +150,8 @@ void ShowOfferNotificationIfApplicable( const AutofillOfferData* offer) override; void OnVirtualCardFetched(const CreditCard* card, - const std::u16string& cvc) override; + const std::u16string& cvc, + const gfx::Image& card_image) override; bool IsAutofillAssistantShowing() override; bool IsAutocompleteEnabled() override; void PropagateAutofillPredictions(
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller.h b/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller.h index 7376664..fdadf74 100644 --- a/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller.h +++ b/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller.h
@@ -9,6 +9,7 @@ #include "components/autofill/core/browser/ui/payments/payments_bubble_closed_reasons.h" #include "content/public/browser/web_contents.h" +#include "ui/gfx/image/image.h" namespace autofill { @@ -44,8 +45,11 @@ // Returns a reference to the bubble view. virtual AutofillBubbleBase* GetBubble() const = 0; + // Returns the title icon of the bubble. + virtual const gfx::Image& GetBubbleTitleIcon() const = 0; + // Returns the title text of the bubble. - virtual std::u16string GetBubbleTitle() const = 0; + virtual std::u16string GetBubbleTitleText() const = 0; // Returns the descriptive label of the virtual card number field. virtual std::u16string GetVirtualCardNumberFieldLabel() const = 0;
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.cc index 3424687..b9bbddc7 100644 --- a/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.cc
@@ -45,7 +45,8 @@ void VirtualCardManualFallbackBubbleControllerImpl::ShowBubble( const CreditCard* virtual_card, - const std::u16string& virtual_card_cvc) { + const std::u16string& virtual_card_cvc, + const gfx::Image& virtual_card_image) { // If another bubble is visible, dismiss it and show a new one since the card // information can be different. if (bubble_view()) @@ -53,6 +54,7 @@ virtual_card_ = *virtual_card; virtual_card_cvc_ = virtual_card_cvc; + virtual_card_image_ = virtual_card_image; is_user_gesture_ = false; should_icon_be_visible_ = true; Show(); @@ -73,8 +75,13 @@ return bubble_view(); } -std::u16string VirtualCardManualFallbackBubbleControllerImpl::GetBubbleTitle() - const { +const gfx::Image& +VirtualCardManualFallbackBubbleControllerImpl::GetBubbleTitleIcon() const { + return virtual_card_image_; +} + +std::u16string +VirtualCardManualFallbackBubbleControllerImpl::GetBubbleTitleText() const { return l10n_util::GetStringUTF16( IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_TITLE); }
diff --git a/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.h index 46f7cab..3ab39505 100644 --- a/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.h +++ b/chrome/browser/ui/autofill/payments/virtual_card_manual_fallback_bubble_controller_impl.h
@@ -35,14 +35,16 @@ // Show the bubble view. void ShowBubble(const CreditCard* virtual_card, - const std::u16string& virtual_card_cvc); + const std::u16string& virtual_card_cvc, + const gfx::Image& virtual_card_image); // Invoked when the omnibox icon is clicked. void ReshowBubble(); // VirtualCardManualFallbackBubbleController: AutofillBubbleBase* GetBubble() const override; - std::u16string GetBubbleTitle() const override; + const gfx::Image& GetBubbleTitleIcon() const override; + std::u16string GetBubbleTitleText() const override; std::u16string GetVirtualCardNumberFieldLabel() const override; std::u16string GetExpirationDateFieldLabel() const override; std::u16string GetCardholderNameFieldLabel() const override; @@ -76,6 +78,9 @@ // The virtual card to be displayed to the user in the bubble. CreditCard virtual_card_; + // The virtual card image to be displayed as the title icon of the bubble. + gfx::Image virtual_card_image_; + // Denotes whether the bubble is shown due to user gesture. If this is true, // it means the bubble is a reshown bubble. bool is_user_gesture_ = false;
diff --git a/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc b/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc index 86dbfe9..356ade5 100644 --- a/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc +++ b/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc
@@ -11,7 +11,6 @@ #include <vector> #include "base/bind.h" -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/strings/string_piece.h" @@ -26,9 +25,6 @@ #include "components/password_manager/core/common/password_manager_features.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/sync/driver/test_sync_service.h" -#if !defined(OS_ANDROID) -#include "base/test/metrics/histogram_tester.h" -#endif #include "base/test/mock_callback.h" #include "build/build_config.h" #include "chrome/browser/password_manager/account_password_store_factory.h" @@ -37,7 +33,6 @@ #include "chrome/browser/ui/passwords/settings/password_ui_view_mock.h" #include "chrome/test/base/testing_profile.h" #include "components/password_manager/core/browser/password_list_sorter.h" -#include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" #include "components/password_manager/core/browser/test_password_store.h" #include "components/password_manager/core/browser/ui/plaintext_reason.h" @@ -211,6 +206,10 @@ } } + PasswordManagerPresenterTest(const PasswordManagerPresenterTest&) = delete; + PasswordManagerPresenterTest& operator=(const PasswordManagerPresenterTest&) = + delete; + ~PasswordManagerPresenterTest() override { store_->ShutdownOnUIThread(); if (account_store_) { @@ -240,7 +239,7 @@ task_environment_.RunUntilIdle(); } - MockPasswordUIView& GetUIController() { return mock_controller_; } + NiceMock<MockPasswordUIView>& GetUIController() { return mock_controller_; } // TODO(victorvianna): Inline this. std::vector<password_manager::PasswordForm> GetStoredPasswordsForRealm( @@ -256,13 +255,11 @@ private: content::BrowserTaskEnvironment task_environment_; TestingProfile profile_; - MockPasswordUIView mock_controller_{&profile_}; + NiceMock<MockPasswordUIView> mock_controller_{&profile_}; // TODO(victorvianna): Rename to profile_store_. scoped_refptr<password_manager::TestPasswordStore> store_; base::test::ScopedFeatureList feature_list_; scoped_refptr<password_manager::TestPasswordStore> account_store_; - - DISALLOW_COPY_AND_ASSIGN(PasswordManagerPresenterTest); }; namespace {
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views_unittest.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views_unittest.cc index 3220416..2237e64 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views_unittest.cc +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views_unittest.cc
@@ -22,6 +22,8 @@ #include "ui/views/test/ax_event_counter.h" #include "ui/views/widget/widget_utils.h" +using testing::NiceMock; + namespace { struct TypeClicks { @@ -52,6 +54,9 @@ class AutofillPopupViewNativeViewsTest : public ChromeViewsTestBase { public: AutofillPopupViewNativeViewsTest() = default; + AutofillPopupViewNativeViewsTest(AutofillPopupViewNativeViewsTest&) = delete; + AutofillPopupViewNativeViewsTest& operator=( + AutofillPopupViewNativeViewsTest&) = delete; ~AutofillPopupViewNativeViewsTest() override = default; void SetUp() override { @@ -82,12 +87,9 @@ protected: std::unique_ptr<autofill::AutofillPopupViewNativeViews> view_; - autofill::MockAutofillPopupController autofill_popup_controller_; + NiceMock<autofill::MockAutofillPopupController> autofill_popup_controller_; std::unique_ptr<views::Widget> widget_; std::unique_ptr<ui::test::EventGenerator> generator_; - - private: - DISALLOW_COPY_AND_ASSIGN(AutofillPopupViewNativeViewsTest); }; class AutofillPopupViewNativeViewsForEveryTypeTest
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.cc index 07c8b6c..b86526b 100644 --- a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.cc
@@ -40,6 +40,7 @@ : LocationBarBubbleDelegateView(anchor_view, web_contents), controller_(controller) { DCHECK(controller_); + SetShowIcon(true); SetShowCloseButton(true); SetButtons(ui::DIALOG_BUTTON_NONE); } @@ -124,13 +125,22 @@ layout->AddView(CreateRowItemButton(controller_->GetCvc())); } -void VirtualCardManualFallbackBubbleViews::AddedToWidget() { - GetBubbleFrameView()->SetTitleView( - std::make_unique<TitleWithIconAndSeparatorView>(GetWindowTitle())); +ui::ImageModel VirtualCardManualFallbackBubbleViews::GetWindowIcon() { + // Fall back to network icon if no specific icon is provided. + // TODO(crbug.com/1218628): Fallback logic might be put inside + // BrowserAutofillManager or PDM. + if (controller_->GetBubbleTitleIcon().IsEmpty()) { + gfx::Image card_image = + ui::ResourceBundle::GetSharedInstance().GetImageNamed( + CreditCard::IconResourceId( + controller_->GetVirtualCard()->network())); + return ui::ImageModel::FromImage(card_image); + } + return ui::ImageModel::FromImage(controller_->GetBubbleTitleIcon()); } std::u16string VirtualCardManualFallbackBubbleViews::GetWindowTitle() const { - return controller_ ? controller_->GetBubbleTitle() : std::u16string(); + return controller_ ? controller_->GetBubbleTitleText() : std::u16string(); } void VirtualCardManualFallbackBubbleViews::WindowClosing() {
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.h b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.h index 9fe345e..1631472 100644 --- a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.h +++ b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views.h
@@ -42,7 +42,7 @@ // LocationBarBubbleDelegateView: void Init() override; - void AddedToWidget() override; + ui::ImageModel GetWindowIcon() override; std::u16string GetWindowTitle() const override; void WindowClosing() override; void OnWidgetClosing(views::Widget* widget) override;
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc index ab8dd77..2e4c181 100644 --- a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc
@@ -57,8 +57,10 @@ void ShowBubble() { CreditCard card = test::GetFullServerCard(); ResetEventWaiterForSequence({BubbleEvent::BUBBLE_SHOWN}); + // Passing in empty image will fall back to use card network icon. GetController()->ShowBubble(&card, - /*virtual_card_cvc=*/u"123"); + /*virtual_card_cvc=*/u"123", + /*card_image=*/gfx::Image()); event_waiter_->Wait(); }
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc index 87b6ebe..9ba3ef9 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc +++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.cc
@@ -133,10 +133,10 @@ } void BrowserDesktopWindowTreeHostLinux::OnWindowStateChanged( + ui::PlatformWindowState old_window_show_state, ui::PlatformWindowState new_window_show_state) { - ui::PlatformWindowState old_window_show_state = window_show_state(); - - DesktopWindowTreeHostLinux::OnWindowStateChanged(new_window_show_state); + DesktopWindowTreeHostLinux::OnWindowStateChanged(old_window_show_state, + new_window_show_state); bool fullscreen_changed = new_window_show_state == ui::PlatformWindowState::kFullScreen ||
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h index 870540a4..0650669 100644 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h +++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_linux.h
@@ -51,7 +51,8 @@ bool IsOverrideRedirect(bool is_tiling_wm) const override; // ui::PlatformWindowDelegate - void OnWindowStateChanged(ui::PlatformWindowState new_state) override; + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override; BrowserView* browser_view_ = nullptr; BrowserFrame* browser_frame_ = nullptr;
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.cc deleted file mode 100644 index aa09d945..0000000 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.cc +++ /dev/null
@@ -1,53 +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 "chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.h" - -//////////////////////////////////////////////////////////////////////////////// -//// BrowserDesktopWindowTreeHostPlatform, public: - -BrowserDesktopWindowTreeHostPlatform::BrowserDesktopWindowTreeHostPlatform( - views::internal::NativeWidgetDelegate* native_widget_delegate, - views::DesktopNativeWidgetAura* desktop_native_widget_aura, - BrowserView* browser_view, - BrowserFrame* browser_frame) - : DesktopWindowTreeHostPlatform(native_widget_delegate, - desktop_native_widget_aura) {} - -BrowserDesktopWindowTreeHostPlatform::~BrowserDesktopWindowTreeHostPlatform() {} - -views::DesktopWindowTreeHost* -BrowserDesktopWindowTreeHostPlatform::AsDesktopWindowTreeHost() { - return this; -} - -int BrowserDesktopWindowTreeHostPlatform::GetMinimizeButtonOffset() const { - return 0; -} - -bool BrowserDesktopWindowTreeHostPlatform::UsesNativeSystemMenu() const { - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -//// DesktopWindowTreeHostPlatform, private: -bool BrowserDesktopWindowTreeHostPlatform::ShouldUseLayerForShapedWindow() - const { - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// BrowserDesktopWindowTreeHost, public: - -// static -BrowserDesktopWindowTreeHost* -BrowserDesktopWindowTreeHost::CreateBrowserDesktopWindowTreeHost( - views::internal::NativeWidgetDelegate* native_widget_delegate, - views::DesktopNativeWidgetAura* desktop_native_widget_aura, - BrowserView* browser_view, - BrowserFrame* browser_frame) { - return new BrowserDesktopWindowTreeHostPlatform(native_widget_delegate, - desktop_native_widget_aura, - browser_view, browser_frame); -}
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.h b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.h deleted file mode 100644 index 77413a89..0000000 --- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_platform.h +++ /dev/null
@@ -1,45 +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 CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_WINDOW_TREE_HOST_PLATFORM_H_ -#define CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_WINDOW_TREE_HOST_PLATFORM_H_ - -#include "base/macros.h" -#include "chrome/browser/ui/views/frame/browser_desktop_window_tree_host.h" -#include "ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h" - -class BrowserFrame; -class BrowserView; - -namespace views { -class DesktopNativeWidgetAura; -} - -// Platform independent frame implementation. Utilizes -// DesktopWindowTreeHostPlatform, which uses PlatformWindow with different -// backends like ozone and others. -class BrowserDesktopWindowTreeHostPlatform - : public BrowserDesktopWindowTreeHost, - public views::DesktopWindowTreeHostPlatform { - public: - BrowserDesktopWindowTreeHostPlatform( - views::internal::NativeWidgetDelegate* native_widget_delegate, - views::DesktopNativeWidgetAura* desktop_native_widget_aura, - BrowserView* browser_view, - BrowserFrame* browser_frame); - ~BrowserDesktopWindowTreeHostPlatform() override; - - private: - // Overridden from BrowserDesktopWindowTreeHost: - views::DesktopWindowTreeHost* AsDesktopWindowTreeHost() override; - int GetMinimizeButtonOffset() const override; - bool UsesNativeSystemMenu() const override; - - // Overridden from views::DesktopWindowTreeHostPlatform: - bool ShouldUseLayerForShapedWindow() const override; - - DISALLOW_COPY_AND_ASSIGN(BrowserDesktopWindowTreeHostPlatform); -}; - -#endif // CHROME_BROWSER_UI_VIEWS_FRAME_BROWSER_DESKTOP_WINDOW_TREE_HOST_PLATFORM_H_
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm index 872884d..caca34a2 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm
@@ -233,6 +233,11 @@ // requires a re-layout when in fullscreen and shown. if (web_app_frame_toolbar() && !ShouldHideTopUIForFullscreen()) InvalidateLayout(); + + if (ShouldHideTopUIForFullscreen() && + browser_view()->IsWindowControlsOverlayEnabled()) { + InvalidateLayout(); + } } }
diff --git a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc index f3d6fe7..a807ce9 100644 --- a/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc +++ b/chrome/browser/ui/views/global_media_controls/media_notification_container_impl_view_unittest.cc
@@ -21,7 +21,6 @@ #include "media/base/media_switches.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "testing/gmock/include/gmock/gmock.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" #include "ui/events/base_event_utils.h" #include "ui/events/test/event_generator.h" @@ -102,7 +101,7 @@ class MediaNotificationContainerImplViewTest : public ChromeViewsTestBase { public: - MediaNotificationContainerImplViewTest() : screen_override_(&fake_screen_) {} + MediaNotificationContainerImplViewTest() = default; ~MediaNotificationContainerImplViewTest() override = default; // ViewsTestBase: @@ -144,7 +143,7 @@ bool IsDismissButtonVisible() { return GetDismissButton()->IsDrawn(); } void SimulateHoverOverContainer() { - fake_screen_.set_cursor_screen_point( + GetTestScreen()->SetCursorScreenPointForTesting( notification_container_->GetBoundsInScreen().CenterPoint()); ui::MouseEvent event(ui::ET_MOUSE_ENTERED, gfx::Point(), gfx::Point(), @@ -156,7 +155,7 @@ gfx::Rect container_bounds = notification_container_->GetBoundsInScreen(); gfx::Point point_outside_container = container_bounds.bottom_right() + gfx::Vector2d(1, 1); - fake_screen_.set_cursor_screen_point(point_outside_container); + GetTestScreen()->SetCursorScreenPointForTesting(point_outside_container); ui::MouseEvent event(ui::ET_MOUSE_EXITED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), 0, 0); @@ -295,9 +294,6 @@ // Set of actions currently enabled. base::flat_set<MediaSessionAction> actions_; - display::test::TestScreen fake_screen_; - display::test::ScopedScreenOverride screen_override_; - DISALLOW_COPY_AND_ASSIGN(MediaNotificationContainerImplViewTest); };
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view_unittest.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view_unittest.cc index 157678fb..b5af5f2 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view_unittest.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view_unittest.cc
@@ -100,7 +100,7 @@ int flags, float x, float y) { - test_screen_->set_cursor_screen_point(gfx::Point(x, y)); + test_screen_->SetCursorScreenPointForTesting(gfx::Point(x, y)); return ui::MouseEvent(type, gfx::Point(x, y), gfx::Point(), ui::EventTimeForNow(), flags, 0); }
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc b/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc index dbeafad..0ec9fbb 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc +++ b/chrome/browser/ui/views/overlay/overlay_window_views_unittest.cc
@@ -16,7 +16,6 @@ #include "content/public/test/web_contents_tester.h" #include "media/base/media_switches.h" #include "ui/compositor/layer.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" class TestPictureInPictureWindowController @@ -76,9 +75,10 @@ } void SetDisplayWorkArea(const gfx::Rect& work_area) { - display::Display display = test_screen_.GetPrimaryDisplay(); + display::test::TestScreen* screen = GetTestScreen(); + display::Display display = screen->GetPrimaryDisplay(); display.set_work_area(work_area); - test_screen_.display_list().UpdateDisplay(display); + screen->display_list().UpdateDisplay(display); } OverlayWindowViews& overlay_window() { return *overlay_window_; } @@ -92,9 +92,6 @@ web_contents_factory_.CreateWebContents(&profile_); TestPictureInPictureWindowController pip_window_controller_{web_contents_}; - display::test::TestScreen test_screen_; - display::test::ScopedScreenOverride scoped_screen_override_{&test_screen_}; - std::unique_ptr<OverlayWindowViews> overlay_window_; };
diff --git a/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc b/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc index 3881c68..dd66c66 100644 --- a/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc +++ b/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.cc
@@ -57,16 +57,6 @@ void SharingHubIconView::OnExecuting( PageActionIconView::ExecuteSource execute_source) {} -#if BUILDFLAG(IS_CHROMEOS_ASH) -void SharingHubIconView::NotifyClick(const ui::Event& event) { - // Unlike WML, ChromeOS uses a separate dialog that is not attached to the - // omnibox. Therefore, we do not want the icon to remain highlighted while - // the dialog is open. - PageActionIconView::NotifyClick(event); - SetHighlighted(false); -} -#endif - const gfx::VectorIcon& SharingHubIconView::GetVectorIcon() const { #if BUILDFLAG(IS_CHROMEOS_ASH) return omnibox::kShareIcon;
diff --git a/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.h b/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.h index f7d6b86d..2d895db 100644 --- a/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.h +++ b/chrome/browser/ui/views/sharing_hub/sharing_hub_icon_view.h
@@ -37,9 +37,6 @@ // PageActionIconView: void OnExecuting(PageActionIconView::ExecuteSource execute_source) override; const gfx::VectorIcon& GetVectorIcon() const override; -#if BUILDFLAG(IS_CHROMEOS_ASH) - void NotifyClick(const ui::Event& event) override; -#endif private: SharingHubBubbleController* GetController() const;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index e320c3f..105389f 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -2923,8 +2923,11 @@ for (std::vector<Tab*>::reverse_iterator tab = tabs.rbegin(); tab != tabs.rend(); ++tab) { absl::optional<tab_groups::TabGroupId> current_group = (*tab)->group(); - if (current_group != last_tab_group && last_tab_group.has_value()) - group_header(last_tab_group.value())->SetVisible(last_tab_visible); + if (current_group != last_tab_group && last_tab_group.has_value()) { + TabGroupViews* group_view = group_views_.at(last_tab_group.value()).get(); + group_view->header()->SetVisible(last_tab_visible); + group_view->underline()->SetVisible(last_tab_visible); + } last_tab_visible = ShouldTabBeVisible(*tab); last_tab_group = (*tab)->closing() ? absl::nullopt : current_group;
diff --git a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc index afb3ab6..286889e 100644 --- a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc +++ b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
@@ -19,8 +19,10 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/webui_url_constants.h" -#include "chrome/grit/browser_resources.h" +#include "chrome/grit/browser_switch_resources.h" +#include "chrome/grit/browser_switch_resources_map.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/grit/components_resources.h" @@ -133,19 +135,16 @@ IDS_ABOUT_BROWSER_SWITCH_PROTOCOL_ERROR); source->AddLocalizedString("title", IDS_ABOUT_BROWSER_SWITCH_TITLE); - source->AddResourcePath("app.js", IDR_BROWSER_SWITCH_APP_JS); - source->AddResourcePath("browser_switch.html", IDR_BROWSER_SWITCH_HTML); - source->AddResourcePath("browser_switch_proxy.js", - IDR_BROWSER_SWITCH_PROXY_JS); - source->SetDefaultResource(IDR_BROWSER_SWITCH_HTML); + webui::SetupWebUIDataSource( + source, + base::make_span(kBrowserSwitchResources, kBrowserSwitchResourcesSize), + IDR_BROWSER_SWITCH_BROWSER_SWITCH_HTML); // Setup chrome://browser-switch/internals debug UI. - source->AddResourcePath("internals/browser_switch_internals.js", - IDR_BROWSER_SWITCH_INTERNALS_JS); - source->AddResourcePath("internals/browser_switch_internals.html", - IDR_BROWSER_SWITCH_INTERNALS_HTML); - source->AddResourcePath("internals/", IDR_BROWSER_SWITCH_INTERNALS_HTML); - source->AddResourcePath("internals", IDR_BROWSER_SWITCH_INTERNALS_HTML); + source->AddResourcePath( + "internals/", IDR_BROWSER_SWITCH_INTERNALS_BROWSER_SWITCH_INTERNALS_HTML); + source->AddResourcePath( + "internals", IDR_BROWSER_SWITCH_INTERNALS_BROWSER_SWITCH_INTERNALS_HTML); source->UseStringsJs();
diff --git a/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.cc index dff80a96..06ac96e 100644 --- a/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.cc
@@ -14,6 +14,16 @@ namespace chromeos { +namespace { +constexpr const char kShowConfirmStep[] = + "login.OsInstallScreen.showConfirmStep"; +constexpr const char kShowInProgressStep[] = + "login.OsInstallScreen.showInProgressStep"; +constexpr const char kShowErrorStep[] = "login.OsInstallScreen.showErrorStep"; +constexpr const char kShowSuccessStep[] = + "login.OsInstallScreen.showSuccessStep"; +} // namespace + // static constexpr StaticOobeScreenId OsInstallScreenView::kScreenId; @@ -24,6 +34,7 @@ } OsInstallScreenHandler::~OsInstallScreenHandler() { + OsInstallClient::Get()->RemoveObserver(this); if (screen_) screen_->OnViewDestroyed(this); } @@ -69,11 +80,43 @@ } void OsInstallScreenHandler::ShowConfirmStep() { - CallJS("login.OsInstallScreen.showConfirmStep"); + CallJS(kShowConfirmStep); } void OsInstallScreenHandler::StartInstall() { - CallJS("login.OsInstallScreen.showInProgressStep"); + CallJS(kShowInProgressStep); + + OsInstallClient* const os_install_client = OsInstallClient::Get(); + + os_install_client->AddObserver(this); + os_install_client->StartOsInstall(); +} + +void OsInstallScreenHandler::StatusChanged(OsInstallClient::Status status, + const std::string& service_log) { + switch (status) { + case OsInstallClient::Status::InProgress: + CallJS(kShowInProgressStep); + break; + + case OsInstallClient::Status::Succeeded: + CallJS(kShowSuccessStep); + break; + + case OsInstallClient::Status::Failed: + case OsInstallClient::Status::NoDestinationDeviceFound: + CallJS(kShowErrorStep); + break; + } +} + +void OsInstallScreenHandler::OsInstallStarted( + absl::optional<OsInstallClient::Status> status) { + if (!status) { + status = OsInstallClient::Status::Failed; + } + + StatusChanged(*status, /*service_log=*/""); } } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.h index 3734ea56..76ed8b9 100644 --- a/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.h
@@ -6,6 +6,8 @@ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_OS_INSTALL_SCREEN_HANDLER_H_ #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" +#include "chromeos/dbus/os_install/os_install_client.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace login { class LocalizedValuesBuilder; @@ -38,7 +40,8 @@ }; class OsInstallScreenHandler : public BaseScreenHandler, - public OsInstallScreenView { + public OsInstallScreenView, + public OsInstallClient::Observer { public: using TView = OsInstallScreenView; @@ -60,7 +63,15 @@ void ShowConfirmStep() override; void StartInstall() override; + // OsInstallClient::Observer: + void StatusChanged(OsInstallClient::Status status, + const std::string& service_log) override; + + void OsInstallStarted(absl::optional<OsInstallClient::Status> status); + OsInstallScreen* screen_ = nullptr; + + base::WeakPtrFactory<OsInstallScreenHandler> weak_factory_{this}; }; } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.cc b/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.cc index 597174a..faf1b39 100644 --- a/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.cc +++ b/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.cc
@@ -30,6 +30,9 @@ constexpr gfx::Size kPreferredSize(2 * kCornerRadiusDip, 2 * kCornerRadiusDip); +// Margin of the bubble with respect to the context window. +constexpr int kMinAnchorMarginDip = 40; + // Makes the selfie cam draggable. class SelfieCamBubbleFrameView : public views::BubbleFrameView { public: @@ -71,30 +74,31 @@ class SelfieCamBubbleDialogView : public WebUIBubbleDialogView { public: SelfieCamBubbleDialogView( - std::unique_ptr<BubbleContentsWrapper> contents_wrapper) + std::unique_ptr<BubbleContentsWrapper> contents_wrapper, + const gfx::Rect& context_bounds_in_screen) : WebUIBubbleDialogView(/*anchor_view=*/nullptr, contents_wrapper.get()), - contents_wrapper_(std::move(contents_wrapper)) { + contents_wrapper_(std::move(contents_wrapper)), + context_bounds_in_screen_(context_bounds_in_screen) { set_has_parent(false); set_close_on_deactivate(false); } ~SelfieCamBubbleDialogView() override = default; // views::BubbleDialogDelegateView: - // Opens the selfie cam in the middle of the screen initially. - // TODO(crbug/1199396): Consider if the selfie cam should appear somewhere - // else by default initially, such as the bottom right of the screen. + // Opens the selfie cam in the bottom-right of the `context_bounds_in_screen_` + // rectangle initially. gfx::Rect GetBubbleBounds() override { // Bubble bounds are what the computed bubble bounds would be, taking into // account the current bubble size. gfx::Rect bubble_bounds = views::BubbleDialogDelegateView::GetBubbleBounds(); - // Widget bounds are where the bubble currently is in space. - gfx::Rect widget_bounds = GetWidget()->GetWindowBoundsInScreen(); - // Use the widget x and y to keep the bubble oriented at its current - // location, and use the bubble width and height to set the correct bubble - // size. - return gfx::Rect(widget_bounds.x(), widget_bounds.y(), - bubble_bounds.width(), bubble_bounds.height()); + + gfx::Rect context_rect = context_bounds_in_screen_; + context_rect.Inset(gfx::Insets(kMinAnchorMarginDip)); + int target_x = context_rect.right() - bubble_bounds.width(); + int target_y = context_rect.bottom() - bubble_bounds.height(); + return gfx::Rect(target_x, target_y, bubble_bounds.width(), + bubble_bounds.height()); } // views::BubbleDialogDelegateView: @@ -125,6 +129,7 @@ private: std::unique_ptr<BubbleContentsWrapper> contents_wrapper_; + const gfx::Rect context_bounds_in_screen_; }; // Renders the WebUI contents and asks for camera permission so that @@ -161,7 +166,8 @@ SelfieCamBubbleManager::SelfieCamBubbleManager() = default; SelfieCamBubbleManager::~SelfieCamBubbleManager() = default; -void SelfieCamBubbleManager::Show(Profile* profile) { +void SelfieCamBubbleManager::Show(Profile* profile, + const gfx::Rect& context_bounds_in_screen) { if (IsVisible()) return; @@ -173,8 +179,8 @@ // eventually call ShowUI(). contents_wrapper->ReloadWebContents(); - auto bubble_view = - std::make_unique<SelfieCamBubbleDialogView>(std::move(contents_wrapper)); + auto bubble_view = std::make_unique<SelfieCamBubbleDialogView>( + std::move(contents_wrapper), context_bounds_in_screen); bubble_view_ = bubble_view->GetWeakPtr(); auto* bubble_widget =
diff --git a/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.h b/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.h index 9e7852d6..ee70c2f 100644 --- a/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.h +++ b/chrome/browser/ui/webui/chromeos/projector/selfie_cam_bubble_manager.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_PROJECTOR_SELFIE_CAM_BUBBLE_MANAGER_H_ #include "base/memory/weak_ptr.h" +#include "ui/gfx/geometry/rect.h" class Profile; class WebUIBubbleDialogView; @@ -20,7 +21,7 @@ SelfieCamBubbleManager& operator=(const SelfieCamBubbleManager&) = delete; ~SelfieCamBubbleManager(); - void Show(Profile* profile); + void Show(Profile* profile, const gfx::Rect& context_bounds_in_screen); void Close(); bool IsVisible() const;
diff --git a/chrome/browser/ui/webui/favicon_source_unittest.cc b/chrome/browser/ui/webui/favicon_source_unittest.cc index cb90489..8462a95a 100644 --- a/chrome/browser/ui/webui/favicon_source_unittest.cc +++ b/chrome/browser/ui/webui/favicon_source_unittest.cc
@@ -36,6 +36,7 @@ using GotDataCallback = content::URLDataSource::GotDataCallback; using WebContentsGetter = content::WebContents::Getter; using testing::_; +using testing::NiceMock; using testing::Return; using testing::ReturnArg; @@ -99,19 +100,19 @@ history_ui_favicon_request_handler_factory = base::BindRepeating([](content::BrowserContext*) { return base::WrapUnique<KeyedService>( - new MockHistoryUiFaviconRequestHandler()); + new NiceMock<MockHistoryUiFaviconRequestHandler>()); }); mock_history_ui_favicon_request_handler_ = - static_cast<MockHistoryUiFaviconRequestHandler*>( + static_cast<NiceMock<MockHistoryUiFaviconRequestHandler>*>( HistoryUiFaviconRequestHandlerFactory::GetInstance() ->SetTestingFactoryAndUse( &profile_, history_ui_favicon_request_handler_factory)); BrowserContextKeyedServiceFactory::TestingFactory favicon_service_factory = base::BindRepeating([](content::BrowserContext*) { return static_cast<std::unique_ptr<KeyedService>>( - std::make_unique<favicon::MockFaviconService>()); + std::make_unique<NiceMock<favicon::MockFaviconService>>()); }); - mock_favicon_service_ = static_cast<favicon::MockFaviconService*>( + mock_favicon_service_ = static_cast<NiceMock<favicon::MockFaviconService>*>( FaviconServiceFactory::GetInstance()->SetTestingFactoryAndUse( &profile_, favicon_service_factory)); @@ -144,7 +145,7 @@ void SetDarkMode(bool dark_mode) { theme_.SetDarkMode(dark_mode); } - TestFaviconSource* source() { return &source_; } + NiceMock<TestFaviconSource>* source() { return &source_; } protected: const scoped_refptr<base::RefCountedBytes> kDummyIconBytes; @@ -152,11 +153,12 @@ content::RenderViewHostTestEnabler test_render_host_factories_; ui::TestNativeTheme theme_; TestingProfile profile_; - MockHistoryUiFaviconRequestHandler* mock_history_ui_favicon_request_handler_; - favicon::MockFaviconService* mock_favicon_service_; + NiceMock<MockHistoryUiFaviconRequestHandler>* + mock_history_ui_favicon_request_handler_; + NiceMock<favicon::MockFaviconService>* mock_favicon_service_; std::unique_ptr<content::WebContents> test_web_contents_; WebContentsGetter test_web_contents_getter_; - TestFaviconSource source_; + NiceMock<TestFaviconSource> source_; }; class FaviconSourceTestWithLegacyFormat : public FaviconSourceTestBase {
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc index 4b80af8..96a9870 100644 --- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc +++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -277,10 +277,8 @@ VLOG(1) << "Getting printer capabilities via service for " << device_name; PrintBackendServiceManager& service_mgr = PrintBackendServiceManager::GetInstance(); - auto& service = service_mgr.GetService( - g_browser_process->GetApplicationLocale(), device_name); - service->FetchCapabilities( - device_name, + service_mgr.FetchCapabilities( + g_browser_process->GetApplicationLocale(), device_name, base::BindOnce( &OnDidFetchCapabilities, device_name, service_mgr.PrinterDriverRequiresElevatedPrivilege(device_name),
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc index d9dad33..12ae33a 100644 --- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default_unittest.cc
@@ -331,6 +331,35 @@ EXPECT_FALSE(printers); } +// Tests that enumerating printers fails when there is invalid printer data. +TEST_F(LocalPrinterHandlerDefaultTestService, + GetPrintersInvalidPrinterDataFails) { + AddPrinter("printer1", "default1", "description1", /*is_default=*/true, + /*requires_elevated_permissions=*/false); + AddInvalidDataPrinter("printer2"); + + size_t call_count = 0; + std::unique_ptr<base::ListValue> printers; + bool is_done = false; + + local_printer_handler()->StartGetPrinters( + base::BindRepeating(&RecordPrinterList, std::ref(call_count), + std::ref(printers)), + base::BindOnce(&RecordPrintersDone, std::ref(is_done))); + + RunUntilIdle(); + + // Invalid data in even one printer causes entire list to be dropped. + // TODO(crbug.com/1214139) Invalid data causes the Mojom message to fail + // validation and thus be dropped, resulting in no callback for + // `EnumeratePrinters()` being made. Testing infrastructure automatically + // recovers so control returns here, with `printers` unchanged. + // This test should be updated to show that there were no printers + // provided once service disconnects are better handled and a proper callback + // occurs. + EXPECT_FALSE(is_done); +} + // Tests that fetching capabilities for an existing installed printer is // successful. TEST_P(LocalPrinterHandlerDefaultTestProcess, StartGetCapabilityValidPrinter) { @@ -415,14 +444,7 @@ RunUntilIdle(); - // TODO(crbug.com/1214139) Invalid data causes the Mojom message to fail - // validation and thus be dropped, resulting in no callback for - // `FetchCapabilities()` being made. Testing infrastructure automatically - // recovers so control returns here, with `fetch_capped` unchanged. - // This test should be updated to show that there were no capabilities - // provided once service disconnects are better handled and a proper callback - // occurs. - EXPECT_EQ(fetched_caps.GetString(), "dummy"); + EXPECT_TRUE(fetched_caps.is_none()); } } // namespace printing
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc index 621be4d..7d038201 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_handler.cc
@@ -387,6 +387,12 @@ bool TabStripUIHandler::PreHandleGestureEvent( content::WebContents* source, const blink::WebGestureEvent& event) { + // Apply special case gesture handling only for gesture touch events + // (See crbug.com/1204572). + if (event.primary_pointer_type != + blink::WebPointerProperties::PointerType::kTouch) { + return false; + } switch (event.GetType()) { case blink::WebInputEvent::Type::kGestureScrollBegin: // Drag and drop for the WebUI tab strip is currently only supported for
diff --git a/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc b/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc index a09506ea..68ddc32 100644 --- a/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc +++ b/chrome/browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc
@@ -8,6 +8,7 @@ #include <string> #include <utility> +#include "base/environment.h" #include "base/macros.h" #include "base/test/task_environment.h" #include "base/time/clock.h" @@ -24,6 +25,7 @@ #include "components/prefs/testing_pref_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace { @@ -67,7 +69,8 @@ protected: UpgradeDetectorChromeosTest() : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - scoped_local_state_(TestingBrowserProcess::GetGlobal()) { + scoped_local_state_(TestingBrowserProcess::GetGlobal()), + env_(base::Environment::Create()) { // By default, test with the relaunch policy enabled. SetIsRelaunchNotificationPolicyEnabled(true /* enabled */); @@ -86,19 +89,20 @@ // Fast forward to set current time to local 2am . This is done to align the // relaunch deadline within the default relaunch window of 2am to 4am so // that it is not adjusted in tests. - const char* tz = getenv("TZ"); - if (tz) - old_tz_ = tz; - setenv("TZ", "UTC", 1); + std::string env_tz; + if (env_->GetVar("TZ", &env_tz)) + original_tz_ = env_tz; + env_->SetVar("TZ", "UTC"); tzset(); FastForwardBy(base::TimeDelta::FromHours(2)); } ~UpgradeDetectorChromeosTest() override { - if (!old_tz_.empty()) { - setenv("TZ", old_tz_.c_str(), 1); + // Revert back to the original timezone. + if (original_tz_) { + env_->SetVar("TZ", original_tz_.value()); } else { - unsetenv("TZ"); + env_->UnSetVar("TZ"); } tzset(); @@ -177,7 +181,8 @@ private: base::test::TaskEnvironment task_environment_; ScopedTestingLocalState scoped_local_state_; - std::string old_tz_; + std::unique_ptr<base::Environment> env_; + absl::optional<std::string> original_tz_; chromeos::FakeUpdateEngineClient* fake_update_engine_client_; // Not owned.
diff --git a/chrome/browser/upgrade_detector/upgrade_detector_unittest.cc b/chrome/browser/upgrade_detector/upgrade_detector_unittest.cc index 5567424..1265b1eb 100644 --- a/chrome/browser/upgrade_detector/upgrade_detector_unittest.cc +++ b/chrome/browser/upgrade_detector/upgrade_detector_unittest.cc
@@ -2,13 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <stdlib.h> -#include <time.h> - #include <memory> #include <string> #include <utility> +#include "base/environment.h" #include "base/test/task_environment.h" #include "base/time/clock.h" #include "base/time/tick_clock.h" @@ -20,6 +18,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace { @@ -61,24 +60,28 @@ if (!tz_overridden_) return; - if (!old_tz_.empty()) { - setenv("TZ", old_tz_.c_str(), 1); + // Revert back to the original timezone. + DCHECK(env_); + if (original_tz_) { + env_->SetVar("TZ", original_tz_.value()); } else { - unsetenv("TZ"); + env_->UnSetVar("TZ"); } tzset(); } void OverrideTimezone(const std::string& tz) { if (!tz_overridden_) { + env_ = base::Environment::Create(); // Store the original timezone of the device so that it can be restored in // the destructor at the end of the test. - const char* tz = getenv("TZ"); - if (tz) - old_tz_ = tz; + std::string env_tz; + if (env_->GetVar("TZ", &env_tz)) + original_tz_ = env_tz; tz_overridden_ = true; } - setenv("TZ", tz.c_str(), 1); + DCHECK(env_); + env_->SetVar("TZ", tz); tzset(); } #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) @@ -108,7 +111,8 @@ base::test::TaskEnvironment task_environment_; ScopedTestingLocalState scoped_local_state_; #if defined(OS_LINUX) || defined(OS_CHROMEOS) - std::string old_tz_; + std::unique_ptr<base::Environment> env_; + absl::optional<std::string> original_tz_; bool tz_overridden_ = false; #endif // defined(OS_LINUX) || defined(OS_CHROMEOS) };
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h index 7fea3b2..962019f 100644 --- a/chrome/browser/web_applications/components/app_registrar.h +++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -50,6 +50,13 @@ // used in other registrar methods. virtual bool IsInstalled(const AppId& app_id) const = 0; + // Returns whether the app is currently being uninstalled. This will be true + // after uninstall has begun but before the OS integration hooks for uninstall + // have completed. It will return false after uninstallation has completed. + // Note that the underlying field this checks is not yet persisted to the + // database; see https://crbug.com/1162477 + virtual bool IsUninstalling(const AppId& app_id) const = 0; + // Returns whether the app with |app_id| is currently fully locally installed. // ie. app is not grey in chrome://apps UI surface and may have OS integration // like shortcuts. |IsLocallyInstalled| apps is a subset of |IsInstalled|
diff --git a/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc index 44b44b3..1bbab63 100644 --- a/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc +++ b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc
@@ -173,13 +173,14 @@ // is needed. Uninstalling already cleans up shortcuts (and thus, file // handlers). auto* provider = WebAppProviderBase::GetProviderBase(profile); - if (!provider->registrar().IsInstalled(app_id)) { - std::move(callback).Run(false); + DCHECK(provider->registrar().IsInstalled(app_id)); + if (provider->registrar().IsUninstalling(app_id)) { + std::move(callback).Run(true); return; } - // TODO(crbug.com/1076688): Fix file handlers unregistration. We can't update - // registration here asynchronously because app_id is being uninstalled. + // Otherwise, simply update the .desktop file with the new list of file + // associations, which should be empty. UpdateFileHandlerRegistrationInOs(app_id, profile, std::move(info), std::move(callback)); }
diff --git a/chrome/browser/web_applications/test/test_app_registrar.cc b/chrome/browser/web_applications/test/test_app_registrar.cc index 059e1242..e4aa19d0 100644 --- a/chrome/browser/web_applications/test/test_app_registrar.cc +++ b/chrome/browser/web_applications/test/test_app_registrar.cc
@@ -36,6 +36,11 @@ return base::Contains(installed_apps_, app_id); } +bool TestAppRegistrar::IsUninstalling(const AppId& app_id) const { + NOTIMPLEMENTED(); + return false; +} + bool TestAppRegistrar::IsLocallyInstalled(const AppId& app_id) const { NOTIMPLEMENTED(); return false;
diff --git a/chrome/browser/web_applications/test/test_app_registrar.h b/chrome/browser/web_applications/test/test_app_registrar.h index 7b29e73..6bc3cec 100644 --- a/chrome/browser/web_applications/test/test_app_registrar.h +++ b/chrome/browser/web_applications/test/test_app_registrar.h
@@ -45,6 +45,7 @@ // AppRegistrar bool IsInstalled(const AppId& app_id) const override; + bool IsUninstalling(const AppId& app_id) const override; bool IsLocallyInstalled(const AppId& app_id) const override; bool WasInstalledByUser(const AppId& app_id) const override; bool WasInstalledByOem(const AppId& app_id) const override;
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc index aad7693..bbf5446 100644 --- a/chrome/browser/web_applications/web_app.cc +++ b/chrome/browser/web_applications/web_app.cc
@@ -413,6 +413,8 @@ out << "is_in_sync_install: " << app.is_in_sync_install_ << std::endl; + out << "is_uninstalling: " << app.is_uninstalling_ << std::endl; + out << "sync_fallback_data:" << std::endl << Indent(app.sync_fallback_data_) << std::endl; @@ -553,6 +555,7 @@ app.chromeos_data_, app.is_locally_installed_, app.is_in_sync_install_, + app.is_uninstalling_, app.icon_infos_, app.downloaded_icon_sizes_any_, app.downloaded_icon_sizes_monochrome_,
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h index 5a3e9aa2..9d8e66e 100644 --- a/chrome/browser/web_applications/web_app.h +++ b/chrome/browser/web_applications/web_app.h
@@ -299,9 +299,9 @@ bool is_locally_installed_ = true; bool is_in_sync_install_ = false; // Note: This field is not persisted in the database. - // TODO: Add this field to the protocol buffer file and other places to - // save it to the database, and then make sure to continue uninstallation - // on startup if any web apps have this field set to true. + // TODO(crbug.com/1162477): Add this field to the protocol buffer file and + // other places to save it to the database, and then make sure to continue + // uninstallation on startup if any web apps have this field set to true. bool is_uninstalling_ = false; std::vector<WebApplicationIconInfo> icon_infos_; SortedSizesPx downloaded_icon_sizes_any_;
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.cc b/chrome/browser/web_applications/web_app_install_finalizer.cc index 9b9acd5..7d4f77b 100644 --- a/chrome/browser/web_applications/web_app_install_finalizer.cc +++ b/chrome/browser/web_applications/web_app_install_finalizer.cc
@@ -452,16 +452,18 @@ webapps::WebappUninstallSource uninstall_source, UninstallWebAppCallback callback) { // If the app is already uninstalling then avoid triggering another uninstall. - ScopedRegistryUpdate update(registry_controller().AsWebAppSyncBridge()); - WebApp* app = update->UpdateApp(app_id); - if (!app || app->is_uninstalling()) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), - /*uninstalled=*/false)); - return; + { + ScopedRegistryUpdate update(registry_controller().AsWebAppSyncBridge()); + WebApp* app = update->UpdateApp(app_id); + if (!app || app->is_uninstalling()) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), + /*uninstalled=*/false)); + return; + } + // Set uninstalling flag and continue with app uninstall. + app->SetIsUninstalling(true); } - // Set uninstalling flag and continue with app uninstall. - app->SetIsUninstalling(true); registrar().NotifyWebAppWillBeUninstalled(app_id); os_integration_manager().UninstallAllOsHooks( app_id, base::BindOnce(&WebAppInstallFinalizer::OnUninstallOsHooks,
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc index 38d053a..96183b95 100644 --- a/chrome/browser/web_applications/web_app_registrar.cc +++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -74,6 +74,11 @@ return web_app && !web_app->is_in_sync_install(); } +bool WebAppRegistrar::IsUninstalling(const AppId& app_id) const { + const WebApp* web_app = GetAppById(app_id); + return web_app && web_app->is_uninstalling(); +} + bool WebAppRegistrar::IsLocallyInstalled(const AppId& app_id) const { auto* web_app = GetAppById(app_id); return web_app ? web_app->is_locally_installed() : false;
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h index 569bb20..ef4a8ba370 100644 --- a/chrome/browser/web_applications/web_app_registrar.h +++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -50,6 +50,7 @@ void Start() override; void Shutdown() override; bool IsInstalled(const AppId& app_id) const override; + bool IsUninstalling(const AppId& app_id) const override; bool IsLocallyInstalled(const AppId& app_id) const override; bool WasInstalledByUser(const AppId& app_id) const override; bool WasInstalledByOem(const AppId& app_id) const override;
diff --git a/chrome/browser/web_applications/web_app_unittest.cc b/chrome/browser/web_applications/web_app_unittest.cc index eb05513..5af93de 100644 --- a/chrome/browser/web_applications/web_app_unittest.cc +++ b/chrome/browser/web_applications/web_app_unittest.cc
@@ -173,6 +173,7 @@ sources: is_locally_installed: 1 is_in_sync_install: 0 +is_uninstalling: 0 sync_fallback_data: name: theme_color: none @@ -232,6 +233,7 @@ sources: WebAppStore Sync Default is_locally_installed: 1 is_in_sync_install: 0 +is_uninstalling: 0 sync_fallback_data: name: SyncName1234 theme_color: rgba(61,127,69,0.8431372549019608)
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedNetworkRequestReliabilityLogger.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedNetworkRequestReliabilityLogger.java index 77b930c..c61c918e 100644 --- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedNetworkRequestReliabilityLogger.java +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/FeedNetworkRequestReliabilityLogger.java
@@ -27,18 +27,12 @@ default void logResponseReceived( long serverRecvTimestamp, long serverSendTimestamp, long clientRecvTimestamp) {} - /** Special network request status: see {@link #logRequestFinished}. */ - static final int NO_STATUS = 0; - /** * Log after logResponseReceived() if there's a network error, or after parsing the response * otherwise. * @param timestamp Event time. - * @param cronetStatusCode Network error code from - * components/cronet/android/api/src/org/chromium/net/NetworkException.java. Pass {@link - * #NO_STATUS} if there's no error. - * @param httpStatusCode HTTP status code. If there is no HTTP status code because there was a - * network error, pass {@link #NO_STATUS}. + * @param canonicalStatus Network request status code. See + * //third_party/abseil-cpp/absl/status/status.h. */ - default void logRequestFinished(long timestamp, int cronetStatusCode, int httpStatusCode) {} + default void logRequestFinished(long timestamp, int canonicalStatus) {} } \ No newline at end of file
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index bb33fad1..2a34b4f 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1623390844-a24eb8cd49d560b38156cc73bff3cd3e9ef6058d.profdata +chrome-win64-master-1623639505-d3692e022345f534dd36958f1b4acc41b0a31ba0.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 228a8565..2de838e 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -291,6 +291,12 @@ "//chrome/browser/resources/welcome:resources", ] } + + if (is_win || is_mac || is_linux || is_chromeos_lacros) { + sources += [ "$root_gen_dir/chrome/browser_switch_resources.pak" ] + deps += [ "//chrome/browser/resources/browser_switch:resources" ] + } + if (enable_extensions) { sources += [ "$root_gen_dir/chrome/extensions_resources.pak",
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 9897bdb..451231d 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -395,7 +395,7 @@ } if (is_win) { sources += [ - "chrome_utility_printing_messages.h", + "chrome_utility_printing_param_traits_macros.h", "service_process_util_win.cc", ] @@ -793,3 +793,25 @@ sources = [ "offline_page_auto_fetcher.mojom" ] public_deps = [ "//url/mojom:url_mojom_gurl" ] } + +if (enable_basic_printing && is_win) { + mojom("cloud_print_utility_mojom") { + sources = [ "cloud_print_utility.mojom" ] + cpp_typemaps = [ + { + types = [ + { + mojom = "chrome.mojom.PrinterCapsAndDefaults" + cpp = "::printing::PrinterCapsAndDefaults" + }, + { + mojom = "chrome.mojom.PrinterSemanticCapsAndDefaults" + cpp = "::printing::PrinterSemanticCapsAndDefaults" + }, + ] + traits_headers = [ "chrome_utility_printing_param_traits_macros.h" ] + traits_public_deps = [ ":common" ] + }, + ] + } +}
diff --git a/chrome/common/chrome_utility_printing_messages.h b/chrome/common/chrome_utility_printing_messages.h deleted file mode 100644 index 19e287c..0000000 --- a/chrome/common/chrome_utility_printing_messages.h +++ /dev/null
@@ -1,105 +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 CHROME_COMMON_CHROME_UTILITY_PRINTING_MESSAGES_H_ -#define CHROME_COMMON_CHROME_UTILITY_PRINTING_MESSAGES_H_ - -#include <string> - -#include "build/build_config.h" -#include "ipc/ipc_message_macros.h" -#include "ipc/ipc_message_start.h" -#include "ipc/ipc_param_traits.h" -#include "printing/backend/print_backend.h" -#include "printing/buildflags/buildflags.h" -#include "printing/mojom/print.mojom.h" - -#define IPC_MESSAGE_START ChromeUtilityPrintingMsgStart - -#if defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) -// Preview and Cloud Print messages. -IPC_STRUCT_TRAITS_BEGIN(printing::PrinterCapsAndDefaults) - IPC_STRUCT_TRAITS_MEMBER(printer_capabilities) - IPC_STRUCT_TRAITS_MEMBER(caps_mime_type) - IPC_STRUCT_TRAITS_MEMBER(printer_defaults) - IPC_STRUCT_TRAITS_MEMBER(defaults_mime_type) -IPC_STRUCT_TRAITS_END() - -IPC_ENUM_TRAITS_MAX_VALUE(printing::mojom::ColorModel, - printing::mojom::ColorModel::kColorModelLast) - -IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults::Paper) - IPC_STRUCT_TRAITS_MEMBER(display_name) - IPC_STRUCT_TRAITS_MEMBER(vendor_id) - IPC_STRUCT_TRAITS_MEMBER(size_um) -IPC_STRUCT_TRAITS_END() - -IPC_ENUM_TRAITS_MIN_MAX_VALUE(printing::mojom::DuplexMode, - printing::mojom::DuplexMode::kUnknownDuplexMode, - printing::mojom::DuplexMode::kShortEdge) - -IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults) - IPC_STRUCT_TRAITS_MEMBER(collate_capable) - IPC_STRUCT_TRAITS_MEMBER(collate_default) - IPC_STRUCT_TRAITS_MEMBER(copies_max) - IPC_STRUCT_TRAITS_MEMBER(duplex_modes) - IPC_STRUCT_TRAITS_MEMBER(duplex_default) - IPC_STRUCT_TRAITS_MEMBER(color_changeable) - IPC_STRUCT_TRAITS_MEMBER(color_default) - IPC_STRUCT_TRAITS_MEMBER(color_model) - IPC_STRUCT_TRAITS_MEMBER(bw_model) - IPC_STRUCT_TRAITS_MEMBER(papers) - IPC_STRUCT_TRAITS_MEMBER(default_paper) - IPC_STRUCT_TRAITS_MEMBER(dpis) - IPC_STRUCT_TRAITS_MEMBER(default_dpi) -IPC_STRUCT_TRAITS_END() - -//------------------------------------------------------------------------------ -// Utility process messages: -// These are messages from the browser to the utility process. - -// Tells the utility process to get capabilities and defaults for the specified -// printer. Used on Windows to isolate the service process from printer driver -// crashes by executing this in a separate process. This does not run in a -// sandbox. -IPC_MESSAGE_CONTROL1(ChromeUtilityMsg_GetPrinterCapsAndDefaults, - std::string /* printer name */) - -// Tells the utility process to get capabilities and defaults for the specified -// printer. Used on Windows to isolate the service process from printer driver -// crashes by executing this in a separate process. This does not run in a -// sandbox. Returns result as printing::PrinterSemanticCapsAndDefaults. -IPC_MESSAGE_CONTROL1(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults, - std::string /* printer name */) - -//------------------------------------------------------------------------------ -// Utility process host messages: -// These are messages from the utility process to the browser. - -// Reply when the utility process has succeeded in obtaining the printer -// capabilities and defaults. -IPC_MESSAGE_CONTROL2(ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded, - std::string /* printer name */, - printing::PrinterCapsAndDefaults) - -// Reply when the utility process has succeeded in obtaining the printer -// semantic capabilities and defaults. -IPC_MESSAGE_CONTROL2( - ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded, - std::string /* printer name */, - printing::PrinterSemanticCapsAndDefaults) - -// Reply when the utility process has failed to obtain the printer -// capabilities and defaults. -IPC_MESSAGE_CONTROL1(ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed, - std::string /* printer name */) - -// Reply when the utility process has failed to obtain the printer -// semantic capabilities and defaults. -IPC_MESSAGE_CONTROL1( - ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed, - std::string /* printer name */) -#endif // defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) - -#endif // CHROME_COMMON_CHROME_UTILITY_PRINTING_MESSAGES_H_
diff --git a/chrome/common/chrome_utility_printing_param_traits_macros.h b/chrome/common/chrome_utility_printing_param_traits_macros.h new file mode 100644 index 0000000..27000010 --- /dev/null +++ b/chrome/common/chrome_utility_printing_param_traits_macros.h
@@ -0,0 +1,56 @@ +// 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 CHROME_COMMON_CHROME_UTILITY_PRINTING_PARAM_TRAITS_MACROS_H_ +#define CHROME_COMMON_CHROME_UTILITY_PRINTING_PARAM_TRAITS_MACROS_H_ + +#include "build/build_config.h" +#include "ipc/ipc_message_macros.h" +#include "ipc/ipc_message_start.h" +#include "ipc/ipc_param_traits.h" +#include "printing/backend/print_backend.h" +#include "printing/buildflags/buildflags.h" +#include "printing/mojom/print.mojom.h" + +#if defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) +// Preview and Cloud Print messages. +IPC_STRUCT_TRAITS_BEGIN(printing::PrinterCapsAndDefaults) + IPC_STRUCT_TRAITS_MEMBER(printer_capabilities) + IPC_STRUCT_TRAITS_MEMBER(caps_mime_type) + IPC_STRUCT_TRAITS_MEMBER(printer_defaults) + IPC_STRUCT_TRAITS_MEMBER(defaults_mime_type) +IPC_STRUCT_TRAITS_END() + +IPC_ENUM_TRAITS_MAX_VALUE(printing::mojom::ColorModel, + printing::mojom::ColorModel::kColorModelLast) + +IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults::Paper) + IPC_STRUCT_TRAITS_MEMBER(display_name) + IPC_STRUCT_TRAITS_MEMBER(vendor_id) + IPC_STRUCT_TRAITS_MEMBER(size_um) +IPC_STRUCT_TRAITS_END() + +IPC_ENUM_TRAITS_MIN_MAX_VALUE(printing::mojom::DuplexMode, + printing::mojom::DuplexMode::kUnknownDuplexMode, + printing::mojom::DuplexMode::kShortEdge) + +IPC_STRUCT_TRAITS_BEGIN(printing::PrinterSemanticCapsAndDefaults) + IPC_STRUCT_TRAITS_MEMBER(collate_capable) + IPC_STRUCT_TRAITS_MEMBER(collate_default) + IPC_STRUCT_TRAITS_MEMBER(copies_max) + IPC_STRUCT_TRAITS_MEMBER(duplex_modes) + IPC_STRUCT_TRAITS_MEMBER(duplex_default) + IPC_STRUCT_TRAITS_MEMBER(color_changeable) + IPC_STRUCT_TRAITS_MEMBER(color_default) + IPC_STRUCT_TRAITS_MEMBER(color_model) + IPC_STRUCT_TRAITS_MEMBER(bw_model) + IPC_STRUCT_TRAITS_MEMBER(papers) + IPC_STRUCT_TRAITS_MEMBER(default_paper) + IPC_STRUCT_TRAITS_MEMBER(dpis) + IPC_STRUCT_TRAITS_MEMBER(default_dpi) +IPC_STRUCT_TRAITS_END() + +#endif // defined(OS_WIN) && BUILDFLAG(ENABLE_PRINT_PREVIEW) + +#endif // CHROME_COMMON_CHROME_UTILITY_PRINTING_PARAM_TRAITS_MACROS_H_
diff --git a/chrome/common/cloud_print_utility.mojom b/chrome/common/cloud_print_utility.mojom new file mode 100644 index 0000000..0b898db --- /dev/null +++ b/chrome/common/cloud_print_utility.mojom
@@ -0,0 +1,29 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module chrome.mojom; + +// Interface implemented by the unsandboxed Cloud Print utility process (see +// src/chrome/utility/printing_handler.cc) and called by the Cloud Print service +// process, which is a special Windows service process run by the deprecated +// Cloud Print Connector tool. The purpose of the utility process is to isolate +// printer driver crashes from the service process. +interface CloudPrintUtility { + // Retrieves capabilities and defaults for the specified printer. Returns null + // on failure. + GetPrinterCapsAndDefaults(string printer_name) + => (PrinterCapsAndDefaults? caps_and_defaults); + + // Retrieves capabilities and defaults for the specified printer. Returns null + // on failure. + GetPrinterSemanticCapsAndDefaults(string printer_name) + => (PrinterSemanticCapsAndDefaults? caps_and_defaults); +}; + +[Native] +struct PrinterCapsAndDefaults; + +[Native] +struct PrinterSemanticCapsAndDefaults; +
diff --git a/chrome/common/common_message_generator.h b/chrome/common/common_message_generator.h index ab5b91a..286981c 100644 --- a/chrome/common/common_message_generator.h +++ b/chrome/common/common_message_generator.h
@@ -14,11 +14,11 @@ #include "printing/buildflags/buildflags.h" #if BUILDFLAG(ENABLE_PRINTING) -#undef CHROME_COMMON_CHROME_UTILITY_PRINTING_MESSAGES_H_ -#include "chrome/common/chrome_utility_printing_messages.h" -#ifndef CHROME_COMMON_CHROME_UTILITY_PRINTING_MESSAGES_H_ +#undef CHROME_COMMON_CHROME_UTILITY_PRINTING_PARAM_TRAITS_MACROS_H_ +#include "chrome/common/chrome_utility_printing_param_traits_macros.h" +#ifndef CHROME_COMMON_CHROME_UTILITY_PRINTING_PARAM_TRAITS_MACROS_H_ #error \ - "Failed to include header chrome/common/chrome_utility_printing_messages.h" + "Failed to include header chrome/common/chrome_utility_printing_param_traits_macros.h" #endif #endif
diff --git a/chrome/common/extensions/api/debugger.json b/chrome/common/extensions/api/debugger.json index e935d61e5..152522c 100644 --- a/chrome/common/extensions/api/debugger.json +++ b/chrome/common/extensions/api/debugger.json
@@ -13,7 +13,7 @@ "description": "Debuggee identifier. Either tabId or extensionId must be specified", "properties": { "tabId": { "type": "integer", "optional": true, "description": "The id of the tab which you intend to debug." }, - "extensionId": { "type": "string", "optional": true, "description": "The id of the extension which you intend to debug. Attaching to an extension background page is only possible when 'silent-debugger-extension-api' flag is enabled on the target browser." }, + "extensionId": { "type": "string", "optional": true, "description": "The id of the extension which you intend to debug. Attaching to an extension background page is only possible when the <code>--silent-debugger-extension-api</code> command-line switch is used." }, "targetId": { "type": "string", "optional": true, "description": "The opaque id of the debug target." } } },
diff --git a/chrome/common/extensions/api/enterprise_reporting_private.idl b/chrome/common/extensions/api/enterprise_reporting_private.idl index c507e354..2b21ab9 100644 --- a/chrome/common/extensions/api/enterprise_reporting_private.idl +++ b/chrome/common/extensions/api/enterprise_reporting_private.idl
@@ -16,7 +16,7 @@ callback GetDeviceIdCallback = void(DOMString id); // Invoked by <code>getPersistentSecret</code> to return the secret. - [platforms = ("win", "mac", "linux")] + [platforms = ("win", "mac")] callback GetPersistentSecretCallback = void(ArrayBuffer secret); // Invoked by <code>getDeviceDataCallback</code> to return the device data. @@ -93,7 +93,7 @@ // optional parameter |forceCreation| is set to true the secret is recreated // in case of any failure to retrieve the currently stored one. Sets // $(ref:runtime.lastError) on failure. - [platforms = ("win", "mac", "linux")] + [platforms = ("win", "mac")] static void getPersistentSecret(optional boolean resetSecret, GetPersistentSecretCallback callback);
diff --git a/chrome/common/features.gni b/chrome/common/features.gni index f03959b..f146ca9 100644 --- a/chrome/common/features.gni +++ b/chrome/common/features.gni
@@ -40,9 +40,7 @@ enable_basic_print_dialog = enable_basic_printing && !is_chromeos_ash # Enables usage of notifications via Chrome's MessageCenter. - # TODO(crbug.com/1217088): Disable this on `is_chromeos_lacros`. - enable_chrome_notifications = - is_mac || is_win || is_linux || is_chromeos_lacros + enable_chrome_notifications = is_mac || is_win || is_linux # Enables the Click to Call feature on desktop platforms. enable_click_to_call = is_mac || is_win || is_linux || is_chromeos
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index b390766..78ea464c 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -3027,9 +3027,7 @@ const char kBlockAutoplayEnabled[] = "media.block_autoplay"; #endif // !defined(OS_ANDROID) -// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch -// of lacros-chrome is complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if defined(OS_LINUX) // Boolean that indicates if native notifications are allowed to be used in // place of Chrome notifications. Will be replaced by kAllowSystemNotifications. const char kAllowNativeNotifications[] = "native_notifications.allowed"; @@ -3037,7 +3035,7 @@ // Boolean that indicates if system notifications are allowed to be used in // place of Chrome notifications. const char kAllowSystemNotifications[] = "system_notifications.allowed"; -#endif +#endif // defined(OS_LINUX) // Integer that holds the value of the next persistent notification ID to be // used.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 03bdae0..97e9802 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -1048,9 +1048,7 @@ extern const char kBlockAutoplayEnabled[]; #endif -// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch -// of lacros-chrome is complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#if defined(OS_LINUX) extern const char kAllowNativeNotifications[]; extern const char kAllowSystemNotifications[]; #endif
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 9b520e1..feb45215 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -119,7 +119,6 @@ #include "content/public/common/webplugininfo.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame_visitor.h" -#include "content/public/renderer/render_view.h" #include "extensions/buildflags/buildflags.h" #include "ipc/ipc_sync_channel.h" #include "media/base/media_switches.h" @@ -579,7 +578,7 @@ if (!render_frame->IsMainFrame()) { auto* main_frame_no_state_prefetch_helper = prerender::NoStatePrefetchHelper::Get( - render_frame->GetRenderView()->GetMainRenderFrame()); + render_frame->GetMainRenderFrame()); if (main_frame_no_state_prefetch_helper) { // Avoid any race conditions from having the browser tell subframes that // they're no-state prefetching.
diff --git a/chrome/renderer/chrome_content_settings_agent_delegate.cc b/chrome/renderer/chrome_content_settings_agent_delegate.cc index e28c9529..b67302b 100644 --- a/chrome/renderer/chrome_content_settings_agent_delegate.cc +++ b/chrome/renderer/chrome_content_settings_agent_delegate.cc
@@ -7,7 +7,6 @@ #include "base/containers/contains.h" #include "chrome/common/ssl_insecure_content.h" #include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_view.h" #include "third_party/blink/public/web/web_local_frame.h" #if BUILDFLAG(ENABLE_EXTENSIONS) @@ -25,8 +24,7 @@ RenderFrameObserverTracker<ChromeContentSettingsAgentDelegate>( render_frame), render_frame_(render_frame) { - content::RenderFrame* main_frame = - render_frame->GetRenderView()->GetMainRenderFrame(); + content::RenderFrame* main_frame = render_frame->GetMainRenderFrame(); // TODO(nasko): The main frame is not guaranteed to be in the same process // with this frame with --site-per-process. This code needs to be updated // to handle this case. See https://crbug.com/496670.
diff --git a/chrome/service/BUILD.gn b/chrome/service/BUILD.gn index 048d8d7..53dc302 100644 --- a/chrome/service/BUILD.gn +++ b/chrome/service/BUILD.gn
@@ -95,6 +95,9 @@ "service_utility_process_host.h", "service_utility_process_host_receiver_bindings.cc", ] - deps += [ "//sandbox/win:sandbox" ] + deps += [ + "//chrome/common:cloud_print_utility_mojom", + "//sandbox/win:sandbox", + ] } }
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc index 206ab196..03a933e 100644 --- a/chrome/service/service_utility_process_host.cc +++ b/chrome/service/service_utility_process_host.cc
@@ -28,7 +28,7 @@ #include "base/win/win_util.h" #include "build/build_config.h" #include "chrome/common/chrome_switches.h" -#include "chrome/common/chrome_utility_printing_messages.h" +#include "chrome/common/cloud_print_utility.mojom.h" #include "chrome/services/printing/public/mojom/pdf_to_emf_converter.mojom.h" #include "content/public/common/child_process_host.h" #include "content/public/common/content_switches.h" @@ -221,6 +221,8 @@ waiting_for_reply_(false) { child_process_host_ = ChildProcessHost::Create(this, ChildProcessHost::IpcMode::kNormal); + child_process_host_->BindReceiver( + cloud_print_utility_remote_.BindNewPipeAndPassReceiver()); } ServiceUtilityProcessHost::~ServiceUtilityProcessHost() { @@ -267,7 +269,11 @@ return false; DCHECK(!waiting_for_reply_); waiting_for_reply_ = true; - return Send(new ChromeUtilityMsg_GetPrinterCapsAndDefaults(printer_name)); + cloud_print_utility_remote_->GetPrinterCapsAndDefaults( + printer_name, + base::BindOnce(&ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaults, + base::Unretained(this), printer_name)); + return true; } bool ServiceUtilityProcessHost::StartGetPrinterSemanticCapsAndDefaults( @@ -276,8 +282,12 @@ return false; DCHECK(!waiting_for_reply_); waiting_for_reply_ = true; - return Send( - new ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults(printer_name)); + cloud_print_utility_remote_->GetPrinterSemanticCapsAndDefaults( + printer_name, + base::BindOnce( + &ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaults, + base::Unretained(this), printer_name)); + return true; } bool ServiceUtilityProcessHost::StartProcess(bool sandbox) { @@ -287,10 +297,6 @@ return false; } - // NOTE: This call to |CreateChannelMojo()| requires a working - // ServiceManagerConnection to have already been established. - child_process_host_->CreateChannelMojo(); - base::CommandLine cmd_line(exe_path); cmd_line.AppendSwitchASCII(switches::kProcessType, switches::kUtilityProcess); cmd_line.AppendSwitch(switches::kLang); @@ -357,13 +363,6 @@ return true; } -bool ServiceUtilityProcessHost::Send(IPC::Message* msg) { - if (child_process_host_) - return child_process_host_->Send(msg); - delete msg; - return false; -} - base::FilePath ServiceUtilityProcessHost::GetUtilityProcessCmd() { return ChildProcessHost::GetChildPath(ChildProcessHost::CHILD_NORMAL); } @@ -381,22 +380,7 @@ } bool ServiceUtilityProcessHost::OnMessageReceived(const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(ServiceUtilityProcessHost, message) - IPC_MESSAGE_HANDLER( - ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded, - OnGetPrinterCapsAndDefaultsSucceeded) - IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed, - OnGetPrinterCapsAndDefaultsFailed) - IPC_MESSAGE_HANDLER( - ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded, - OnGetPrinterSemanticCapsAndDefaultsSucceeded) - IPC_MESSAGE_HANDLER( - ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed, - OnGetPrinterSemanticCapsAndDefaultsFailed) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; + return false; } const base::Process& ServiceUtilityProcessHost::GetProcess() { @@ -448,52 +432,33 @@ delete this; } -void ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaultsSucceeded( +void ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaults( const std::string& printer_name, - const printing::PrinterCapsAndDefaults& caps_and_defaults) { + const absl::optional<printing::PrinterCapsAndDefaults>& caps_and_defaults) { DCHECK(waiting_for_reply_); waiting_for_reply_ = false; client_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&Client::OnGetPrinterCapsAndDefaults, client_.get(), true, - printer_name, caps_and_defaults)); + base::BindOnce( + &Client::OnGetPrinterCapsAndDefaults, client_.get(), + caps_and_defaults.has_value(), printer_name, + caps_and_defaults.value_or(printing::PrinterCapsAndDefaults()))); // The child process disconnects itself and this host deletes itself via // OnChildDisconnected(). } -void ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaultsSucceeded( +void ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaults( const std::string& printer_name, - const printing::PrinterSemanticCapsAndDefaults& caps_and_defaults) { + const absl::optional<printing::PrinterSemanticCapsAndDefaults>& + caps_and_defaults) { DCHECK(waiting_for_reply_); waiting_for_reply_ = false; client_task_runner_->PostTask( FROM_HERE, base::BindOnce(&Client::OnGetPrinterSemanticCapsAndDefaults, - client_.get(), true, printer_name, caps_and_defaults)); - // The child process disconnects itself and this host deletes itself via - // OnChildDisconnected(). -} - -void ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaultsFailed( - const std::string& printer_name) { - DCHECK(waiting_for_reply_); - waiting_for_reply_ = false; - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&Client::OnGetPrinterCapsAndDefaults, client_.get(), false, - printer_name, printing::PrinterCapsAndDefaults())); - // The child process disconnects itself and this host deletes itself via - // OnChildDisconnected(). -} - -void ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaultsFailed( - const std::string& printer_name) { - DCHECK(waiting_for_reply_); - waiting_for_reply_ = false; - client_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&Client::OnGetPrinterSemanticCapsAndDefaults, - client_.get(), false, printer_name, - printing::PrinterSemanticCapsAndDefaults())); + client_.get(), caps_and_defaults.has_value(), printer_name, + caps_and_defaults.value_or( + printing::PrinterSemanticCapsAndDefaults()))); // The child process disconnects itself and this host deletes itself via // OnChildDisconnected(). }
diff --git a/chrome/service/service_utility_process_host.h b/chrome/service/service_utility_process_host.h index d79fbfb..46e26cf 100644 --- a/chrome/service/service_utility_process_host.h +++ b/chrome/service/service_utility_process_host.h
@@ -11,10 +11,12 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "chrome/common/cloud_print_utility.mojom.h" #include "chrome/services/printing/public/mojom/pdf_to_emf_converter.mojom.h" #include "content/public/common/child_process_host_delegate.h" -#include "ipc/ipc_platform_file.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace base { class CommandLine; @@ -112,8 +114,6 @@ bool StartGetPrinterSemanticCapsAndDefaults(const std::string& printer_name); protected: - bool Send(IPC::Message* msg); - // Allows this method to be overridden for tests. virtual base::FilePath GetUtilityProcessCmd(); @@ -143,19 +143,19 @@ base::ReadOnlySharedMemoryRegion emf_region, float scale_factor); - // IPC Messages handlers: - void OnGetPrinterCapsAndDefaultsSucceeded( + // IPC response handlers: + void OnGetPrinterCapsAndDefaults( const std::string& printer_name, - const printing::PrinterCapsAndDefaults& caps_and_defaults); - void OnGetPrinterCapsAndDefaultsFailed(const std::string& printer_name); - void OnGetPrinterSemanticCapsAndDefaultsSucceeded( + const absl::optional<printing::PrinterCapsAndDefaults>& + caps_and_defaults); + void OnGetPrinterSemanticCapsAndDefaults( const std::string& printer_name, - const printing::PrinterSemanticCapsAndDefaults& caps_and_defaults); - void OnGetPrinterSemanticCapsAndDefaultsFailed( - const std::string& printer_name); + const absl::optional<printing::PrinterSemanticCapsAndDefaults>& + caps_and_defaults); std::unique_ptr<content::ChildProcessHost> child_process_host_; base::Process process_; + mojo::Remote<chrome::mojom::CloudPrintUtility> cloud_print_utility_remote_; // A pointer to our client interface, who will be informed of progress. scoped_refptr<Client> client_; scoped_refptr<base::SingleThreadTaskRunner> client_task_runner_;
diff --git a/chrome/services/file_util/public/cpp/zip_file_creator_browsertest.cc b/chrome/services/file_util/public/cpp/zip_file_creator_browsertest.cc index c2a503d..367f0040 100644 --- a/chrome/services/file_util/public/cpp/zip_file_creator_browsertest.cc +++ b/chrome/services/file_util/public/cpp/zip_file_creator_browsertest.cc
@@ -134,7 +134,7 @@ } } -IN_PROC_BROWSER_TEST_F(ZipFileCreatorTest, BigFile) { +IN_PROC_BROWSER_TEST_F(ZipFileCreatorTest, DISABLED_BigFile) { // Prepare big file. // TODO(crbug.com/1207737) Increase size to 5'000'000'000. const base::FilePath kFile("big");
diff --git a/chrome/services/speech/soda/soda_client_unittest.cc b/chrome/services/speech/soda/soda_client_unittest.cc index 2a9fc90..e92c3017 100644 --- a/chrome/services/speech/soda/soda_client_unittest.cc +++ b/chrome/services/speech/soda/soda_client_unittest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chrome/services/speech/soda/soda_client.h" +#include <algorithm> #include <memory> #include "base/files/file_path.h" @@ -65,6 +66,9 @@ } void SodaClientUnitTest::AddRecognitionResult(std::string result) { + // The language pack used by the MacOS builder is newer and has punctuation + // enabled whereas the one used by the Linux builder does not. + result.erase(std::remove(result.begin(), result.end(), ','), result.end()); recognition_results_.push_back(std::move(result)); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index c8712d9..b369ee64 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4992,6 +4992,7 @@ "//components/ukm/content", "//components/variations:test_support", "//components/version_info:generate_version_info", + "//components/webrtc", "//content/app/resources", "//content/public/app", "//content/test:test_support", @@ -6551,14 +6552,6 @@ ":test_proto", "../common/safe_browsing:mock_binary_feature_extractor", "//chrome/services/file_util/public/cpp:unit_tests", - "//components/safe_browsing/content/renderer:websocket_sb_handshake_throttle_unittest", - "//components/safe_browsing/content/triggers:ad_redirect_trigger", - "//components/safe_browsing/core:features_unittest", - "//components/safe_browsing/core:ping_manager_unittest", - "//components/safe_browsing/core/browser:safe_browsing_url_checker_unittest", - "//components/safe_browsing/core/browser/download:unittests", - "//components/safe_browsing/core/browser/sync:unittests", - "//components/safe_browsing/core/db:v4_test_util", ] } else if (safe_browsing_mode == 2 && is_android) { sources += [ "../browser/safe_browsing/telemetry/android/android_telemetry_service_unittest.cc" ]
diff --git a/chrome/test/data/extensions/api_test/debugger/background.js b/chrome/test/data/extensions/api_test/debugger/background.js index 7675e92b..d5c08fe 100644 --- a/chrome/test/data/extensions/api_test/debugger/background.js +++ b/chrome/test/data/extensions/api_test/debugger/background.js
@@ -12,8 +12,6 @@ var unsupportedMinorProtocolVersion = "1.5"; var unsupportedMajorProtocolVersion = "100.0"; -var SILENT_FLAG_REQUIRED = "Cannot attach to this target unless " + - "'silent-debugger-extension-api' flag is enabled."; var DETACHED_WHILE_HANDLING = "Detached while handling command."; let openTab;
diff --git a/chrome/test/data/extensions/content_verifier/missing_verified_contents/invalid_verified_contents.json b/chrome/test/data/extensions/content_verifier/missing_verified_contents/invalid_verified_contents.json deleted file mode 100644 index 2786fabe..0000000 --- a/chrome/test/data/extensions/content_verifier/missing_verified_contents/invalid_verified_contents.json +++ /dev/null
@@ -1 +0,0 @@ -[{"description":"treehash per file","signed_content":{"payload":"EyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7ImNhbm9uaWNhbF9qc29uX3Jvb3RfaGFzaCI6IllyZkpZUl94ZjNTa0RZNW1JZWJRdmU0VHlpSUtOR3drbm84clB4dG5fR0UiLCJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6InppS0Z6dUpsd1dTZ0hwdS0zWGJNb2FrX3ZLdGV6X19VdklFOUx6b1h0N00ifSx7InBhdGgiOiJzY3JpcHQuanMiLCJyb290X2hhc2giOiI1WHFkOHJld3hmU0sweFJRb0pIRmZXZ1owV1JfMW1HY2hkSE04azJpWmJRIn1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoiam1sbGhsb2JwamNubm9tamxpcGFkZWpwbGhtaGVpaWYiLCJpdGVtX3ZlcnNpb24iOiIwLjgiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"wk06r54DG_zobXdASPU6xggGPyekrkvwssRS76_LaHvNBIjthLtUZ3zoTmAsb4aELj-5n5Nk4rT1_wpDvkOKoKCeBHNx_yiP9kTuPW_c7D_9BKrCrj5-gRL-YanX18b4G4uHCbpfKoCyVgUUU0spr21Fa-kkf8IqSSrzYfJHRnYAhFKI5NTX-EhRWvwFOI5V8U2332q1VCKMxfuUjNFbVTrI2eQ9LrvSjvtXTygTCC4MDlKlsFThoPXK_H_eZDLjfV45FGtuXlK8yd8hixXXm_nTLSb5UL_Ul-g95bONg5ywXSWsFMoXC1r80dsecZXdPxxi3ELLyMZlp4EwgGQcgA"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"WUvXcOJ0_evMh-g4wdSlsNJl_TRISiKGbyb2G7yXwKcHo-HXdk4bfnZyu9dI_ao4qBLJH3DAcRJDEj-UvTn_J1Ctpwv6p4yWc2OlVG6hyI5zQtA2DgNTsBPAXcUNG1Z4crE0nNJeyXZjjNb3RpjJViKaaqlkUkkqPpUwAgeGIRgn9d0tFVEpFACLqtprEahO4EgjXkLgT5r2oVqgQrItbvtVv23Kb8eaK7ZX97pVhsicNfKiNGtJL4yk1UdOVUxGr_4zBp0CaGWfCqkC3ZApdI2RQy_CyaOYlviLQ35TxQ8JGO6k9Tb0IxxRVjF_in8qhYt6R0ATjTnzEBUEscDLGg"}]}}]
diff --git a/chrome/test/data/extensions/content_verifier/missing_verified_contents/verified_contents.json b/chrome/test/data/extensions/content_verifier/missing_verified_contents/verified_contents.json deleted file mode 100644 index 6207e3c..0000000 --- a/chrome/test/data/extensions/content_verifier/missing_verified_contents/verified_contents.json +++ /dev/null
@@ -1 +0,0 @@ -[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7ImNhbm9uaWNhbF9qc29uX3Jvb3RfaGFzaCI6IllyZkpZUl94ZjNTa0RZNW1JZWJRdmU0VHlpSUtOR3drbm84clB4dG5fR0UiLCJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6InppS0Z6dUpsd1dTZ0hwdS0zWGJNb2FrX3ZLdGV6X19VdklFOUx6b1h0N00ifSx7InBhdGgiOiJzY3JpcHQuanMiLCJyb290X2hhc2giOiI1WHFkOHJld3hmU0sweFJRb0pIRmZXZ1owV1JfMW1HY2hkSE04azJpWmJRIn1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoiam1sbGhsb2JwamNubm9tamxpcGFkZWpwbGhtaGVpaWYiLCJpdGVtX3ZlcnNpb24iOiIwLjgiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"wk06r54DG_zobXdASPU6xggGPyekrkvwssRS76_LaHvNBIjthLtUZ3zoTmAsb4aELj-5n5Nk4rT1_wpDvkOKoKCeBHNx_yiP9kTuPW_c7D_9BKrCrj5-gRL-YanX18b4G4uHCbpfKoCyVgUUU0spr21Fa-kkf8IqSSrzYfJHRnYAhFKI5NTX-EhRWvwFOI5V8U2332q1VCKMxfuUjNFbVTrI2eQ9LrvSjvtXTygTCC4MDlKlsFThoPXK_H_eZDLjfV45FGtuXlK8yd8hixXXm_nTLSb5UL_Ul-g95bONg5ywXSWsFMoXC1r80dsecZXdPxxi3ELLyMZlp4EwgGQcgA"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"WUvXcOJ0_evMh-g4wdSlsNJl_TRISiKGbyb2G7yXwKcHo-HXdk4bfnZyu9dI_ao4qBLJH3DAcRJDEj-UvTn_J1Ctpwv6p4yWc2OlVG6hyI5zQtA2DgNTsBPAXcUNG1Z4crE0nNJeyXZjjNb3RpjJViKaaqlkUkkqPpUwAgeGIRgn9d0tFVEpFACLqtprEahO4EgjXkLgT5r2oVqgQrItbvtVv23Kb8eaK7ZX97pVhsicNfKiNGtJL4yk1UdOVUxGr_4zBp0CaGWfCqkC3ZApdI2RQy_CyaOYlviLQ35TxQ8JGO6k9Tb0IxxRVjF_in8qhYt6R0ATjTnzEBUEscDLGg"}]}}] \ No newline at end of file
diff --git a/chrome/test/data/webui/chromeos/diagnostics/routine_section_test.js b/chrome/test/data/webui/chromeos/diagnostics/routine_section_test.js index 34ecc4d..b15e0e8 100644 --- a/chrome/test/data/webui/chromeos/diagnostics/routine_section_test.js +++ b/chrome/test/data/webui/chromeos/diagnostics/routine_section_test.js
@@ -235,6 +235,27 @@ return flushTasks(); } + /** + * @param {boolean} hideRoutineStatus + * @return {!Promise} + */ + function setHideRoutineStatus(hideRoutineStatus) { + routineSectionElement.hideRoutineStatus = hideRoutineStatus; + return flushTasks(); + } + + /** + * Returns the learn more button. + * @return {!CrButtonElement} + */ + function getLearnMoreButton() { + const learnMoreButton = + /** @type {!CrButtonElement} */ ( + routineSectionElement.$$('#learnMoreButton')); + assertTrue(!!learnMoreButton); + return learnMoreButton; + } + test('ElementRenders', () => { return initializeRoutineSection([]).then(() => { // Verify the element rendered. @@ -899,4 +920,16 @@ ExecutionProgress.kCancelled, getEntries()[0].item.progress); }); }); + + test('RoutineStatusAndActionsHidden', () => { + return initializeRoutineSection([]) + .then(() => setHideRoutineStatus(true)) + .then(() => { + assertFalse(isVisible(getLearnMoreButton())); + assertFalse(isVisible(/** @type {!HTMLElement} */ ( + routineSectionElement.$$('.routine-status-container')))); + assertFalse(isVisible(/** @type {!HTMLElement} */ ( + routineSectionElement.$$('.button-container')))); + }); + }); }
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn index 0976a68..1cc9403 100644 --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn
@@ -175,14 +175,9 @@ deps += [ "//chromeos/services/assistant/audio_decoder:lib", "//chromeos/services/assistant/public/mojom", + "//chromeos/services/libassistant", + "//chromeos/services/libassistant/public/mojom", ] - - if (enable_libassistant_sandbox) { - deps += [ - "//chromeos/services/libassistant", - "//chromeos/services/libassistant/public/mojom", - ] - } } } @@ -221,6 +216,7 @@ "printing_handler.cc", "printing_handler.h", ] + public_deps += [ "//chrome/common:cloud_print_utility_mojom" ] } }
diff --git a/chrome/utility/browser_exposed_utility_interfaces.cc b/chrome/utility/browser_exposed_utility_interfaces.cc index 6fad4eb..0b9d161 100644 --- a/chrome/utility/browser_exposed_utility_interfaces.cc +++ b/chrome/utility/browser_exposed_utility_interfaces.cc
@@ -13,6 +13,25 @@ #include "chrome/services/printing/pdf_to_emf_converter_factory.h" #endif +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN) +#include "chrome/common/cloud_print_utility.mojom.h" +#include "chrome/utility/printing_handler.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" +#endif + +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN) +namespace { + +void BindCloudPrintUtility( + mojo::PendingReceiver<chrome::mojom::CloudPrintUtility> receiver) { + mojo::MakeSelfOwnedReceiver(std::make_unique<printing::PrintingHandler>(), + std::move(receiver)); +} + +} // namespace +#endif + void ExposeElevatedChromeUtilityInterfacesToBrowser(mojo::BinderMap* binders) { #if BUILDFLAG(ENABLE_PRINTING) && defined(OS_WIN) // TODO(crbug.com/798782): remove when the Cloud print chrome/service is @@ -20,4 +39,7 @@ binders->Add(base::BindRepeating(printing::PdfToEmfConverterFactory::Create), base::ThreadTaskRunnerHandle::Get()); #endif +#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN) + binders->Add(base::BindRepeating(&BindCloudPrintUtility)); +#endif }
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc index 03dff4f..7045c62 100644 --- a/chrome/utility/chrome_content_utility_client.cc +++ b/chrome/utility/chrome_content_utility_client.cc
@@ -34,9 +34,6 @@ ChromeContentUtilityClient::ChromeContentUtilityClient() : utility_process_running_elevated_(false) { -#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN) - printing_handler_ = std::make_unique<printing::PrintingHandler>(); -#endif } ChromeContentUtilityClient::~ChromeContentUtilityClient() = default; @@ -59,18 +56,6 @@ ExposeElevatedChromeUtilityInterfacesToBrowser(binders); } -bool ChromeContentUtilityClient::OnMessageReceived( - const IPC::Message& message) { - if (utility_process_running_elevated_) - return false; - -#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN) - if (printing_handler_->OnMessageReceived(message)) - return true; -#endif - return false; -} - void ChromeContentUtilityClient::RegisterNetworkBinders( service_manager::BinderRegistry* registry) { if (g_network_binder_creation_callback.Get())
diff --git a/chrome/utility/chrome_content_utility_client.h b/chrome/utility/chrome_content_utility_client.h index 6e5ff03..bed4dcf 100644 --- a/chrome/utility/chrome_content_utility_client.h +++ b/chrome/utility/chrome_content_utility_client.h
@@ -27,7 +27,6 @@ // content::ContentUtilityClient: void ExposeInterfacesToBrowser(mojo::BinderMap* binders) override; - bool OnMessageReceived(const IPC::Message& message) override; void PostIOThreadCreated( base::SingleThreadTaskRunner* io_thread_task_runner) override; void RegisterNetworkBinders(
diff --git a/chrome/utility/printing_handler.cc b/chrome/utility/printing_handler.cc index b863592..44752ed 100644 --- a/chrome/utility/printing_handler.cc +++ b/chrome/utility/printing_handler.cc
@@ -5,22 +5,17 @@ #include "chrome/utility/printing_handler.h" #include "build/build_config.h" -#include "chrome/common/chrome_utility_printing_messages.h" #include "components/crash/core/common/crash_keys.h" #include "content/public/utility/utility_thread.h" -#include "ipc/ipc_message.h" #include "printing/backend/print_backend.h" #include "printing/buildflags/buildflags.h" #include "printing/mojom/print.mojom.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace printing { namespace { -bool Send(IPC::Message* message) { - return content::UtilityThread::Get()->Send(message); -} - void ReleaseProcess() { content::UtilityThread::Get()->ReleaseProcess(); } @@ -31,20 +26,9 @@ PrintingHandler::~PrintingHandler() = default; -bool PrintingHandler::OnMessageReceived(const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message) - IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, - OnGetPrinterCapsAndDefaults) - IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults, - OnGetPrinterSemanticCapsAndDefaults) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void PrintingHandler::OnGetPrinterCapsAndDefaults( - const std::string& printer_name) { +void PrintingHandler::GetPrinterCapsAndDefaults( + const std::string& printer_name, + GetPrinterCapsAndDefaultsCallback callback) { scoped_refptr<PrintBackend> print_backend = PrintBackend::CreateInstance(/*locale=*/std::string()); PrinterCapsAndDefaults printer_info; @@ -54,17 +38,16 @@ if (print_backend->GetPrinterCapsAndDefaults(printer_name, &printer_info) == mojom::ResultCode::kSuccess) { - Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded( - printer_name, printer_info)); + std::move(callback).Run(printer_info); } else { - Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed( - printer_name)); + std::move(callback).Run(absl::nullopt); } ReleaseProcess(); } -void PrintingHandler::OnGetPrinterSemanticCapsAndDefaults( - const std::string& printer_name) { +void PrintingHandler::GetPrinterSemanticCapsAndDefaults( + const std::string& printer_name, + GetPrinterSemanticCapsAndDefaultsCallback callback) { scoped_refptr<PrintBackend> print_backend = PrintBackend::CreateInstance(/*locale=*/std::string()); PrinterSemanticCapsAndDefaults printer_info; @@ -74,11 +57,9 @@ if (print_backend->GetPrinterSemanticCapsAndDefaults( printer_name, &printer_info) == mojom::ResultCode::kSuccess) { - Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( - printer_name, printer_info)); + std::move(callback).Run(printer_info); } else { - Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( - printer_name)); + std::move(callback).Run(absl::nullopt); } ReleaseProcess(); }
diff --git a/chrome/utility/printing_handler.h b/chrome/utility/printing_handler.h index 006966f..3bcb7529 100644 --- a/chrome/utility/printing_handler.h +++ b/chrome/utility/printing_handler.h
@@ -9,32 +9,31 @@ #include "base/macros.h" #include "build/build_config.h" +#include "chrome/common/cloud_print_utility.mojom.h" #include "printing/buildflags/buildflags.h" #if !defined(OS_WIN) || !BUILDFLAG(ENABLE_PRINT_PREVIEW) #error "Windows printing and print preview must be enabled" #endif -namespace IPC { -class Message; -} - namespace printing { // Dispatches IPCs for printing. -class PrintingHandler { +class PrintingHandler : public chrome::mojom::CloudPrintUtility { public: PrintingHandler(); - ~PrintingHandler(); - - bool OnMessageReceived(const IPC::Message& message); + PrintingHandler(const PrintingHandler&) = delete; + PrintingHandler& operator=(const PrintingHandler&) = delete; + ~PrintingHandler() override; private: - // IPC message handlers. - void OnGetPrinterCapsAndDefaults(const std::string& printer_name); - void OnGetPrinterSemanticCapsAndDefaults(const std::string& printer_name); - - DISALLOW_COPY_AND_ASSIGN(PrintingHandler); + // chrome::mojom::CloudPrintUtility: + void GetPrinterCapsAndDefaults( + const std::string& printer_name, + GetPrinterCapsAndDefaultsCallback callback) override; + void GetPrinterSemanticCapsAndDefaults( + const std::string& printer_name, + GetPrinterSemanticCapsAndDefaultsCallback callback) override; }; } // namespace printing
diff --git a/chrome/utility/services.cc b/chrome/utility/services.cc index 0728a65..910df13 100644 --- a/chrome/utility/services.cc +++ b/chrome/utility/services.cc
@@ -107,10 +107,7 @@ #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/services/assistant/audio_decoder/assistant_audio_decoder_factory.h" // nogncheck - -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) #include "chromeos/services/libassistant/libassistant_service.h" // nogncheck -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -297,14 +294,12 @@ std::move(receiver)); } -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) auto RunLibassistantService( mojo::PendingReceiver<chromeos::libassistant::mojom::LibassistantService> receiver) { return std::make_unique<chromeos::libassistant::LibassistantService>( std::move(receiver)); } -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) @@ -384,9 +379,7 @@ services.Add(RunLocalSearchService); #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) services.Add(RunAssistantAudioDecoder); -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) services.Add(RunLibassistantService); -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) }
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc index baefe29..5904494 100644 --- a/chromecast/browser/cast_web_contents_impl.cc +++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -170,6 +170,9 @@ web_contents_->GetMutableRendererPrefs() ->webrtc_allow_legacy_tls_protocols = true; } + + web_contents_->SetPageBaseBackgroundColor(chromecast::GetSwitchValueColor( + switches::kCastAppBackgroundColor, SK_ColorBLACK)); } CastWebContentsImpl::~CastWebContentsImpl() {
diff --git a/chromecast/media/gpu/cast_gpu_factory_impl.cc b/chromecast/media/gpu/cast_gpu_factory_impl.cc index da43ca86..88e6c062 100644 --- a/chromecast/media/gpu/cast_gpu_factory_impl.cc +++ b/chromecast/media/gpu/cast_gpu_factory_impl.cc
@@ -298,8 +298,8 @@ } // Get the channel token for the current connection. - context_provider_->GetCommandBufferProxy()->channel()->Send( - new GpuCommandBufferMsg_GetChannelToken(&channel_token_)); + context_provider_->GetCommandBufferProxy()->GetGpuChannel().GetChannelToken( + &channel_token_); gpu_->CreateVideoEncodeAcceleratorProvider( vea_provider_.BindNewPipeAndPassReceiver());
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc index f24ae66..c226de0 100644 --- a/chromecast/renderer/cast_content_renderer_client.cc +++ b/chromecast/renderer/cast_content_renderer_client.cc
@@ -163,8 +163,6 @@ } void CastContentRendererClient::WebViewCreated(blink::WebView* webview) { - webview->SetBaseBackgroundColor(chromecast::GetSwitchValueColor( - switches::kCastAppBackgroundColor, SK_ColorBLACK)); // Disable application cache as Chromecast doesn't support off-line // application running. webview->GetSettings()->SetOfflineWebApplicationCacheEnabled(false);
diff --git a/chromeos/assistant/BUILD.gn b/chromeos/assistant/BUILD.gn index f1a6d7e28..a2b7a9e 100644 --- a/chromeos/assistant/BUILD.gn +++ b/chromeos/assistant/BUILD.gn
@@ -11,7 +11,6 @@ flags = [ "ENABLE_CROS_LIBASSISTANT=$enable_cros_libassistant", - "ENABLE_LIBASSISTANT_SANDBOX=$enable_cros_libassistant && $enable_libassistant_sandbox", "ENABLE_CROS_AMBIENT_MODE_BACKEND=$enable_cros_ambient_mode_backend", ] }
diff --git a/chromeos/assistant/assistant.gni b/chromeos/assistant/assistant.gni index da5c37c..0f462c2 100644 --- a/chromeos/assistant/assistant.gni +++ b/chromeos/assistant/assistant.gni
@@ -5,9 +5,6 @@ # Enable assistant implementation based on libassistant. enable_cros_libassistant = is_chromeos_ash && is_chrome_branded - # Enable sandboxing LibAssistant service. - enable_libassistant_sandbox = false - # Enable a fake microphone, which can replay audio files as microphone input. # See chromeos/assistant/tools/send-audio.sh enable_fake_assistant_microphone = false
diff --git a/chromeos/components/diagnostics_ui/resources/connectivity_card.html b/chromeos/components/diagnostics_ui/resources/connectivity_card.html index 433ff0dc..28b1b410 100644 --- a/chromeos/components/diagnostics_ui/resources/connectivity_card.html +++ b/chromeos/components/diagnostics_ui/resources/connectivity_card.html
@@ -1,15 +1,25 @@ <style include="diagnostics-shared diagnostics-fonts"> + #defaultConnectionChip { + background-color: var(--google-blue-50); + color: var(--google-blue-600); + } </style> -<diagnostics-card> +<diagnostics-card is-networking-card="true"> <!-- TODO(michaelcheco): Add localized strings. --> <div id="cardTitle" slot="title">Connectivity</div> + <div id="defaultConnectionChip" slot="chip" class="diagnostics-chip" + aria-hidden="true"> + Default connection + </div> <network-info slot="body" guid="[[activeGuid]]"></network-info> - <routine-section slot="routines" routines="[[routines_]]" + <routine-section slot="left-panel" routines="[[routines_]]" is-test-running="{{isTestRunning}}" run-tests-button-text="Run Network test" routine-runtime="{{getEstimateRuntimeInMinutes_(routines_)}}" is-active="[[isActive]]" - run-tests-automatically="true"> + run-tests-automatically="true" + hide-routine-status="true" + opened="true"> </routine-section> </diagnostics-card>
diff --git a/chromeos/components/diagnostics_ui/resources/diagnostics_card.html b/chromeos/components/diagnostics_ui/resources/diagnostics_card.html index 36deed0..9bb6de3 100644 --- a/chromeos/components/diagnostics_ui/resources/diagnostics_card.html +++ b/chromeos/components/diagnostics_ui/resources/diagnostics_card.html
@@ -65,6 +65,10 @@ display: flex; margin-top: 16px; } + + .top-section-padding { + padding-inline: 24px; + } </style> <div class="card-container"> <div id="title" class="card-header"> @@ -72,7 +76,7 @@ <slot name="chip"></slot> </div> <div class="card-wrapper"> - <div class="top-section"> + <div class$="[[getTopSectionClassName_(isNetworkingCard)]]"> <slot name="icon"></slot> <slot name="left-panel"></slot> </div>
diff --git a/chromeos/components/diagnostics_ui/resources/diagnostics_card.js b/chromeos/components/diagnostics_ui/resources/diagnostics_card.js index 426d6790..0a82c41 100644 --- a/chromeos/components/diagnostics_ui/resources/diagnostics_card.js +++ b/chromeos/components/diagnostics_ui/resources/diagnostics_card.js
@@ -24,5 +24,20 @@ value: false, reflectToAttribute: true, }, + + /** @type {boolean} */ + isNetworkingCard: { + type: Boolean, + value: false, + reflectToAttribute: true, + }, + }, + + /** + * @return {string} + * @protected + */ + getTopSectionClassName_() { + return `top-section${this.isNetworkingCard ? '-padding' : ''}`; }, });
diff --git a/chromeos/components/diagnostics_ui/resources/routine_section.html b/chromeos/components/diagnostics_ui/resources/routine_section.html index 6ee6ae2..6549c05 100644 --- a/chromeos/components/diagnostics_ui/resources/routine_section.html +++ b/chromeos/components/diagnostics_ui/resources/routine_section.html
@@ -63,7 +63,7 @@ </style> <div class="routine-section-container"> <div id="routineSection" class="routine-container"> - <div class="routine-status-container"> + <div class="routine-status-container" hidden$="[[hideRoutineStatus]]"> <text-badge id="testStatusBadge" badge-type="[[badgeType_]]" hidden="[[isStatusHidden_(executionStatus_)]]" @@ -79,7 +79,7 @@ </span> </span> </div> - <div class="button-container"> + <div class="button-container" hidden$="[[hideRoutineStatus]]"> <iron-icon id="messageIcon" icon="diagnostics:info" hidden$="[[isAdditionalMessageHidden_(additionalMessage)]]"> </iron-icon> @@ -110,8 +110,9 @@ <routine-result-list id="resultList"></routine-result-list> </div> <cr-button id="learnMoreButton" class="learn-more-button" - on-click="onLearnMoreClicked_" hidden$="[[!isLoggedIn_]]"> - [[i18n('learnMore')]] + on-click="onLearnMoreClicked_" + hidden$="[[isLearnMoreButtonHidden_(isLoggedIn_, hideRoutineStatus)]]"> + [[i18n('learnMore')]] </cr-button> </iron-collapse> </div>
diff --git a/chromeos/components/diagnostics_ui/resources/routine_section.js b/chromeos/components/diagnostics_ui/resources/routine_section.js index b7449f12..f7dee12 100644 --- a/chromeos/components/diagnostics_ui/resources/routine_section.js +++ b/chromeos/components/diagnostics_ui/resources/routine_section.js
@@ -182,6 +182,18 @@ type: Boolean, value: false, }, + + /** @type {boolean} */ + hideRoutineStatus: { + type: Boolean, + value: false, + }, + + /** @type {boolean} */ + opened: { + type: Boolean, + value: false, + }, }, observers: [ @@ -520,6 +532,14 @@ } }, + /** + * @protected + * @return {boolean} + */ + isLearnMoreButtonHidden_() { + return !this.isLoggedIn_ || this.hideRoutineStatus; + }, + /** @override */ detached() { this.cleanUp_();
diff --git a/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.cc b/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.cc index 766a754..7cb5f41 100644 --- a/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.cc +++ b/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.cc
@@ -16,6 +16,10 @@ // A preference that indicates the user has enabled the Quick Answers services. const char kQuickAnswersEnabled[] = "settings.quick_answers.enabled"; +// A preference that indicates the user has provide consent to enable the Quick +// Answers feature. +const char kQuickAnswersConsented[] = "settings.quick_answers.user_consented"; + // A preference to keep track of the number of Quick Answers notice impression. const char kQuickAnswersNoticeImpressionCount[] = "settings.quick_answers.consent.count"; @@ -28,6 +32,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterBooleanPref(kQuickAnswersNoticed, false); registry->RegisterBooleanPref(kQuickAnswersEnabled, false); + registry->RegisterBooleanPref(kQuickAnswersConsented, false); registry->RegisterIntegerPref(kQuickAnswersNoticeImpressionCount, 0); registry->RegisterIntegerPref(kQuickAnswersNoticeImpressionDuration, 0); }
diff --git a/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h b/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h index de65f15..1d1d714 100644 --- a/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h +++ b/chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h
@@ -13,6 +13,7 @@ extern const char kQuickAnswersNoticed[]; extern const char kQuickAnswersEnabled[]; +extern const char kQuickAnswersConsented[]; extern const char kQuickAnswersNoticeImpressionCount[]; extern const char kQuickAnswersNoticeImpressionDuration[];
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn index c5f7c5e..761b458 100644 --- a/chromeos/crosapi/mojom/BUILD.gn +++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -30,6 +30,7 @@ "metrics_reporting.mojom", "native_theme.mojom", "notification.mojom", + "power.mojom", "prefs.mojom", "remoting.mojom", "screen_manager.mojom",
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom index f1189664..a53c586 100644 --- a/chromeos/crosapi/mojom/crosapi.mojom +++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -24,6 +24,7 @@ import "chromeos/crosapi/mojom/message_center.mojom"; import "chromeos/crosapi/mojom/metrics_reporting.mojom"; import "chromeos/crosapi/mojom/native_theme.mojom"; +import "chromeos/crosapi/mojom/power.mojom"; import "chromeos/crosapi/mojom/prefs.mojom"; import "chromeos/crosapi/mojom/remoting.mojom"; import "chromeos/crosapi/mojom/screen_manager.mojom"; @@ -63,8 +64,8 @@ // please note the milestone when you added it, to help us reason about // compatibility between the client applications and older ash-chrome binaries. // -// Next version: 35 -// Next method id: 40 +// Next version: 36 +// Next method id: 41 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e", RenamedFrom="crosapi.mojom.AshChromeService"] interface Crosapi { @@ -129,7 +130,8 @@ // Binds the DriveIntegrationService interface for getting information about // the local Google Drive mount. // Added in M93. - [MinVersion=29] BindDriveIntegrationService@34(pending_receiver<DriveIntegrationService> receiver); + [MinVersion=29] BindDriveIntegrationService@34( + pending_receiver<DriveIntegrationService> receiver); // Binds the FileManager interface for showing files, folders, etc. // Added in M88. @@ -223,6 +225,10 @@ [MinVersion=6] BindMediaSessionAudioFocusDebug@11( pending_receiver<media_session.mojom.AudioFocusManagerDebug> receiver); + // Binds the Power interface for power management. + // Added in M93. + [MinVersion=35] BindPower@40(pending_receiver<Power> receiver); + // Binds the System Display interface for querying display info. // Added in M92. [MinVersion=24] BindSystemDisplay@29(
diff --git a/chromeos/crosapi/mojom/power.mojom b/chromeos/crosapi/mojom/power.mojom new file mode 100644 index 0000000..87dd3dc2 --- /dev/null +++ b/chromeos/crosapi/mojom/power.mojom
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module crosapi.mojom; + +import "services/device/public/mojom/wake_lock.mojom"; + +// An empty interface to enable Power.AddPowerSaveBlocker() to maintain a +// connection to its caller, and free resources on disconnect. +[Stable, Uuid="742bde40-5689-44bb-807e-6252ff54d635"] +interface PowerWakeLock { +}; + +// Crosapi support for chrome.system.display extensions API. +[Stable, Uuid="878f8be2-ad59-4cc6-84ef-abc5102da696"] +interface Power { + // Creates a PowerSaveBlocker that lasts until |lock| disconnects. + AddPowerSaveBlocker@0(pending_remote<PowerWakeLock> lock, + device.mojom.WakeLockType type, + device.mojom.WakeLockReason reason, + string description); +};
diff --git a/chromeos/dbus/authpolicy/fake_authpolicy_client.cc b/chromeos/dbus/authpolicy/fake_authpolicy_client.cc index 3ec8f631..127918a 100644 --- a/chromeos/dbus/authpolicy/fake_authpolicy_client.cc +++ b/chromeos/dbus/authpolicy/fake_authpolicy_client.cc
@@ -8,6 +8,7 @@ #include <vector> #include "base/bind.h" +#include "base/files/file_util.h" #include "base/hash/md5.h" #include "base/location.h" #include "base/logging.h" @@ -58,6 +59,16 @@ std::make_unique<dbus::Signal>(interface_name, method_name).get()); } +// Reads the password from the file descriptor `password_fd`. +// Not very efficient, but simple! +std::string ReadPassword(int password_fd) { + std::string password; + char c; + while (base::ReadFromFD(password_fd, &c, 1)) + password.push_back(c); + return password; +} + } // namespace FakeAuthPolicyClient::FakeAuthPolicyClient() { @@ -121,6 +132,9 @@ int password_fd, AuthCallback callback) { DCHECK(InstallAttributes::Get()->IsActiveDirectoryManaged()); + + auth_password_ = ReadPassword(password_fd); + authpolicy::ErrorType error = authpolicy::ERROR_NONE; authpolicy::ActiveDirectoryAccountInfo account_info; if (auth_error_ != authpolicy::ERROR_NONE) {
diff --git a/chromeos/dbus/authpolicy/fake_authpolicy_client.h b/chromeos/dbus/authpolicy/fake_authpolicy_client.h index fc13b9c..afee0e9e 100644 --- a/chromeos/dbus/authpolicy/fake_authpolicy_client.h +++ b/chromeos/dbus/authpolicy/fake_authpolicy_client.h
@@ -41,7 +41,8 @@ int password_fd, JoinCallback callback) override; - // Runs |callback| with |auth_error_|. + // Runs `callback` with `auth_error_`. Stores given password in + // `auth_password_`. void AuthenticateUser(const authpolicy::AuthenticateUserRequest& request, int password_fd, AuthCallback callback) override; @@ -130,6 +131,8 @@ refresh_user_policy_error_ = error; } + std::string auth_password() const { return auth_password_; } + void DisableOperationDelayForTesting() { dbus_operation_delay_ = disk_operation_delay_ = base::TimeDelta::FromSeconds(0); @@ -156,6 +159,9 @@ std::string user_kerberos_creds_; std::string user_kerberos_conf_; + // Stores the password received in the last `AuthenticateUser()` call. + std::string auth_password_; + std::set<std::string> user_affiliation_ids_; std::set<std::string> device_affiliation_ids_;
diff --git a/chromeos/dbus/os_install/fake_os_install_client.cc b/chromeos/dbus/os_install/fake_os_install_client.cc index 11382a3..1f794514 100644 --- a/chromeos/dbus/os_install/fake_os_install_client.cc +++ b/chromeos/dbus/os_install/fake_os_install_client.cc
@@ -21,10 +21,18 @@ return observers_.HasObserver(observer); } +OsInstallClient::TestInterface* FakeOsInstallClient::GetTestInterface() { + return this; +} + void FakeOsInstallClient::StartOsInstall() { NotifyObservers(Status::InProgress, /*service_log=*/""); } +void FakeOsInstallClient::UpdateStatus(Status status) { + NotifyObservers(status, /*service_log=*/""); +} + void FakeOsInstallClient::NotifyObservers(Status status, const std::string& service_log) { for (auto& observer : observers_) {
diff --git a/chromeos/dbus/os_install/fake_os_install_client.h b/chromeos/dbus/os_install/fake_os_install_client.h index 2949fe2..7cec3c2f 100644 --- a/chromeos/dbus/os_install/fake_os_install_client.h +++ b/chromeos/dbus/os_install/fake_os_install_client.h
@@ -12,7 +12,8 @@ namespace chromeos { class COMPONENT_EXPORT(OS_INSTALL) FakeOsInstallClient - : public OsInstallClient { + : public OsInstallClient, + public OsInstallClient::TestInterface { public: FakeOsInstallClient(); ~FakeOsInstallClient() override; @@ -24,8 +25,12 @@ void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; bool HasObserver(const Observer* observer) const override; + TestInterface* GetTestInterface() override; void StartOsInstall() override; + // TestInterface overrides + void UpdateStatus(Status status) override; + private: void NotifyObservers(Status status, const std::string& service_log);
diff --git a/chromeos/dbus/os_install/os_install_client.cc b/chromeos/dbus/os_install/os_install_client.cc index 7aed86b..81011ac 100644 --- a/chromeos/dbus/os_install/os_install_client.cc +++ b/chromeos/dbus/os_install/os_install_client.cc
@@ -44,6 +44,7 @@ void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; bool HasObserver(const Observer* observer) const override; + TestInterface* GetTestInterface() override; void StartOsInstall() override; private: @@ -87,6 +88,10 @@ return observers_.HasObserver(observer); } +OsInstallClient::TestInterface* OsInstallClientImpl::GetTestInterface() { + return nullptr; +} + void OsInstallClientImpl::StartOsInstall() { dbus::MethodCall method_call(os_install_service::kOsInstallServiceInterface, os_install_service::kMethodStartOsInstall);
diff --git a/chromeos/dbus/os_install/os_install_client.h b/chromeos/dbus/os_install/os_install_client.h index 177d42e..82bdde8 100644 --- a/chromeos/dbus/os_install/os_install_client.h +++ b/chromeos/dbus/os_install/os_install_client.h
@@ -9,6 +9,7 @@ #include "base/component_export.h" #include "base/observer_list_types.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace dbus { class Bus; @@ -40,6 +41,11 @@ const std::string& service_log) = 0; }; + class TestInterface { + public: + virtual void UpdateStatus(Status status) = 0; + }; + OsInstallClient(const OsInstallClient&) = delete; OsInstallClient& operator=(const OsInstallClient&) = delete; @@ -61,6 +67,8 @@ // Returns true if this object has the given observer. virtual bool HasObserver(const Observer* observer) const = 0; + virtual TestInterface* GetTestInterface() = 0; + // Start the installation process. Status updates can be monitored // by adding an Observer. virtual void StartOsInstall() = 0;
diff --git a/chromeos/lacros/lacros_chrome_service_impl.cc b/chromeos/lacros/lacros_chrome_service_impl.cc index f8a6405..d1ca9bf 100644 --- a/chromeos/lacros/lacros_chrome_service_impl.cc +++ b/chromeos/lacros/lacros_chrome_service_impl.cc
@@ -31,6 +31,7 @@ #include "chromeos/crosapi/mojom/local_printer.mojom.h" #include "chromeos/crosapi/mojom/message_center.mojom.h" #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" +#include "chromeos/crosapi/mojom/power.mojom.h" #include "chromeos/crosapi/mojom/prefs.mojom.h" #include "chromeos/crosapi/mojom/remoting.mojom.h" #include "chromeos/crosapi/mojom/screen_manager.mojom.h" @@ -257,6 +258,8 @@ crosapi::mojom::NativeThemeService, &crosapi::mojom::Crosapi::BindNativeThemeService, Crosapi::MethodMinVersions::kBindNativeThemeServiceMinVersion>(); + ConstructRemote<crosapi::mojom::Power, &crosapi::mojom::Crosapi::BindPower, + Crosapi::MethodMinVersions::kBindPowerMinVersion>(); ConstructRemote<crosapi::mojom::Prefs, &crosapi::mojom::Crosapi::BindPrefs, Crosapi::MethodMinVersions::kBindPrefsMinVersion>(); ConstructRemote<crosapi::mojom::Remoting,
diff --git a/chromeos/network/onc/onc_normalizer.cc b/chromeos/network/onc/onc_normalizer.cc index b8bf8277..007d035 100644 --- a/chromeos/network/onc/onc_normalizer.cc +++ b/chromeos/network/onc/onc_normalizer.cc
@@ -236,6 +236,8 @@ std::string type; vpn->GetStringWithoutPathExpansion(::onc::vpn::kType, &type); RemoveEntryUnless(vpn, ::onc::vpn::kOpenVPN, type == ::onc::vpn::kOpenVPN); + RemoveEntryUnless(vpn, ::onc::vpn::kWireGuard, + type == ::onc::vpn::kWireGuard); RemoveEntryUnless( vpn, ::onc::vpn::kIPsec, type == ::onc::vpn::kIPsec || type == ::onc::vpn::kTypeL2TP_IPsec);
diff --git a/chromeos/network/onc/onc_translation_tables.cc b/chromeos/network/onc/onc_translation_tables.cc index 95b2ff8..aa2db2c 100644 --- a/chromeos/network/onc/onc_translation_tables.cc +++ b/chromeos/network/onc/onc_translation_tables.cc
@@ -326,6 +326,7 @@ const StringTranslationEntry kVPNTypeTable[] = { {::onc::vpn::kTypeL2TP_IPsec, shill::kProviderL2tpIpsec}, {::onc::vpn::kOpenVPN, shill::kProviderOpenVpn}, + {::onc::vpn::kWireGuard, shill::kProviderWireGuard}, {::onc::vpn::kThirdPartyVpn, shill::kProviderThirdPartyVpn}, {::onc::vpn::kArcVpn, shill::kProviderArcVpn}, {nullptr}};
diff --git a/chromeos/network/onc/onc_validator.cc b/chromeos/network/onc/onc_validator.cc index c377f7957..6b6a08d 100644 --- a/chromeos/network/onc/onc_validator.cc +++ b/chromeos/network/onc/onc_validator.cc
@@ -825,6 +825,7 @@ ::onc::vpn::kIPsec, ::onc::vpn::kTypeL2TP_IPsec, ::onc::vpn::kOpenVPN, + ::onc::vpn::kWireGuard, }; if (!managed_onc_) {
diff --git a/chromeos/services/assistant/BUILD.gn b/chromeos/services/assistant/BUILD.gn index 74126af..1e49741 100644 --- a/chromeos/services/assistant/BUILD.gn +++ b/chromeos/services/assistant/BUILD.gn
@@ -75,11 +75,10 @@ ] if (enable_cros_libassistant) { - deps += [ "//chromeos/services/libassistant" ] - - if (enable_libassistant_sandbox) { - deps += [ "//chromeos/services/assistant/public/cpp" ] - } + deps += [ + "//chromeos/services/assistant/public/cpp", + "//chromeos/services/libassistant", + ] } public_deps = [ @@ -102,6 +101,7 @@ "//ash/public/cpp/assistant/test_support", "//base", "//base/test:test_support", + "//chromeos/assistant:buildflags", "//chromeos/assistant/test_support", "//chromeos/dbus:test_support", "//chromeos/dbus/audio",
diff --git a/chromeos/services/assistant/libassistant_service_host_impl.cc b/chromeos/services/assistant/libassistant_service_host_impl.cc index 7b95165..2b13c08 100644 --- a/chromeos/services/assistant/libassistant_service_host_impl.cc +++ b/chromeos/services/assistant/libassistant_service_host_impl.cc
@@ -10,12 +10,10 @@ #include "chromeos/assistant/buildflags.h" #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) +#include "chromeos/services/assistant/public/cpp/assistant_client.h" +#include "chromeos/services/assistant/public/cpp/features.h" #include "chromeos/services/libassistant/libassistant_service.h" - -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) -#include "chromeos/services/assistant/public/cpp/assistant_client.h" // nogncheck -#include "chromeos/services/libassistant/public/mojom/service.mojom-forward.h" // nogncheck -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#include "chromeos/services/libassistant/public/mojom/service.mojom-forward.h" #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) namespace chromeos { @@ -24,9 +22,7 @@ #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) LibassistantServiceHostImpl::LibassistantServiceHostImpl() { -#if !BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) DETACH_FROM_SEQUENCE(sequence_checker_); -#endif } LibassistantServiceHostImpl::~LibassistantServiceHostImpl() = default; @@ -34,22 +30,20 @@ void LibassistantServiceHostImpl::Launch( mojo::PendingReceiver<chromeos::libassistant::mojom::LibassistantService> receiver) { -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) - AssistantClient::Get()->RequestLibassistantService(std::move(receiver)); -#else DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!libassistant_service_); - libassistant_service_ = - std::make_unique<chromeos::libassistant::LibassistantService>( - std::move(receiver)); -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) + if (assistant::features::IsLibAssistantSandboxEnabled()) { + AssistantClient::Get()->RequestLibassistantService(std::move(receiver)); + } else { + DCHECK(!libassistant_service_); + libassistant_service_ = + std::make_unique<chromeos::libassistant::LibassistantService>( + std::move(receiver)); + } } void LibassistantServiceHostImpl::Stop() { -#if !BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); libassistant_service_ = nullptr; -#endif } #else
diff --git a/chromeos/services/assistant/libassistant_service_host_impl.h b/chromeos/services/assistant/libassistant_service_host_impl.h index 7156f29..864e52e 100644 --- a/chromeos/services/assistant/libassistant_service_host_impl.h +++ b/chromeos/services/assistant/libassistant_service_host_impl.h
@@ -37,8 +37,7 @@ void Stop() override; private: -#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) && \ - !BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) SEQUENCE_CHECKER(sequence_checker_); std::unique_ptr<chromeos::libassistant::LibassistantService> libassistant_service_ GUARDED_BY_CONTEXT(sequence_checker_);
diff --git a/chromeos/services/assistant/public/cpp/assistant_client.h b/chromeos/services/assistant/public/cpp/assistant_client.h index 3d187bea..3e41b29 100644 --- a/chromeos/services/assistant/public/cpp/assistant_client.h +++ b/chromeos/services/assistant/public/cpp/assistant_client.h
@@ -19,9 +19,9 @@ #include "services/media_session/public/mojom/audio_focus.mojom.h" #include "services/media_session/public/mojom/media_controller.mojom.h" -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/services/libassistant/public/mojom/service.mojom-forward.h" -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) namespace chromeos { namespace assistant { @@ -80,12 +80,12 @@ mojo::PendingReceiver<chromeos::network_config::mojom::CrosNetworkConfig> receiver) = 0; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) // Requests a connection to Libassistant service interface via the browser. virtual void RequestLibassistantService( mojo::PendingReceiver<chromeos::libassistant::mojom::LibassistantService> receiver) = 0; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) }; } // namespace assistant
diff --git a/chromeos/services/assistant/public/cpp/features.cc b/chromeos/services/assistant/public/cpp/features.cc index 0b19075a..9324cb0 100644 --- a/chromeos/services/assistant/public/cpp/features.cc +++ b/chromeos/services/assistant/public/cpp/features.cc
@@ -54,6 +54,9 @@ const base::Feature kDisableVoiceMatch{"DisableVoiceMatch", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kEnableLibAssistantSandbox{ + "LibAssistantSandbox", base::FEATURE_DISABLED_BY_DEFAULT}; + bool IsAppSupportEnabled() { return base::FeatureList::IsEnabled( assistant::features::kAssistantAppSupport); @@ -113,6 +116,10 @@ return base::FeatureList::IsEnabled(kAssistantWaitScheduling); } +bool IsLibAssistantSandboxEnabled() { + return base::FeatureList::IsEnabled(kEnableLibAssistantSandbox); +} + } // namespace features } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/public/cpp/features.h b/chromeos/services/assistant/public/cpp/features.h index 2e9576b..0102577 100644 --- a/chromeos/services/assistant/public/cpp/features.h +++ b/chromeos/services/assistant/public/cpp/features.h
@@ -60,6 +60,10 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnableLibAssistantBetaBackend; +// Enables the sandbox of LibAssistant service. +COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) +extern const base::Feature kEnableLibAssistantSandbox; + COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAppSupportEnabled(); COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAudioEraserEnabled(); @@ -92,6 +96,9 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsWaitSchedulingEnabled(); +COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) +bool IsLibAssistantSandboxEnabled(); + } // namespace features } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/test_support/scoped_assistant_client.h b/chromeos/services/assistant/test_support/scoped_assistant_client.h index 278e346..cc661d7 100644 --- a/chromeos/services/assistant/test_support/scoped_assistant_client.h +++ b/chromeos/services/assistant/test_support/scoped_assistant_client.h
@@ -6,6 +6,7 @@ #define CHROMEOS_SERVICES_ASSISTANT_TEST_SUPPORT_SCOPED_ASSISTANT_CLIENT_H_ #include "base/macros.h" +#include "chromeos/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/assistant_client.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -54,6 +55,11 @@ void RequestNetworkConfig( mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver) override {} +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) + void RequestLibassistantService( + mojo::PendingReceiver<chromeos::libassistant::mojom::LibassistantService> + receiver) override {} +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) private: mojo::Receiver<media_session::mojom::MediaControllerManager>*
diff --git a/chromeos/services/libassistant/BUILD.gn b/chromeos/services/libassistant/BUILD.gn index f96621f..5a5233d 100644 --- a/chromeos/services/libassistant/BUILD.gn +++ b/chromeos/services/libassistant/BUILD.gn
@@ -110,7 +110,7 @@ deps = [ ":audio", ":constants", - "//build/util:webkit_version", + "//build/util:chromium_git_revision", "//chromeos/assistant:buildflags", "//chromeos/assistant/internal", "//chromeos/assistant/internal:buildflags",
diff --git a/chromeos/services/libassistant/util.cc b/chromeos/services/libassistant/util.cc index 766cac1..1cee857 100644 --- a/chromeos/services/libassistant/util.cc +++ b/chromeos/services/libassistant/util.cc
@@ -11,7 +11,7 @@ #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" #include "base/values.h" -#include "build/util/webkit_version.h" +#include "build/util/chromium_git_revision.h" #include "chromeos/assistant/buildflags.h" #include "chromeos/assistant/internal/internal_constants.h" #include "chromeos/assistant/internal/internal_util.h" @@ -42,11 +42,10 @@ DCHECK(user_agent->empty()); base::StringAppendF(user_agent, "Mozilla/5.0 (X11; CrOS %s %s; %s) " - "AppleWebKit/%d.%d (KHTML, like Gecko)", + "AppleWebKit/537.36 (KHTML, like Gecko)", base::SysInfo::OperatingSystemArchitecture().c_str(), base::SysInfo::OperatingSystemVersion().c_str(), - base::SysInfo::GetLsbReleaseBoard().c_str(), - WEBKIT_VERSION_MAJOR, WEBKIT_VERSION_MINOR); + base::SysInfo::GetLsbReleaseBoard().c_str()); std::string arc_version = chromeos::version_loader::GetARCVersion(); if (!arc_version.empty()) @@ -219,9 +218,12 @@ if (ShouldPutLogsInHomeDirectory()) { base::FilePath log_path = GetBaseAssistantDir().Append(FILE_PATH_LITERAL("log")); -#if !BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) - CHECK(base::CreateDirectory(log_path)); -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) + + // The directory will be created by LibassistantPreSandboxHook if sandbox + // is enabled. + if (!assistant::features::IsLibAssistantSandboxEnabled()) + CHECK(base::CreateDirectory(log_path)); + log_dir = log_path.value(); }
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index 153e9e0b..60f1863 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -179,6 +179,8 @@ return mojom::VpnType::kL2TPIPsec; if (onc_vpn_type == ::onc::vpn::kOpenVPN) return mojom::VpnType::kOpenVPN; + if (onc_vpn_type == ::onc::vpn::kWireGuard) + return mojom::VpnType::kWireGuard; if (onc_vpn_type == ::onc::vpn::kThirdPartyVpn) return mojom::VpnType::kExtension; if (onc_vpn_type == ::onc::vpn::kArcVpn) @@ -193,6 +195,8 @@ return ::onc::vpn::kTypeL2TP_IPsec; case mojom::VpnType::kOpenVPN: return ::onc::vpn::kOpenVPN; + case mojom::VpnType::kWireGuard: + return ::onc::vpn::kWireGuard; case mojom::VpnType::kExtension: return ::onc::vpn::kThirdPartyVpn; case mojom::VpnType::kArc: @@ -1507,6 +1511,9 @@ vpn->open_vpn = GetManagedOpenVPNProperties(vpn_dict, ::onc::vpn::kOpenVPN); break; + case mojom::VpnType::kWireGuard: + // TODO: Detail Managed ONC implemention in following patches + break; case mojom::VpnType::kExtension: case mojom::VpnType::kArc: const base::Value* third_party_dict =
diff --git a/chromeos/services/network_config/public/mojom/cros_network_config.mojom b/chromeos/services/network_config/public/mojom/cros_network_config.mojom index 28f0e46..db1f38f 100644 --- a/chromeos/services/network_config/public/mojom/cros_network_config.mojom +++ b/chromeos/services/network_config/public/mojom/cros_network_config.mojom
@@ -70,6 +70,7 @@ // Internal VPN types. kL2TPIPsec, kOpenVPN, + kWireGuard, // VPN provided by a Chrome Extension. kExtension, // VPN provided by an Arc++ app.
diff --git a/components/BUILD.gn b/components/BUILD.gn index a349a2de..eb17499 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -493,13 +493,23 @@ # TODO(crbug / 1056278): Enable this on Fuchsia if (safe_browsing_mode != 0 && !is_fuchsia) { - deps += [ "//components/safe_browsing/core:file_type_policies_unittest" ] + deps += [ + "//components/safe_browsing/core:file_type_policies_unittest", + "//components/safe_browsing/core/browser/download:unittests", + ] } if (safe_browsing_mode == 1) { deps += [ + "//components/safe_browsing/content/renderer:websocket_sb_handshake_throttle_unittest", + "//components/safe_browsing/content/triggers:ad_redirect_trigger", + "//components/safe_browsing/core:features_unittest", + "//components/safe_browsing/core:ping_manager_unittest", "//components/safe_browsing/core:verdict_cache_manager_unittest", + "//components/safe_browsing/core/browser:safe_browsing_url_checker_unittest", + "//components/safe_browsing/core/browser/sync:unittests", "//components/safe_browsing/core/db:unit_tests_local_db", + "//components/safe_browsing/core/db:v4_test_util", ] } else if (safe_browsing_mode == 2) { deps += [ "//components/safe_browsing/android:unit_tests_mobile" ] @@ -522,7 +532,10 @@ } if (enable_pdf) { - deps += [ "//components/pdf/renderer:unit_tests" ] + deps += [ + "//components/pdf/browser:unit_tests", + "//components/pdf/renderer:unit_tests", + ] } # On LaCrOS, tests use ash - chrome as a window manager, thus the dependency.
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc index 5a07a7e..ab4db5e 100644 --- a/components/autofill/core/browser/autofill_client.cc +++ b/components/autofill/core/browser/autofill_client.cc
@@ -66,7 +66,8 @@ } void AutofillClient::OnVirtualCardFetched(const CreditCard* credit_card, - const std::u16string& cvc) { + const std::u16string& cvc, + const gfx::Image& card_image) { // This is overridden by platform subclasses. Currently only // ChromeAutofillClient (Chrome Desktop & Android) implements this. }
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h index 4d691deb..f76acd17 100644 --- a/components/autofill/core/browser/autofill_client.h +++ b/components/autofill/core/browser/autofill_client.h
@@ -26,6 +26,7 @@ #include "services/metrics/public/cpp/ukm_source_id.h" #include "ui/base/window_open_disposition.h" #include "ui/gfx/geometry/rect_f.h" +#include "ui/gfx/image/image.h" #include "url/gurl.h" #if !defined(OS_IOS) @@ -563,8 +564,10 @@ // Indicates that the virtual card was fetched in order to allow the user to // manually fill payment form with the fetched |credit_card| and |cvc|. + // |card_image| is used for manual fallback bubble. virtual void OnVirtualCardFetched(const CreditCard* credit_card, - const std::u16string& cvc); + const std::u16string& cvc, + const gfx::Image& card_image); // Returns true if the Autofill Assistant UI is currently being shown. virtual bool IsAutofillAssistantShowing();
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc index e7e4c3e28e..00dc6bc 100644 --- a/components/autofill/core/browser/browser_autofill_manager.cc +++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -96,6 +96,7 @@ #include "services/network/public/cpp/shared_url_loader_factory.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/image/image.h" #include "url/gurl.h" #if defined(OS_IOS) @@ -1480,8 +1481,11 @@ // If synced down card is a virtual card, let the client know so that it can // show the UI to help user to manually fill the form, if needed. - if (credit_card->record_type() == CreditCard::VIRTUAL_CARD) - client()->OnVirtualCardFetched(credit_card, cvc); + if (credit_card->record_type() == CreditCard::VIRTUAL_CARD) { + // TODO(crbug.com/1196021): Pass in real card image. + client()->OnVirtualCardFetched(credit_card, cvc, + /* card_image */ gfx::Image()); + } FillCreditCardForm(credit_card_query_id_, credit_card_form_, credit_card_field_, *credit_card, cvc);
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h index 9ae2baf..9088ea198 100644 --- a/components/autofill/core/browser/test_autofill_client.h +++ b/components/autofill/core/browser/test_autofill_client.h
@@ -225,7 +225,8 @@ return save_credit_card_options_.value(); } - MockAutocompleteHistoryManager* GetMockAutocompleteHistoryManager() { + ::testing::NiceMock<MockAutocompleteHistoryManager>* + GetMockAutocompleteHistoryManager() { return &mock_autocomplete_history_manager_; } @@ -253,7 +254,8 @@ syncer::SyncService* test_sync_service_ = nullptr; TestAddressNormalizer test_address_normalizer_; TestPersonalDataManager test_personal_data_manager_; - MockAutocompleteHistoryManager mock_autocomplete_history_manager_; + ::testing::NiceMock<MockAutocompleteHistoryManager> + mock_autocomplete_history_manager_; std::unique_ptr<AutofillOfferManager> autofill_offer_manager_; // NULL by default.
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm index 5fcc905..3fdc6d7 100644 --- a/components/autofill/ios/browser/autofill_agent.mm +++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -424,10 +424,23 @@ suggestion.identifier, std::string(), 0); } - } else if (suggestion.identifier == - autofill::POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY) { - web::WebFrame* frame = - web::GetWebFrameWithId(_webState, SysNSStringToUTF8(frameID)); + return; + } + + web::WebFrame* frame = + web::GetWebFrameWithId(_webState, SysNSStringToUTF8(frameID)); + if (!frame) { + // The frame no longer exists, so the field can not be filled. + if (_suggestionHandledCompletion) { + SuggestionHandledCompletion suggestionHandledCompletionCopy = + [_suggestionHandledCompletion copy]; + _suggestionHandledCompletion = nil; + suggestionHandledCompletionCopy(); + } + return; + } + + if (suggestion.identifier == autofill::POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY) { // FormSuggestion is a simple, single value that can be filled out now. [self fillField:SysNSStringToUTF8(fieldIdentifier) uniqueFieldID:uniqueFieldID @@ -435,8 +448,6 @@ value:SysNSStringToUTF16(suggestion.value) inFrame:frame]; } else if (suggestion.identifier == autofill::POPUP_ITEM_ID_CLEAR_FORM) { - web::WebFrame* frame = - web::GetWebFrameWithId(_webState, SysNSStringToUTF8(frameID)); __weak AutofillAgent* weakSelf = self; SuggestionHandledCompletion suggestionHandledCompletionCopy = [_suggestionHandledCompletion copy]; @@ -454,8 +465,6 @@ } else if (suggestion.identifier == autofill::POPUP_ITEM_ID_SHOW_ACCOUNT_CARDS) { - web::WebFrame* frame = - GetWebFrameWithId(_webState, SysNSStringToUTF8(frameID)); autofill::BrowserAutofillManager* autofillManager = [self autofillManagerFromWebState:_webState webFrame:frame]; if (autofillManager) {
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp index 1c016fe..37ad9790 100644 --- a/components/autofill_payments_strings.grdp +++ b/components/autofill_payments_strings.grdp
@@ -502,7 +502,7 @@ Virtual number: </message> <message name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_EXP_DATE_LABEL" desc="Text shown next to the virtual card expiration date in the virtual card manual fallback bubble on Desktop. This bubble shows the complete information for the virtual card selected to fill the form."> - Month/Year: + Expiration date: </message> <message name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_CARDHOLDER_NAME_LABEL" desc="Text shown next to the virtual card name on card field in the virtual card manual fallback bubble on Desktop. This bubble shows the complete information for the virtual card selected to fill the form."> Name on card:
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_EXP_DATE_LABEL.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_EXP_DATE_LABEL.png.sha1 index 67b260d..ff67df87 100644 --- a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_EXP_DATE_LABEL.png.sha1 +++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_EXP_DATE_LABEL.png.sha1
@@ -1 +1 @@ -162070d949f0497137ad125f4299973b3932ab79 \ No newline at end of file +13c6b1a7eb09b810ecf9feb5de52a37291c48b2f \ No newline at end of file
diff --git a/components/browser_ui/styles/android/java/res/values-night/styles.xml b/components/browser_ui/styles/android/java/res/values-night/styles.xml index 50e54d9..37e7cdb3 100644 --- a/components/browser_ui/styles/android/java/res/values-night/styles.xml +++ b/components/browser_ui/styles/android/java/res/values-night/styles.xml
@@ -12,5 +12,7 @@ <item name="colorOnBackground">@color/modern_white</item> <item name="colorOnSurfaceVariant">@color/white_alpha_70</item> <item name="colorOnSurfaceInverse">@color/modern_grey_800</item> + <item name="android:textColorPrimary">?attr/colorOnBackground</item> + <item name="android:textColorSecondary">?attr/colorOnSurfaceVariant</item> </style> </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml index 9dbd641..c17b9a0 100644 --- a/components/browser_ui/styles/android/java/res/values/styles.xml +++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -188,5 +188,7 @@ <item name="colorOnBackground">@color/modern_grey_900</item> <item name="colorOnSurfaceVariant">@color/modern_grey_700</item> <item name="colorOnSurfaceInverse">@color/modern_white</item> + <item name="android:textColorPrimary">?attr/colorOnBackground</item> + <item name="android:textColorSecondary">?attr/colorOnSurfaceVariant</item> </style> </resources>
diff --git a/components/cast/message_port/message_port_cast.cc b/components/cast/message_port/message_port_cast.cc index 231f8ce..4f887e7 100644 --- a/components/cast/message_port/message_port_cast.cc +++ b/components/cast/message_port/message_port_cast.cc
@@ -8,6 +8,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "third_party/blink/public/common/messaging/message_port_descriptor.h" namespace cast_api_bindings { @@ -26,6 +27,13 @@ } // static +std::unique_ptr<MessagePort> MessagePortCast::Create( + blink::MessagePortDescriptor&& port_descriptor) { + return std::make_unique<MessagePortCast>( + blink::WebMessagePort::Create(std::move(port_descriptor))); +} + +// static MessagePortCast* MessagePortCast::FromMessagePort(MessagePort* port) { DCHECK(port); // This is safe because there is one MessagePort implementation per platform
diff --git a/components/cast/message_port/message_port_cast.h b/components/cast/message_port/message_port_cast.h index 202bc174..5fe28add 100644 --- a/components/cast/message_port/message_port_cast.h +++ b/components/cast/message_port/message_port_cast.h
@@ -8,6 +8,10 @@ #include "components/cast/message_port/message_port.h" #include "third_party/blink/public/common/messaging/web_message_port.h" +namespace blink { +class MessagePortDescriptor; +} + namespace cast_api_bindings { // Abstraction of HTML MessagePortCast away from blink::WebMessagePort @@ -22,6 +26,8 @@ MessagePortCast& operator=(const MessagePortCast&) = delete; static std::unique_ptr<MessagePort> Create(blink::WebMessagePort&& port); + static std::unique_ptr<MessagePort> Create( + blink::MessagePortDescriptor&& port_descriptor); // Gets the implementation of |port| for callers who know its platform type. static MessagePortCast* FromMessagePort(MessagePort* port);
diff --git a/components/content_settings/browser/page_specific_content_settings.cc b/components/content_settings/browser/page_specific_content_settings.cc index 7d55a34..25e4f27 100644 --- a/components/content_settings/browser/page_specific_content_settings.cc +++ b/components/content_settings/browser/page_specific_content_settings.cc
@@ -657,7 +657,7 @@ handler_.NotifySiteDataObservers(); } -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) void PageSpecificContentSettings::OnProtectedMediaIdentifierPermissionSet( const GURL& requesting_origin, bool allowed) {
diff --git a/components/content_settings/browser/page_specific_content_settings.h b/components/content_settings/browser/page_specific_content_settings.h index 55fc1ec..6819ad4 100644 --- a/components/content_settings/browser/page_specific_content_settings.h +++ b/components/content_settings/browser/page_specific_content_settings.h
@@ -359,7 +359,7 @@ const blink::StorageKey& storage_key, bool blocked_by_policy); void OnWebDatabaseAccessed(const GURL& url, bool blocked_by_policy); -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) void OnProtectedMediaIdentifierPermissionSet(const GURL& requesting_frame, bool allowed); #endif
diff --git a/components/content_settings/core/browser/content_settings_registry_unittest.cc b/components/content_settings/core/browser/content_settings_registry_unittest.cc index b6d6b505..23b91a6 100644 --- a/components/content_settings/core/browser/content_settings_registry_unittest.cc +++ b/components/content_settings/core/browser/content_settings_registry_unittest.cc
@@ -52,7 +52,7 @@ #endif // Protected media identifier only registered on Android, Chrome OS and Windows. -#if defined(ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) EXPECT_TRUE(registry()->Get(ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER)); #else EXPECT_FALSE(
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc index 5389b9aa3..be0b2df44 100644 --- a/components/content_settings/core/browser/website_settings_registry.cc +++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -67,15 +67,13 @@ #if defined(OS_WIN) if (!(platform & PLATFORM_WINDOWS)) return nullptr; -// TODO(crbug.com/1052397): Revisit the macro expression once build flag switch -// of lacros-chrome is complete. -#elif defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) +#elif defined(OS_LINUX) if (!(platform & PLATFORM_LINUX)) return nullptr; #elif defined(OS_MAC) if (!(platform & PLATFORM_MAC)) return nullptr; -#elif BUILDFLAG(IS_CHROMEOS_ASH) +#elif defined(OS_CHROMEOS) if (!(platform & PLATFORM_CHROMEOS)) return nullptr; #elif defined(OS_ANDROID)
diff --git a/components/content_settings/renderer/content_settings_agent_impl.cc b/components/content_settings/renderer/content_settings_agent_impl.cc index ab24e00..ae9907bf 100644 --- a/components/content_settings/renderer/content_settings_agent_impl.cc +++ b/components/content_settings/renderer/content_settings_agent_impl.cc
@@ -20,7 +20,6 @@ #include "content/public/common/url_constants.h" #include "content/public/renderer/document_state.h" #include "content/public/renderer/render_frame.h" -#include "content/public/renderer/render_view.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" @@ -112,8 +111,7 @@ &ContentSettingsAgentImpl::OnContentSettingsAgentRequest, base::Unretained(this))); - content::RenderFrame* main_frame = - render_frame->GetRenderView()->GetMainRenderFrame(); + content::RenderFrame* main_frame = render_frame->GetMainRenderFrame(); // TODO(nasko): The main frame is not guaranteed to be in the same process // with this frame with --site-per-process. This code needs to be updated // to handle this case. See https://crbug.com/496670.
diff --git a/components/data_reduction_proxy/DEPS b/components/data_reduction_proxy/DEPS index dd5b47d..8d8a32f 100644 --- a/components/data_reduction_proxy/DEPS +++ b/components/data_reduction_proxy/DEPS
@@ -6,8 +6,7 @@ "+crypto", "+google_apis", "+net", - "+mojo/public/cpp", - "+services/network/public/cpp", + "+mojo/public/cpp", "+services/network/public/mojom", "-components"
diff --git a/components/data_reduction_proxy/core/browser/BUILD.gn b/components/data_reduction_proxy/core/browser/BUILD.gn index 9fa58c38..c2165d9 100644 --- a/components/data_reduction_proxy/core/browser/BUILD.gn +++ b/components/data_reduction_proxy/core/browser/BUILD.gn
@@ -16,8 +16,6 @@ "data_reduction_proxy_service.h", "data_reduction_proxy_settings.cc", "data_reduction_proxy_settings.h", - "data_reduction_proxy_util.cc", - "data_reduction_proxy_util.h", "data_store.cc", "data_store.h", "data_usage_store.cc", @@ -71,7 +69,6 @@ "//google_apis", "//net", "//services/network:network_service", - "//services/network/public/cpp", "//third_party/leveldatabase", "//url", ] @@ -97,7 +94,6 @@ deps = [ "//base", "//components/data_reduction_proxy/core/common", - "//components/data_reduction_proxy/core/common:test_support", "//components/data_use_measurement/core", "//components/data_use_measurement/core:ascriber", "//components/prefs:test_support", @@ -144,14 +140,12 @@ "//base", "//base/test:test_support", "//build:chromeos_buildflags", - "//components/data_reduction_proxy/core/common:test_support", "//components/data_reduction_proxy/proto:data_reduction_proxy_proto", "//components/data_use_measurement/core:ascriber", "//components/prefs:test_support", "//components/variations:test_support", "//net:test_support", "//services/network:test_support", - "//services/network/public/cpp", "//testing/gmock", "//testing/gtest", ]
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc index 590ca72..2952232 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
@@ -368,7 +368,6 @@ int64_t data_used, int64_t original_size, bool data_saver_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, bool is_user_traffic, data_use_measurement::DataUseUserData::DataUseContentType content_type, @@ -383,7 +382,7 @@ original_size); RecordRequestSizePrefs(data_used, original_size, data_saver_enabled, - request_type, mime_type, base::Time::Now()); + mime_type, base::Time::Now()); RecordWeeklyAggregateDataUse( base::Time::Now(), std::round(static_cast<double>(data_used) / 1024), is_user_traffic, content_type, service_hash_code); @@ -636,7 +635,6 @@ int64_t data_used, int64_t original_size, bool with_data_saver_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, const base::Time& now) { // TODO(bengr): Remove this check once the underlying cause of
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h index 524d92f..f35fb70 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
@@ -86,7 +86,6 @@ int64_t compressed_size, int64_t original_size, bool data_reduction_proxy_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, bool is_user_traffic, data_use_measurement::DataUseUserData::DataUseContentType content_type, @@ -214,7 +213,6 @@ void RecordRequestSizePrefs(int64_t compressed_size, int64_t original_size, bool with_data_reduction_proxy_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, const base::Time& now);
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc index f45c0766..1e3f187 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats_unittest.cc
@@ -276,21 +276,19 @@ void RecordContentLengthPrefs(int64_t received_content_length, int64_t original_content_length, bool with_data_reduction_proxy_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, base::Time now) { compression_stats_->RecordRequestSizePrefs( received_content_length, original_content_length, - with_data_reduction_proxy_enabled, request_type, mime_type, now); + with_data_reduction_proxy_enabled, mime_type, now); } void RecordContentLengthPrefs(int64_t received_content_length, int64_t original_content_length, bool with_data_reduction_proxy_enabled, - DataReductionProxyRequestType request_type, base::Time now) { RecordContentLengthPrefs(received_content_length, original_content_length, - with_data_reduction_proxy_enabled, request_type, + with_data_reduction_proxy_enabled, "application/octet-stream", now); } @@ -440,8 +438,7 @@ compression_stats()->RecordDataUseWithMimeType( kReceivedLength, kOriginalLength, IsDataReductionProxyEnabled(), - UNKNOWN_TYPE, std::string(), true, - data_use_measurement::DataUseUserData::OTHER, 0); + std::string(), true, data_use_measurement::DataUseUserData::OTHER, 0); EXPECT_EQ(kReceivedLength, GetInt64(data_reduction_proxy::prefs::kHttpReceivedContentLength)); @@ -452,8 +449,7 @@ // Record the same numbers again, and total lengths should be doubled. compression_stats()->RecordDataUseWithMimeType( kReceivedLength, kOriginalLength, IsDataReductionProxyEnabled(), - UNKNOWN_TYPE, std::string(), true, - data_use_measurement::DataUseUserData::OTHER, 0); + std::string(), true, data_use_measurement::DataUseUserData::OTHER, 0); EXPECT_EQ(kReceivedLength * 2, GetInt64(data_reduction_proxy::prefs::kHttpReceivedContentLength)); @@ -468,9 +464,7 @@ int64_t original[] = {kOriginalLength}; int64_t received[] = {kReceivedLength}; - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory); @@ -481,35 +475,29 @@ const int64_t kReceivedLength = 100; int64_t original[] = {kOriginalLength}; int64_t received[] = {kReceivedLength}; - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, false, UNKNOWN_TYPE, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, false, FakeNow()); VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, UNKNOWN_TYPE, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[0] += kOriginalLength; received[0] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[0] += kOriginalLength; received[0] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, UNKNOWN_TYPE, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[0] += kOriginalLength; received[0] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, false, UNKNOWN_TYPE, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, false, FakeNow()); original[0] += kOriginalLength; received[0] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, @@ -520,16 +508,13 @@ const int64_t kOriginalLength = 200; const int64_t kReceivedLength = 100; - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); // Forward one day. SetFakeTimeDeltaInHours(24); // Proxy not enabled. Not via proxy. - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, false, UNKNOWN_TYPE, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, false, FakeNow()); int64_t original[] = {kOriginalLength, kOriginalLength}; int64_t received[] = {kReceivedLength, kReceivedLength}; @@ -537,17 +522,14 @@ kNumDaysInHistory); // Proxy enabled. Not via proxy. - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, UNKNOWN_TYPE, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[1] += kOriginalLength; received[1] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 2, received, 2, kNumDaysInHistory); // Proxy enabled and via proxy. - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[1] += kOriginalLength; received[1] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 2, received, 2, @@ -557,7 +539,7 @@ const int64_t kBigOriginalLength = 0x300000000LL; // 12G. const int64_t kBigReceivedLength = 0x200000000LL; // 8G. RecordContentLengthPrefs(kBigReceivedLength, kBigOriginalLength, true, - VIA_DATA_REDUCTION_PROXY, FakeNow()); + FakeNow()); original[1] += kBigOriginalLength; received[1] += kBigReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 2, received, 2, @@ -570,18 +552,14 @@ int64_t original[] = {0, kOriginalLength}; int64_t received[] = {0, kReceivedLength}; - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); VerifyDailyDataSavingContentLengthPrefLists(original, 2, received, 2, kNumDaysInHistory); // Forward 10 hours, stay in the same day. // See kLastUpdateTime: "Now" in test is 03:45am. SetFakeTimeDeltaInHours(10); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[1] += kOriginalLength; received[1] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 2, received, 2, @@ -589,9 +567,7 @@ // Forward 11 more hours, comes to tomorrow. AddFakeTimeDeltaInHours(11); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); int64_t original2[] = {kOriginalLength * 2, kOriginalLength}; int64_t received2[] = {kReceivedLength * 2, kReceivedLength}; VerifyDailyDataSavingContentLengthPrefLists(original2, 2, received2, 2, @@ -605,15 +581,11 @@ int64_t original[] = {kOriginalLength}; int64_t received[] = {kReceivedLength}; - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); // Backward one day, expect no count. SetFakeTimeDeltaInHours(-24); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); original[0] += kOriginalLength; received[0] += kReceivedLength; VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, @@ -623,9 +595,7 @@ // Then forward one day, expect no count. AddFakeTimeDeltaInHours(24); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); int64_t original2[] = {kOriginalLength * 2, kOriginalLength}; int64_t received2[] = {kReceivedLength * 2, kReceivedLength}; VerifyDailyDataSavingContentLengthPrefLists(original2, 2, received2, 2, @@ -641,15 +611,11 @@ int64_t original[] = {kOriginalLength}; int64_t received[] = {kReceivedLength}; - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); // Backward two days, expect SYSTEM_CLOCK_MOVED_BACK. SetFakeTimeDeltaInHours(-2 * 24); - RecordContentLengthPrefs( - kReceivedLength, kOriginalLength, true, VIA_DATA_REDUCTION_PROXY, - FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory); histogram_tester.ExpectUniqueSample( @@ -658,16 +624,14 @@ // Backward another two days, expect SYSTEM_CLOCK_MOVED_BACK. SetFakeTimeDeltaInHours(-4 * 24); - RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, - VIA_DATA_REDUCTION_PROXY, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); histogram_tester.ExpectUniqueSample( "DataReductionProxy.SavingsCleared.Reason", DataReductionProxySavingsClearedReason::SYSTEM_CLOCK_MOVED_BACK, 2); // Forward 2 days, expect no change. AddFakeTimeDeltaInHours(2 * 24); - RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, - VIA_DATA_REDUCTION_PROXY, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); histogram_tester.ExpectUniqueSample( "DataReductionProxy.SavingsCleared.Reason", DataReductionProxySavingsClearedReason::SYSTEM_CLOCK_MOVED_BACK, 2); @@ -951,8 +915,7 @@ int64_t original[] = {kOriginalLength}; int64_t received[] = {kReceivedLength}; - RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, - VIA_DATA_REDUCTION_PROXY, FakeNow()); + RecordContentLengthPrefs(kReceivedLength, kOriginalLength, true, FakeNow()); VerifyDailyDataSavingContentLengthPrefLists(original, 1, received, 1, kNumDaysInHistory);
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc deleted file mode 100644 index 62d8f02f..0000000 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_data_unittest.cc +++ /dev/null
@@ -1,131 +0,0 @@ -// Copyright 2016 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/data_reduction_proxy/core/browser/data_reduction_proxy_data.h" - -#include <stdint.h> - -#include <memory> -#include <string> - -#include "base/cxx17_backports.h" -#include "base/test/task_environment.h" -#include "components/variations/scoped_variations_ids_provider.h" -#include "net/base/request_priority.h" -#include "net/nqe/effective_connection_type.h" -#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "url/gurl.h" - -namespace data_reduction_proxy { - -namespace { - -class DataReductionProxyDataTest : public testing::Test { - public: - DataReductionProxyDataTest() {} - - private: - base::test::SingleThreadTaskEnvironment task_environment_{ - base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; - variations::ScopedVariationsIdsProvider scoped_variations_ids_provider_{ - variations::VariationsIdsProvider::Mode::kUseSignedInState}; -}; - -TEST_F(DataReductionProxyDataTest, BasicSettersAndGetters) { - std::unique_ptr<DataReductionProxyData> data(new DataReductionProxyData()); - EXPECT_FALSE(data->used_data_reduction_proxy()); - data->set_used_data_reduction_proxy(true); - EXPECT_TRUE(data->used_data_reduction_proxy()); - data->set_used_data_reduction_proxy(false); - EXPECT_FALSE(data->used_data_reduction_proxy()); - - EXPECT_FALSE(data->lite_page_received()); - data->set_lite_page_received(true); - EXPECT_TRUE(data->lite_page_received()); - data->set_lite_page_received(false); - EXPECT_FALSE(data->lite_page_received()); - - EXPECT_FALSE(data->black_listed()); - data->set_black_listed(true); - EXPECT_TRUE(data->black_listed()); - data->set_black_listed(false); - EXPECT_FALSE(data->black_listed()); - - EXPECT_EQ(std::string(), data->session_key()); - std::string session_key = "test-key"; - data->set_session_key(session_key); - EXPECT_EQ(session_key, data->session_key()); - - EXPECT_EQ(GURL(std::string()), data->request_url()); - GURL test_url("test-url"); - data->set_request_url(test_url); - EXPECT_EQ(test_url, data->request_url()); - - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN, - data->effective_connection_type()); - data->set_effective_connection_type(net::EFFECTIVE_CONNECTION_TYPE_OFFLINE); - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_OFFLINE, - data->effective_connection_type()); - - EXPECT_EQ(net::NetworkChangeNotifier::CONNECTION_UNKNOWN, - data->connection_type()); - data->set_connection_type(net::NetworkChangeNotifier::CONNECTION_WIFI); - EXPECT_EQ(net::NetworkChangeNotifier::CONNECTION_WIFI, - data->connection_type()); - - EXPECT_FALSE(data->page_id()); - uint64_t page_id = 1; - data->set_page_id(page_id); - EXPECT_EQ(page_id, data->page_id().value()); -} - -TEST_F(DataReductionProxyDataTest, DeepCopy) { - const struct { - bool data_reduction_used; - bool lite_page_test_value; - } tests[] = { - { - false, true, - }, - { - false, false, - }, - { - true, false, - }, - { - true, true, - }, - }; - - for (size_t i = 0; i < base::size(tests); ++i) { - static const char kSessionKey[] = "test-key"; - static const GURL kTestURL("test-url"); - std::unique_ptr<DataReductionProxyData> data(new DataReductionProxyData()); - data->set_used_data_reduction_proxy(tests[i].data_reduction_used); - data->set_lite_page_received(tests[i].lite_page_test_value); - data->set_black_listed(tests[i].lite_page_test_value); - data->set_session_key(kSessionKey); - data->set_request_url(kTestURL); - data->set_effective_connection_type(net::EFFECTIVE_CONNECTION_TYPE_OFFLINE); - data->set_connection_type(net::NetworkChangeNotifier::CONNECTION_WIFI); - data->set_page_id(2u); - std::unique_ptr<DataReductionProxyData> copy = data->DeepCopy(); - EXPECT_EQ(tests[i].lite_page_test_value, copy->lite_page_received()); - EXPECT_EQ(tests[i].lite_page_test_value, copy->black_listed()); - EXPECT_EQ(tests[i].data_reduction_used, copy->used_data_reduction_proxy()); - EXPECT_EQ(kSessionKey, copy->session_key()); - EXPECT_EQ(kTestURL, copy->request_url()); - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_OFFLINE, - copy->effective_connection_type()); - EXPECT_EQ(net::NetworkChangeNotifier::CONNECTION_WIFI, - copy->connection_type()); - EXPECT_EQ(2u, data->page_id().value()); - } -} - -} // namespace - -} // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h index 9ef1fbca..252b5fa 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h
@@ -11,9 +11,6 @@ typedef std::vector<long long> ContentLengthList; -// A bypass delay more than this is treated as a long delay. -const int kLongBypassDelayInSeconds = 30 * 60; - // The number of days of bandwidth usage statistics that are tracked. const unsigned int kNumDaysInHistory = 60; @@ -24,19 +21,6 @@ "kNumDaysInHistorySummary should be no larger than " "kNumDaysInHistory"); -enum DataReductionProxyRequestType { - VIA_DATA_REDUCTION_PROXY, // A request served by the data reduction proxy. - // Below are reasons why a request is not served by the enabled data reduction - // proxy. Off-the-record profile data is not counted in all cases. - HTTPS, // An https request. - SHORT_BYPASS, // The client is bypassed by the proxy for a short time. - LONG_BYPASS, // The client is bypassed by the proxy for a long time (due - // to country bypass policy, for example). - UPDATE, // An update to already counted request data. - DIRECT_HTTP, // An http request with a disabled data reduction proxy. - UNKNOWN_TYPE, // Any other reason not listed above. -}; - } // namespace data_reduction_proxy #endif // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_METRICS_H_
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc index 2d4213c7..8c495b7 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_prefs.cc
@@ -62,7 +62,6 @@ // Add any new data reduction proxy prefs to the |pref_map_| or the // |list_pref_map_| in Init() of DataReductionProxyCompressionStats. void RegisterPrefs(PrefRegistrySimple* registry) { - registry->RegisterStringPref(prefs::kDataReductionProxy, std::string()); registry->RegisterInt64Pref(prefs::kDataReductionProxyLastEnabledTime, 0L); registry->RegisterInt64Pref(prefs::kHttpReceivedContentLength, 0); registry->RegisterInt64Pref(
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc index 41512e8a..d02f666 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.cc
@@ -20,7 +20,6 @@ #include "base/time/time.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h" -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h" #include "components/data_reduction_proxy/core/browser/data_store.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h" @@ -53,6 +52,10 @@ return origin_savings_estimates; } +// Hostname used for the other bucket which consists of chrome-services traffic. +// This should be in sync with the same in DataReductionSiteBreakdownView.java +const char kOtherHostName[] = "Other"; + } // namespace DataReductionProxyService::DataReductionProxyService( @@ -61,15 +64,12 @@ std::unique_ptr<DataStore> store, data_use_measurement::DataUseMeasurement* data_use_measurement, const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, - const base::TimeDelta& commit_delay, - const std::string& channel, - const std::string& user_agent) + const base::TimeDelta& commit_delay) : settings_(settings), prefs_(prefs), db_data_owner_(new DBDataOwner(std::move(store))), db_task_runner_(db_task_runner), data_use_measurement_(data_use_measurement), - channel_(channel), save_data_savings_estimate_dict_( GetSaveDataSavingsPercentEstimateFromFieldTrial()) { DCHECK(data_use_measurement_); @@ -116,7 +116,6 @@ int64_t data_used, int64_t original_size, bool data_reduction_proxy_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, bool is_user_traffic, data_use_measurement::DataUseUserData::DataUseContentType content_type, @@ -124,8 +123,8 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (compression_stats_) { compression_stats_->RecordDataUseWithMimeType( - data_used, original_size, data_reduction_proxy_enabled, request_type, - mime_type, is_user_traffic, content_type, service_hash_code); + data_used, original_size, data_reduction_proxy_enabled, mime_type, + is_user_traffic, content_type, service_hash_code); } } @@ -210,14 +209,12 @@ if (compression_stats_) { // Record non-content initiated traffic to the Other bucket for data saver // site-breakdown. - compression_stats_->RecordDataUseByHost( - util::GetSiteBreakdownOtherHostName(), sent_bytes, sent_bytes, - base::Time::Now()); - compression_stats_->RecordDataUseByHost( - util::GetSiteBreakdownOtherHostName(), recv_bytes, recv_bytes, - base::Time::Now()); + compression_stats_->RecordDataUseByHost(kOtherHostName, sent_bytes, + sent_bytes, base::Time::Now()); + compression_stats_->RecordDataUseByHost(kOtherHostName, recv_bytes, + recv_bytes, base::Time::Now()); compression_stats_->RecordDataUseWithMimeType( - recv_bytes, recv_bytes, settings_->IsDataReductionProxyEnabled(), HTTPS, + recv_bytes, recv_bytes, settings_->IsDataReductionProxyEnabled(), std::string(), false, data_use_measurement::DataUseUserData::OTHER, service_hash_code); }
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h index 61b7d9c2..900a6b4 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service.h
@@ -18,7 +18,6 @@ #include "base/sequence_checker.h" #include "base/values.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_metrics.h" -#include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h" #include "components/data_reduction_proxy/core/browser/db_data_owner.h" #include "components/data_use_measurement/core/data_use_measurement.h" #include "net/nqe/effective_connection_type.h" @@ -52,9 +51,7 @@ std::unique_ptr<DataStore> store, data_use_measurement::DataUseMeasurement* data_use_measurement, const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, - const base::TimeDelta& commit_delay, - const std::string& channel, - const std::string& user_agent); + const base::TimeDelta& commit_delay); virtual ~DataReductionProxyService(); @@ -72,7 +69,6 @@ int64_t data_used, int64_t original_size, bool data_reduction_proxy_enabled, - DataReductionProxyRequestType request_type, const std::string& mime_type, bool is_user_traffic, data_use_measurement::DataUseUserData::DataUseContentType content_type, @@ -108,10 +104,6 @@ return compression_stats_.get(); } - - // The production channel of this build. - std::string channel() const { return channel_; } - base::WeakPtr<DataReductionProxyService> GetWeakPtr(); base::SequencedTaskRunner* GetDBTaskRunnerForTesting() const { @@ -145,9 +137,6 @@ // lifetime of |this|. data_use_measurement::DataUseMeasurement* data_use_measurement_; - // The production channel of this build. - const std::string channel_; - // Dictionary of save-data savings estimates by origin. const absl::optional<base::Value> save_data_savings_estimate_dict_;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h index 422c1b4..3b63a95d 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h
@@ -167,8 +167,6 @@ return data_reduction_proxy_service_.get(); } - bool is_initialized() const { return !!prefs_; } - protected: void InitPrefMembers();
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc index ccc6c2b..c6aec35 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings_test_utils.cc
@@ -12,7 +12,6 @@ #include "base/strings/string_piece.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h" -#include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc index 64806bad..f050db0 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.cc
@@ -54,15 +54,12 @@ DataReductionProxySettings* settings, PrefService* prefs, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) - : DataReductionProxyService( - settings, - prefs, - std::make_unique<TestDataStore>(), - data_use_measurement, - task_runner, - base::TimeDelta(), - std::string(), - std::string()) {} + : DataReductionProxyService(settings, + prefs, + std::make_unique<TestDataStore>(), + data_use_measurement, + task_runner, + base::TimeDelta()) {} MockDataReductionProxyService::~MockDataReductionProxyService() {} @@ -71,15 +68,12 @@ DataReductionProxySettings* settings, PrefService* prefs, const scoped_refptr<base::SequencedTaskRunner>& db_task_runner) - : DataReductionProxyService( - settings, - prefs, - std::make_unique<TestDataStore>(), - data_use_measurement, - db_task_runner, - base::TimeDelta(), - std::string(), - std::string()) {} + : DataReductionProxyService(settings, + prefs, + std::make_unique<TestDataStore>(), + data_use_measurement, + db_task_runner, + base::TimeDelta()) {} TestDataReductionProxyService::~TestDataReductionProxyService() {}
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h index db82a5ea..db6babf 100644 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h +++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_test_utils.h
@@ -48,17 +48,15 @@ ~MockDataReductionProxyService() override; MOCK_METHOD2(SetProxyPrefs, void(bool enabled, bool at_startup)); - MOCK_METHOD8( - UpdateContentLengths, - void(int64_t data_used, - int64_t original_size, - bool data_reduction_proxy_enabled, - data_reduction_proxy::DataReductionProxyRequestType request_type, - const std::string& mime_type, - bool is_user_traffic, - data_use_measurement::DataUseUserData::DataUseContentType - content_type, - int32_t service_hash_code)); + MOCK_METHOD7(UpdateContentLengths, + void(int64_t data_used, + int64_t original_size, + bool data_reduction_proxy_enabled, + const std::string& mime_type, + bool is_user_traffic, + data_use_measurement::DataUseUserData::DataUseContentType + content_type, + int32_t service_hash_code)); MOCK_METHOD3(UpdateDataUseForHost, void(int64_t network_bytes, int64_t original_bytes,
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc deleted file mode 100644 index 705187e..0000000 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.cc +++ /dev/null
@@ -1,130 +0,0 @@ -// Copyright 2016 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/data_reduction_proxy/core/browser/data_reduction_proxy_util.h" - -#include <stdint.h> - -#include "base/cxx17_backports.h" -#include "base/strings/string_number_conversions.h" -#include "base/time/time.h" -#include "base/version.h" -#include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h" -#include "components/data_reduction_proxy/core/common/version.h" -#include "net/base/net_errors.h" -#include "net/base/url_util.h" -#include "net/http/http_response_headers.h" -#include "net/http/http_status_code.h" -#include "net/http/http_util.h" - -#if defined(USE_GOOGLE_API_KEYS) -#include "google_apis/google_api_keys.h" -#endif - -namespace data_reduction_proxy { - -namespace { - -#if defined(USE_GOOGLE_API_KEYS) -// Used in all Data Reduction Proxy URLs to specify API Key. -const char kApiKeyName[] = "key"; -#endif - -// Hostname used for the other bucket which consists of chrome-services traffic. -// This should be in sync with the same in DataReductionSiteBreakdownView.java -const char kOtherHostName[] = "Other"; - -} // namespace - -namespace util { - -const char* ChromiumVersion() { - // Assert at compile time that the Chromium version is at least somewhat - // properly formed, e.g. the version string is at least as long as "0.0.0.0", - // and starts and ends with numeric digits. This is to prevent another - // regression like http://crbug.com/595471. - static_assert(base::size(PRODUCT_VERSION) >= base::size("0.0.0.0") && - '0' <= PRODUCT_VERSION[0] && PRODUCT_VERSION[0] <= '9' && - '0' <= PRODUCT_VERSION[base::size(PRODUCT_VERSION) - 2] && - PRODUCT_VERSION[base::size(PRODUCT_VERSION) - 2] <= '9', - "PRODUCT_VERSION must be a string of the form " - "'MAJOR.MINOR.BUILD.PATCH', e.g. '1.2.3.4'. " - "PRODUCT_VERSION='" PRODUCT_VERSION "' is badly formed."); - - return PRODUCT_VERSION; -} - -void GetChromiumBuildAndPatch(const std::string& version_string, - std::string* build, - std::string* patch) { - uint32_t build_number; - uint32_t patch_number; - GetChromiumBuildAndPatchAsInts(version_string, &build_number, &patch_number); - *build = base::NumberToString(build_number); - *patch = base::NumberToString(patch_number); -} - -void GetChromiumBuildAndPatchAsInts(const std::string& version_string, - uint32_t* build, - uint32_t* patch) { - base::Version version(version_string); - DCHECK(version.IsValid()); - DCHECK_EQ(4U, version.components().size()); - *build = version.components()[2]; - *patch = version.components()[3]; -} - -const char* GetStringForClient(Client client) { - switch (client) { - case Client::UNKNOWN: - return ""; - case Client::CRONET_ANDROID: - return "cronet"; - case Client::WEBVIEW_ANDROID: - return "webview"; - case Client::CHROME_ANDROID: - return "android"; - case Client::CHROME_IOS: - return "ios"; - case Client::CHROME_MAC: - return "mac"; - case Client::CHROME_CHROMEOS: - return "chromeos"; - case Client::CHROME_LINUX: - return "linux"; - case Client::CHROME_WINDOWS: - return "win"; - case Client::CHROME_FREEBSD: - return "freebsd"; - case Client::CHROME_OPENBSD: - return "openbsd"; - case Client::CHROME_SOLARIS: - return "solaris"; - case Client::CHROME_QNX: - return "qnx"; - default: - NOTREACHED(); - return ""; - } -} - -GURL AddApiKeyToUrl(const GURL& url) { - GURL new_url = url; -#if defined(USE_GOOGLE_API_KEYS) - std::string api_key = google_apis::GetAPIKey(); - if (google_apis::HasAPIKeyConfigured() && !api_key.empty()) { - new_url = net::AppendOrReplaceQueryParameter(url, kApiKeyName, api_key); - } -#endif - return net::AppendOrReplaceQueryParameter(new_url, "alt", "proto"); -} - -const char* GetSiteBreakdownOtherHostName() { - return kOtherHostName; -} - -} // namespace util - - -} // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h deleted file mode 100644 index 61be038e6..0000000 --- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h +++ /dev/null
@@ -1,68 +0,0 @@ -// Copyright 2016 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_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_UTIL_H_ -#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_UTIL_H_ - -#include <memory> -#include <string> - -#include "net/base/network_change_notifier.h" -#include "net/base/proxy_server.h" -#include "net/nqe/effective_connection_type.h" -#include "net/proxy_resolution/proxy_retry_info.h" -#include "url/gurl.h" - - -namespace data_reduction_proxy { - -enum class Client { - UNKNOWN, - CRONET_ANDROID, - WEBVIEW_ANDROID, - CHROME_ANDROID, - CHROME_IOS, - CHROME_MAC, - CHROME_CHROMEOS, - CHROME_LINUX, - CHROME_WINDOWS, - CHROME_FREEBSD, - CHROME_OPENBSD, - CHROME_SOLARIS, - CHROME_QNX, -}; - -namespace util { - -// Returns the version of Chromium that is being used, e.g. "1.2.3.4". -const char* ChromiumVersion(); - -// Returns the build and patch numbers of |version_string| as std::string. -// |version_string| must be a properly formed Chromium version number, e.g. -// "1.2.3.4". -void GetChromiumBuildAndPatch(const std::string& version_string, - std::string* build, - std::string* patch); - -// Returns the build and patch numbers of |version_string| as unit32_t. -// |version_string| must be a properly formed Chromium version number, e.g. -// "1.2.3.4". -void GetChromiumBuildAndPatchAsInts(const std::string& version_string, - uint32_t* build, - uint32_t* patch); - -// Get the human-readable version of |client|. -const char* GetStringForClient(Client client); - -GURL AddApiKeyToUrl(const GURL& url); - -// Returns the hostname used for the other bucket to record datause not scoped -// to a page load such as chrome-services traffic, service worker, Downloads. -const char* GetSiteBreakdownOtherHostName(); - -} // namespace util - -} // namespace data_reduction_proxy - -#endif // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_UTIL_H_
diff --git a/components/data_reduction_proxy/core/common/BUILD.gn b/components/data_reduction_proxy/core/common/BUILD.gn index e598481..4b87a71 100644 --- a/components/data_reduction_proxy/core/common/BUILD.gn +++ b/components/data_reduction_proxy/core/common/BUILD.gn
@@ -44,32 +44,12 @@ ] } -static_library("test_support") { - testonly = true - sources = [ - "data_reduction_proxy_headers_test_utils.cc", - "data_reduction_proxy_headers_test_utils.h", - ] - - public_deps = [ ":common" ] - deps = [ - "//base", - "//components/prefs", - "//components/prefs:test_support", - "//net", - "//net:test_support", - "//testing/gmock", - "//testing/gtest", - ] -} - source_set("unit_tests") { testonly = true sources = [ "data_reduction_proxy_params_unittest.cc" ] deps = [ ":common", - ":test_support", "//base", "//base/test:test_support", "//components/prefs",
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.cc deleted file mode 100644 index 6dd0e21..0000000 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.cc +++ /dev/null
@@ -1,17 +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/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h" - -#include <algorithm> - -namespace data_reduction_proxy { - -void HeadersToRaw(std::string* headers) { - std::replace(headers->begin(), headers->end(), '\n', '\0'); - if (!headers->empty()) - *headers += '\0'; -} - -} // namespace data_reduction_proxy
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h deleted file mode 100644 index 2a6f047..0000000 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h +++ /dev/null
@@ -1,17 +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_DATA_REDUCTION_PROXY_CORE_COMMON_DATA_REDUCTION_PROXY_HEADERS_TEST_UTILS_H_ -#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_COMMON_DATA_REDUCTION_PROXY_HEADERS_TEST_UTILS_H_ - -#include <string> - -namespace data_reduction_proxy { - -// Transform "normal"-looking headers (\n-separated) to the appropriate -// input format for ParseRawHeaders (\0-separated). -void HeadersToRaw(std::string* headers); - -} // namespace data_reduction_proxy -#endif // COMPONENTS_DATA_REDUCTION_PROXY_CORE_COMMON_DATA_REDUCTION_PROXY_HEADERS_TEST_UTILS_H_
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc index 3468588..bc0d21eb 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.cc
@@ -24,10 +24,6 @@ const char kDailyHttpReceivedContentLength[] = "data_reduction.daily_received_length"; -// String that specifies the origin allowed to use data reduction proxy -// authentication, if any. -const char kDataReductionProxy[] = "auth.spdyproxy.origin"; - // A boolean specifying whether the DataSaver feature is enabled for this // client. Note that this preference key name is a legacy string for the sdpy // proxy.
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h index 19c6e7f..7b54603 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h
@@ -15,7 +15,6 @@ extern const char kDailyHttpOriginalContentLength[]; extern const char kDailyHttpReceivedContentLength[]; -extern const char kDataReductionProxy[]; extern const char kDataSaverEnabled[]; extern const char kDataUsageReportingEnabled[]; extern const char kDataReductionProxyWasEnabledBefore[];
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.cc index 1ede2e31..49d7f6d 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.cc +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.cc
@@ -7,9 +7,6 @@ namespace data_reduction_proxy { namespace switches { -// The origin of the data reduction proxy. -const char kDataReductionProxy[] = "spdy-proxy-auth-origin"; - // Enable the data reduction proxy. const char kEnableDataReductionProxy[] = "enable-spdy-proxy-auth";
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h index c615f50..ea977b3 100644 --- a/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h +++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h
@@ -11,7 +11,6 @@ // All switches in alphabetical order. The switches should be documented // alongside the definition of their values in the .cc file. -extern const char kDataReductionProxy[]; extern const char kEnableDataReductionProxy[]; extern const char kEnableDataReductionProxySavingsPromo[]; extern const char kOverrideHttpsImageCompressionInfobar[];
diff --git a/components/download/database/in_progress/download_entry.h b/components/download/database/in_progress/download_entry.h index a68a0b6e..ceba04d 100644 --- a/components/download/database/in_progress/download_entry.h +++ b/components/download/database/in_progress/download_entry.h
@@ -7,7 +7,6 @@ #include <string> -#include "components/download/public/common/download_item.h" #include "components/download/public/common/download_source.h" #include "components/download/public/common/download_url_parameters.h" #include "services/metrics/public/cpp/ukm_source_id.h"
diff --git a/components/download/internal/common/BUILD.gn b/components/download/internal/common/BUILD.gn index e9d3b6f..72d31d8 100644 --- a/components/download/internal/common/BUILD.gn +++ b/components/download/internal/common/BUILD.gn
@@ -72,6 +72,7 @@ "//base", "//components/download/database", "//components/download/public/common:interfaces", + "//components/enterprise/common/proto:download_item_reroute_info_proto", "//components/filename_generation", "//components/leveldb_proto", "//components/safe_browsing:buildflags", @@ -170,6 +171,7 @@ "//build:chromeos_buildflags", "//components/download/database", "//components/download/public/common:test_support", + "//components/enterprise/common/proto:download_item_reroute_info_proto", "//components/leveldb_proto", "//components/leveldb_proto:test_support", "//components/ukm:test_support",
diff --git a/components/download/internal/common/DEPS b/components/download/internal/common/DEPS index 661002b5..685159d 100644 --- a/components/download/internal/common/DEPS +++ b/components/download/internal/common/DEPS
@@ -3,6 +3,7 @@ "+components/download/downloader/in_progress", "+components/download/internal/common/jni_headers", "+components/download/public/common", + "+components/enterprise/common/proto", "+components/filename_generation/filename_generation.h", "+components/leveldb_proto", "+components/safe_browsing",
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index 29db91f..697dadd 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -55,6 +55,7 @@ #include "components/download/public/common/download_ukm_helper.h" #include "components/download/public/common/download_url_parameters.h" #include "components/download/public/common/download_utils.h" +#include "components/enterprise/common/proto/download_item_reroute_info.pb.h" #include "net/base/network_change_notifier.h" #include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" @@ -987,9 +988,16 @@ } DownloadItemRenameHandler* DownloadItemImpl::GetRenameHandler() { + if (reroute_info_.IsInitialized() && !rename_handler_) { + rename_handler_ = delegate_->GetRenameHandlerForDownload(this); + } return rename_handler_.get(); } +const DownloadItemRerouteInfo& DownloadItemImpl::GetRerouteInfo() const { + return reroute_info_; +} + bool DownloadItemImpl::IsDangerous() const { return danger_type_ == DOWNLOAD_DANGER_TYPE_DANGEROUS_FILE || danger_type_ == DOWNLOAD_DANGER_TYPE_DANGEROUS_URL || @@ -1947,14 +1955,16 @@ // Unilaterally rename; even if it already has the right name, // we need the annotation. - DownloadFile::RenameCompletionCallback callback = + DownloadFile::RenameCompletionCallback rename_callback = base::BindOnce(&DownloadItemImpl::OnDownloadRenamedToFinalName, weak_ptr_factory_.GetWeakPtr()); // If an alternate rename handler is specified, use it instead. - rename_handler_ = delegate_->GetRenameHandlerForDownload(this); - if (rename_handler_) { - rename_handler_->Start(std::move(callback)); + if (GetRenameHandler()) { + auto update_callback = + base::BindRepeating(&DownloadItemImpl::OnRenameHandlerUpdate, + weak_ptr_factory_.GetWeakPtr()); + GetRenameHandler()->Start(update_callback, std::move(rename_callback)); return; } @@ -1965,7 +1975,7 @@ base::BindOnce(&DownloadFile::PublishDownload, // Safe because we control download file lifetime. base::Unretained(download_file_.get()), - std::move(callback))); + std::move(rename_callback))); return; } #endif // defined(OS_ANDROID) @@ -1983,7 +1993,18 @@ delegate_->GetApplicationClientIdForFileScanning(), delegate_->IsOffTheRecord() ? GURL() : GetURL(), delegate_->IsOffTheRecord() ? GURL() : GetReferrerUrl(), - std::move(quarantine), std::move(callback))); + std::move(quarantine), std::move(rename_callback))); +} + +void DownloadItemImpl::OnRenameHandlerUpdate( + const DownloadItemRenameProgressUpdate& update) { + TRACE_EVENT_INSTANT1("download", "DownloadItemRenameProgressUpdated", + TRACE_EVENT_SCOPE_THREAD, "new_file_name", + update.target_file_name); + DCHECK_EQ(state_, IN_PROGRESS_INTERNAL); + destination_info_.target_path = update.target_file_name; + reroute_info_ = update.reroute_info; + UpdateObservers(); } void DownloadItemImpl::OnDownloadRenamedToFinalName( @@ -2010,7 +2031,7 @@ return; } - DCHECK(GetTargetFilePath() == full_path); + DCHECK_EQ(GetTargetFilePath(), full_path); if (full_path != GetFullPath()) { // full_path is now the current and target file path.
diff --git a/components/download/internal/common/download_item_impl_unittest.cc b/components/download/internal/common/download_item_impl_unittest.cc index a36a7ad..dbea485 100644 --- a/components/download/internal/common/download_item_impl_unittest.cc +++ b/components/download/internal/common/download_item_impl_unittest.cc
@@ -73,7 +73,12 @@ : DownloadItemRenameHandler(item) {} ~MockDownloadItemRenameHandler() override = default; - MOCK_METHOD1(Start, void(Callback)); + MOCK_METHOD(void, + Start, + (ProgressUpdateCallback, DownloadCallback), + (override)); + MOCK_METHOD(void, OpenDownload, (), (override)); + MOCK_METHOD(void, ShowDownloadInContext, (), (override)); void VerifyAndClearExpectations() { ::testing::Mock::VerifyAndClearExpectations(this); @@ -2800,6 +2805,11 @@ } TEST_F(DownloadItemTest, ExternalRenameHandler) { + using ProgressUpdate = DownloadItemRenameProgressUpdate; + using UpdateCallback = DownloadItemRenameHandler::ProgressUpdateCallback; + using DownloadCallback = DownloadItemRenameHandler::DownloadCallback; + using RerouteProvider = enterprise_connectors::FileSystemServiceProvider; + // Start a download. DownloadItemImpl* item = CreateDownloadItem(); MockDownloadFile* download_file = @@ -2807,13 +2817,21 @@ EXPECT_CALL(*download_file, Detach()); // Create a rename handler and make sure the delegate returns it. - DownloadItemRenameHandler::Callback callback; + DownloadCallback callback; + UpdateCallback update_callback; auto rename_handler = std::make_unique<MockDownloadItemRenameHandler>(item); MockDownloadItemRenameHandler* rename_handler_ptr = rename_handler.get(); ASSERT_EQ(item, rename_handler->download_item()); - EXPECT_CALL(*rename_handler, Start(_)).WillOnce(MoveArg<0>(&callback)); + EXPECT_CALL(*rename_handler, Start(_, _)) + .WillOnce(Invoke([&](UpdateCallback update_cb, DownloadCallback cb) { + callback = std::move(cb); + update_callback = update_cb; + })); + // Cannot use DoAll(MoveArg<0>(), MoveArg<1>()): DoAll() only gets a const ref + // of the arguments, but const T& is just T& if T itself is a reference. + EXPECT_CALL(*mock_delegate(), ShouldCompleteDownload_(item, _)) .WillOnce(Return(true)); EXPECT_CALL(*mock_delegate(), GetRenameHandlerForDownload(item)) @@ -2827,11 +2845,32 @@ EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); ASSERT_FALSE(callback.is_null()); + ASSERT_NE(nullptr, item->GetRenameHandler()); + + TestDownloadItemObserver observer(item); + + // Invoke the update callback. This should update the target name and stored + // reroute info, regardless of |update_observers|. + base::FilePath file_name(FILE_PATH_LITERAL("foo.txt")); + DownloadItemRerouteInfo reroute_info; + reroute_info.set_service_provider(RerouteProvider::GOOGLE_DRIVE); + + update_callback.Run(ProgressUpdate{file_name, reroute_info}); + EXPECT_EQ(item->GetFileNameToReportUser(), file_name); + EXPECT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); + ASSERT_TRUE(item->GetRerouteInfo().IsInitialized()); + EXPECT_EQ(reroute_info.SerializeAsString(), + item->GetRerouteInfo().SerializeAsString()); + // Check that observers are updated. + ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); + // Invoke the rename callback. This should complete the download. - std::move(callback).Run(DOWNLOAD_INTERRUPT_REASON_NONE, - base::FilePath(kDummyTargetPath)); + std::move(callback).Run(DOWNLOAD_INTERRUPT_REASON_NONE, file_name); task_environment_.RunUntilIdle(); + EXPECT_EQ(item->GetTargetFilePath(), file_name); EXPECT_EQ(DownloadItem::COMPLETE, item->GetState()); + // Check that observers are updated. + ASSERT_TRUE(observer.CheckAndResetDownloadUpdated()); ASSERT_NE(nullptr, item->GetRenameHandler()); rename_handler_ptr->VerifyAndClearExpectations();
diff --git a/components/download/internal/common/download_item_rename_handler.cc b/components/download/internal/common/download_item_rename_handler.cc index fc2c31e..9929d66 100644 --- a/components/download/internal/common/download_item_rename_handler.cc +++ b/components/download/internal/common/download_item_rename_handler.cc
@@ -16,13 +16,4 @@ DownloadItemRenameHandler::~DownloadItemRenameHandler() = default; -void DownloadItemRenameHandler::Start(Callback callback) { - std::move(callback).Run(DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, - base::FilePath()); -} - -void DownloadItemRenameHandler::OpenDownload() {} - -void DownloadItemRenameHandler::ShowDownloadInContext() {} - } // namespace download
diff --git a/components/download/public/common/BUILD.gn b/components/download/public/common/BUILD.gn index 3c8df71..0c01e940 100644 --- a/components/download/public/common/BUILD.gn +++ b/components/download/public/common/BUILD.gn
@@ -38,6 +38,7 @@ "download_item_impl.h", "download_item_impl_delegate.h", "download_item_rename_handler.h", + "download_item_rename_progress_update.h", "download_job.h", "download_job_factory.h", "download_path_reservation_tracker.h", @@ -76,6 +77,7 @@ "//base", "//components/download/network", "//components/download/public/background_service:public", + "//components/enterprise/common/proto:download_item_reroute_info_proto", "//components/services/quarantine/public/mojom", "//mojo/public/cpp/bindings", "//services/network/public/cpp",
diff --git a/components/download/public/common/DEPS b/components/download/public/common/DEPS index e9121f4..9462dbe 100644 --- a/components/download/public/common/DEPS +++ b/components/download/public/common/DEPS
@@ -2,6 +2,7 @@ "+crypto", "+components/keyed_service/core", "+components/services/quarantine/public/mojom/quarantine.mojom.h", + "+components/enterprise/common/proto", "+mojo/public/cpp/bindings", "+mojo/public/cpp/system", "+net/base/io_buffer.h",
diff --git a/components/download/public/common/download_item.h b/components/download/public/common/download_item.h index f2f3a433..5bde89d6 100644 --- a/components/download/public/common/download_item.h +++ b/components/download/public/common/download_item.h
@@ -47,9 +47,14 @@ class HttpResponseHeaders; } +namespace enterprise_connectors { +class DownloadItemRerouteInfo; +} + namespace download { class DownloadFile; class DownloadItemRenameHandler; +using enterprise_connectors::DownloadItemRerouteInfo; // One DownloadItem per download. This is the model class that stores all the // state for a download. @@ -437,6 +442,9 @@ // pointer. virtual DownloadItemRenameHandler* GetRenameHandler() = 0; + // Gets the metadata needed to recover rename handler state. + virtual const DownloadItemRerouteInfo& GetRerouteInfo() const = 0; + // Progress State accessors ----------------------------------------------- // Simple calculation of the amount of time remaining to completion. Fills
diff --git a/components/download/public/common/download_item_impl.h b/components/download/public/common/download_item_impl.h index 0c56a25..aa0a039 100644 --- a/components/download/public/common/download_item_impl.h +++ b/components/download/public/common/download_item_impl.h
@@ -24,6 +24,7 @@ #include "components/download/public/common/download_destination_observer.h" #include "components/download/public/common/download_interrupt_reasons.h" #include "components/download/public/common/download_item.h" +#include "components/download/public/common/download_item_rename_progress_update.h" #include "components/download/public/common/download_job.h" #include "components/download/public/common/download_url_parameters.h" #include "components/download/public/common/resume_mode.h" @@ -275,6 +276,7 @@ void DeleteFile(base::OnceCallback<void(bool)> callback) override; DownloadFile* GetDownloadFile() override; DownloadItemRenameHandler* GetRenameHandler() override; + const DownloadItemRerouteInfo& GetRerouteInfo() const override; bool IsDangerous() const override; bool IsMixedContent() const override; DownloadDangerType GetDangerType() const override; @@ -597,6 +599,15 @@ // DownloadItem::Completed(). void OnDownloadCompleting(); + // Called by |rename_handler_| to update state variables when necessary. + // This may update |destination_info_.target_file_path| as confirmed by + // rerouted location to be reflected in the UI/UX, and attach other reroute + // specific metadata into |reroute_info_| to be persisted into the databases. + // However, this will not transition the internal |state_|, because the + // |rename_handler_| will eventually run OnDownloadRenamedToFinalName() on + // completion. + void OnRenameHandlerUpdate(const DownloadItemRenameProgressUpdate& update); + void OnDownloadRenamedToFinalName(DownloadInterruptReason reason, const base::FilePath& full_path); @@ -865,6 +876,8 @@ // A handler for renaming and helping with display the item. std::unique_ptr<DownloadItemRenameHandler> rename_handler_; + // Metadata specific to the rename handler. + DownloadItemRerouteInfo reroute_info_; THREAD_CHECKER(thread_checker_);
diff --git a/components/download/public/common/download_item_rename_handler.h b/components/download/public/common/download_item_rename_handler.h index 63d1244..be5e92a 100644 --- a/components/download/public/common/download_item_rename_handler.h +++ b/components/download/public/common/download_item_rename_handler.h
@@ -7,6 +7,7 @@ #include "base/callback.h" #include "components/download/public/common/download_interrupt_reasons.h" +#include "components/download/public/common/download_item_rename_progress_update.h" namespace base { class FilePath; @@ -25,8 +26,14 @@ // Instances of DownloadItemRenameHandler are owned by DownloadItem. class COMPONENTS_DOWNLOAD_EXPORT DownloadItemRenameHandler { public: - using Callback = base::OnceCallback<void(DownloadInterruptReason reason, - const base::FilePath& path)>; + // Callback to update the DownloadItem and send some info into databases. + using ProgressUpdateCallback = base::RepeatingCallback<void( + const download::DownloadItemRenameProgressUpdate&)>; + // Callback when the rename handler processing completes. Args indicate + // processing result to be updated to UX, and the final file name validated at + // rerouted location. + using DownloadCallback = + base::OnceCallback<void(DownloadInterruptReason, const base::FilePath&)>; explicit DownloadItemRenameHandler(DownloadItem* download_item); virtual ~DownloadItemRenameHandler(); @@ -35,13 +42,14 @@ // Starts the process of renaming the file and invokes |callback| when // done. - virtual void Start(Callback callback); + virtual void Start(ProgressUpdateCallback progress_update_cb, + DownloadCallback upload_complete_cb) = 0; // Opens the file associated with this download. - virtual void OpenDownload(); + virtual void OpenDownload() = 0; // Shows the download in the context of its container. - virtual void ShowDownloadInContext(); + virtual void ShowDownloadInContext() = 0; private: DownloadItem* download_item_;
diff --git a/components/download/public/common/download_item_rename_progress_update.h b/components/download/public/common/download_item_rename_progress_update.h new file mode 100644 index 0000000..7840bf02 --- /dev/null +++ b/components/download/public/common/download_item_rename_progress_update.h
@@ -0,0 +1,28 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_ITEM_RENAME_PROGRESS_UPDATE_H_ +#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_ITEM_RENAME_PROGRESS_UPDATE_H_ + +#include "base/files/file_path.h" +#include "components/enterprise/common/proto/download_item_reroute_info.pb.h" + +namespace download { + +using enterprise_connectors::DownloadItemRerouteInfo; + +struct DownloadItemRenameProgressUpdate { + // Only used in DownloadItemImpl to update the corresponding field: + base::FilePath target_file_name; // destination_info_.target_path. + + // Reroute info to be stored into / read from databases. + // This is a proto because the in-progress DB already can + // store proto, but the history DB can only store string, so will need to be + // serialized. + DownloadItemRerouteInfo reroute_info; +}; + +} // namespace download + +#endif // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_ITEM_RENAME_PROGRESS_UPDATE_H_
diff --git a/components/download/public/common/mock_download_item.h b/components/download/public/common/mock_download_item.h index 13234b0..9b0d6fb 100644 --- a/components/download/public/common/mock_download_item.h +++ b/components/download/public/common/mock_download_item.h
@@ -101,6 +101,10 @@ MOCK_METHOD1(DeleteFile_, void(base::OnceCallback<void(bool)>& cb)); MOCK_METHOD0(GetDownloadFile, DownloadFile*()); MOCK_METHOD0(GetRenameHandler, DownloadItemRenameHandler*()); + MOCK_METHOD(const DownloadItemRerouteInfo&, + GetRerouteInfo, + (), + (const override)); MOCK_CONST_METHOD0(IsDangerous, bool()); MOCK_CONST_METHOD0(IsMixedContent, bool()); MOCK_CONST_METHOD0(GetDangerType, DownloadDangerType());
diff --git a/components/enterprise/common/proto/BUILD.gn b/components/enterprise/common/proto/BUILD.gn index 99c2bb6..363acf0 100644 --- a/components/enterprise/common/proto/BUILD.gn +++ b/components/enterprise/common/proto/BUILD.gn
@@ -20,3 +20,8 @@ proto_in_dir = "//" sources = [ "device_trust_report_event.proto" ] } + +proto_library("download_item_reroute_info_proto") { + proto_in_dir = "//" + sources = [ "download_item_reroute_info.proto" ] +}
diff --git a/components/enterprise/common/proto/download_item_reroute_info.proto b/components/enterprise/common/proto/download_item_reroute_info.proto new file mode 100644 index 0000000..4d59c71 --- /dev/null +++ b/components/enterprise/common/proto/download_item_reroute_info.proto
@@ -0,0 +1,37 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. Use +// of this source code is governed by a BSD-style license that can +// be found in the LICENSE file. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package enterprise_connectors; + +// Enum for file system connector's service provider. +enum FileSystemServiceProvider { + BOX = 0; + GOOGLE_DRIVE = 1; +}; + +// Metadata from the service provider to recover its state / open the +// corresponding file. +// +// Next ID: 2. +message BoxInfo { + optional string file_id = 1; +} + +message GoogleDriveInfo {} + +// Metadata associated with each DownloadItem if it was rerouted to a service +// provider. +message DownloadItemRerouteInfo { + // Each DownloadItem should only be rerouted to one of the providers. + optional FileSystemServiceProvider service_provider = 1; + + oneof upload { + BoxInfo box = 100; + GoogleDriveInfo google_drive = 101; + } +}
diff --git a/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java b/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java index 206b40d..86e180ad 100644 --- a/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java +++ b/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java
@@ -174,7 +174,7 @@ } @NativeMethods - interface Natives { + public interface Natives { long init(); void destroy(long nativeLargeIconBridge); boolean getLargeIconForURL(long nativeLargeIconBridge,
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java index a4b72dd..5740404 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java
@@ -238,6 +238,18 @@ /** Mic toolbar IPH event */ public static final String SUCCESSFUL_VOICE_SEARCH = "successful_voice_search"; + /** AdaptiveButtonInTopToolbarCustomization new tab events. */ + public static final String ADAPTIVE_TOOLBAR_CUSTOMIZATION_NEW_TAB_OPENED = + "adaptive_toolbar_customization_new_tab_opened"; + + /** AdaptiveButtonInTopToolbarCustomization share events. */ + public static final String ADAPTIVE_TOOLBAR_CUSTOMIZATION_SHARE_OPENED = + "adaptive_toolbar_customization_share_opened"; + + /** AdaptiveButtonInTopToolbarCustomization voice search events. */ + public static final String ADAPTIVE_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_OPENED = + "adaptive_toolbar_customization_voice_search_opened"; + /** WebFeed events. */ public static final String WEB_FEED_FOLLOW_INTRO_CLICKED = "web_feed_follow_intro_clicked";
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java index 93e0c3e..420ae876 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -13,7 +13,10 @@ * FeatureConstants contains the String name of all base::Feature in-product help features declared * in //components/feature_engagement/public/feature_constants.h. */ -@StringDef({FeatureConstants.ADD_TO_HOMESCREEN_MESSAGE_FEATURE, +@StringDef({FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_NEW_TAB_FEATURE, + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_SHARE_FEATURE, + FeatureConstants.ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_FEATURE, + FeatureConstants.ADD_TO_HOMESCREEN_MESSAGE_FEATURE, FeatureConstants.ADD_TO_HOMESCREEN_TEXT_BUBBLE_FEATURE, FeatureConstants.DOWNLOAD_PAGE_FEATURE, FeatureConstants.DOWNLOAD_PAGE_SCREENSHOT_FEATURE, FeatureConstants.DOWNLOAD_HOME_FEATURE, FeatureConstants.DOWNLOAD_INDICATOR_FEATURE, @@ -55,6 +58,12 @@ FeatureConstants.SHARED_HIGHLIGHTING_BUILDER_FEATURE}) @Retention(RetentionPolicy.SOURCE) public @interface FeatureConstants { + String ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_NEW_TAB_FEATURE = + "IPH_AdaptiveButtonInTopToolbarCustomization_NewTab"; + String ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_SHARE_FEATURE = + "IPH_AdaptiveButtonInTopToolbarCustomization_Share"; + String ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_VOICE_SEARCH_FEATURE = + "IPH_AdaptiveButtonInTopToolbarCustomization_VoiceSearch"; String ADD_TO_HOMESCREEN_MESSAGE_FEATURE = "IPH_AddToHomescreenMessage"; String ADD_TO_HOMESCREEN_TEXT_BUBBLE_FEATURE = "IPH_AddToHomescreenTextBubble"; String DOWNLOAD_PAGE_FEATURE = "IPH_DownloadPage";
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index aa66ea1..7c9be4f3 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -46,6 +46,16 @@ // defined(OS_CHROMEOS) #if defined(OS_ANDROID) +const base::Feature kIPHAdaptiveButtonInTopToolbarCustomizationNewTabFeature{ + "IPH_AdaptiveButtonInTopToolbarCustomization_NewTab", + base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kIPHAdaptiveButtonInTopToolbarCustomizationShareFeature{ + "IPH_AdaptiveButtonInTopToolbarCustomization_Share", + base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature + kIPHAdaptiveButtonInTopToolbarCustomizationVoiceSearchFeature{ + "IPH_AdaptiveButtonInTopToolbarCustomization_VoiceSearch", + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kIPHAddToHomescreenMessageFeature{ "IPH_AddToHomescreenMessage", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kIPHAddToHomescreenTextBubbleFeature{
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index 4712599a..a7320ea 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -38,6 +38,12 @@ // should also be declared in: // org.chromium.components.feature_engagement.FeatureConstants. #if defined(OS_ANDROID) +extern const base::Feature + kIPHAdaptiveButtonInTopToolbarCustomizationNewTabFeature; +extern const base::Feature + kIPHAdaptiveButtonInTopToolbarCustomizationShareFeature; +extern const base::Feature + kIPHAdaptiveButtonInTopToolbarCustomizationVoiceSearchFeature; extern const base::Feature kIPHAddToHomescreenMessageFeature; extern const base::Feature kIPHAddToHomescreenTextBubbleFeature; extern const base::Feature kIPHDataSaverDetailFeature;
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc index 308cd5b8..d5f37da 100644 --- a/components/feature_engagement/public/feature_list.cc +++ b/components/feature_engagement/public/feature_list.cc
@@ -16,6 +16,9 @@ const base::Feature* const kAllFeatures[] = { &kIPHDummyFeature, // Ensures non-empty array for all platforms. #if defined(OS_ANDROID) + &kIPHAdaptiveButtonInTopToolbarCustomizationNewTabFeature, + &kIPHAdaptiveButtonInTopToolbarCustomizationShareFeature, + &kIPHAdaptiveButtonInTopToolbarCustomizationVoiceSearchFeature, &kIPHAddToHomescreenMessageFeature, &kIPHAddToHomescreenTextBubbleFeature, &kIPHDataSaverDetailFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h index d933a8d6..228651d 100644 --- a/components/feature_engagement/public/feature_list.h +++ b/components/feature_engagement/public/feature_list.h
@@ -46,6 +46,13 @@ // Defines a flags_ui::FeatureEntry::FeatureParam for each feature. DEFINE_VARIATION_PARAM(kIPHDummyFeature, "IPH_Dummy"); #if defined(OS_ANDROID) +DEFINE_VARIATION_PARAM(kIPHAdaptiveButtonInTopToolbarCustomizationNewTabFeature, + "IPH_AdaptiveButtonInTopToolbarCustomization_NewTab"); +DEFINE_VARIATION_PARAM(kIPHAdaptiveButtonInTopToolbarCustomizationShareFeature, + "IPH_AdaptiveButtonInTopToolbarCustomization_Share"); +DEFINE_VARIATION_PARAM( + kIPHAdaptiveButtonInTopToolbarCustomizationVoiceSearchFeature, + "IPH_AdaptiveButtonInTopToolbarCustomization_VoiceSearch"); DEFINE_VARIATION_PARAM(kIPHAddToHomescreenMessageFeature, "IPH_AddToHomescreenMessage"); DEFINE_VARIATION_PARAM(kIPHAddToHomescreenTextBubbleFeature, @@ -192,6 +199,12 @@ constexpr flags_ui::FeatureEntry::FeatureVariation kIPHDemoModeChoiceVariations[] = { #if defined(OS_ANDROID) + VARIATION_ENTRY( + kIPHAdaptiveButtonInTopToolbarCustomizationNewTabFeature), + VARIATION_ENTRY( + kIPHAdaptiveButtonInTopToolbarCustomizationShareFeature), + VARIATION_ENTRY( + kIPHAdaptiveButtonInTopToolbarCustomizationVoiceSearchFeature), VARIATION_ENTRY(kIPHAddToHomescreenMessageFeature), VARIATION_ENTRY(kIPHAddToHomescreenTextBubbleFeature), VARIATION_ENTRY(kIPHDataSaverDetailFeature),
diff --git a/components/feed/core/proto/v2/wire/README.md b/components/feed/core/proto/v2/wire/README.md new file mode 100644 index 0000000..a6076fb --- /dev/null +++ b/components/feed/core/proto/v2/wire/README.md
@@ -0,0 +1,12 @@ +**WARNING: These proto files should match the** +**[upstream copies](http://shortn/_f5aHLD4mRf)!** + +To make changes here: + +1. Run this script: http://shortn/_XH6X92I981 + +If everything looks good, send a CL. You're done! + +2. If changes are needed, make changes to this file, http://shortn/_Ni9Ab0vvUp + and submit them. Now repeat step 1. +
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn index 94b2882..4ebf72b7 100644 --- a/components/feed/core/v2/BUILD.gn +++ b/components/feed/core/v2/BUILD.gn
@@ -42,6 +42,7 @@ "public/persistent_key_value_store.cc", "public/persistent_key_value_store.h", "public/refresh_task_scheduler.h", + "public/reliability_logger.h", "public/types.cc", "public/unread_content_observer.cc", "public/unread_content_observer.h",
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc index 81f14a4..cb544ae6 100644 --- a/components/feed/core/v2/api_test/feed_api_test.cc +++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -6,6 +6,7 @@ #include "components/feed/core/proto/v2/wire/web_feeds.pb.h" #include "components/feed/core/v2/enums.h" #include "components/feed/core/v2/feed_network.h" +#include "components/feed/core/v2/public/reliability_logger.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "base/callback.h" @@ -181,6 +182,10 @@ void TestSurfaceBase::RemoveDataStoreEntry(base::StringPiece key) { data_store_entries_.erase(std::string(key)); } +ReliabilityLogger* TestSurfaceBase::GetReliabilityLogger() { + // TODO(iwells): Make a fake ReliabilityLogger when needed. + return nullptr; +} void TestSurfaceBase::Clear() { initial_state = absl::nullopt;
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h index 935ba515..ec7cf47 100644 --- a/components/feed/core/v2/api_test/feed_api_test.h +++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -26,6 +26,7 @@ #include "components/feed/core/v2/metrics_reporter.h" #include "components/feed/core/v2/prefs.h" #include "components/feed/core/v2/public/feed_stream_surface.h" +#include "components/feed/core/v2/public/reliability_logger.h" #include "components/feed/core/v2/public/types.h" #include "components/feed/core/v2/stream_model.h" #include "components/feed/core/v2/test/proto_printer.h" @@ -84,6 +85,7 @@ void ReplaceDataStoreEntry(base::StringPiece key, base::StringPiece data) override; void RemoveDataStoreEntry(base::StringPiece key) override; + ReliabilityLogger* GetReliabilityLogger() override; // Test functions.
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc index 09c5becc..67994b0 100644 --- a/components/feed/core/v2/proto_util.cc +++ b/components/feed/core/v2/proto_util.cc
@@ -126,10 +126,7 @@ feed_request.add_client_capability(feedwire::Capability::LOTTIE_ANIMATIONS); feed_request.add_client_capability( feedwire::Capability::LONG_PRESS_CARD_MENU); - // Add Share capability if sharing is turned on. - if (base::FeatureList::IsEnabled(kFeedShare)) { - feed_request.add_client_capability(feedwire::Capability::SHARE); - } + feed_request.add_client_capability(feedwire::Capability::SHARE); if (stream_type.IsWebFeed()) { feed_request.add_client_capability(feedwire::Capability::WEB_FEEDS); }
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc index b9ec31c..40a4a72 100644 --- a/components/feed/core/v2/proto_util_unittest.cc +++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -68,7 +68,8 @@ feedwire::Capability::DISMISS_COMMAND, feedwire::Capability::UI_THEME_V2, feedwire::Capability::UNDO_FOR_DISMISS_COMMAND, - feedwire::Capability::PREFETCH_METADATA)); + feedwire::Capability::PREFETCH_METADATA, + feedwire::Capability::SHARE)); } TEST(ProtoUtilTest, HeartsEnabled) { @@ -85,20 +86,6 @@ testing::Contains(feedwire::Capability::HEART)); } -TEST(ProtoUtilTest, ShareEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures({kFeedShare}, {}); - feedwire::FeedRequest request = - CreateFeedQueryRefreshRequest(kForYouStream, - feedwire::FeedQuery::MANUAL_REFRESH, - /*request_metadata=*/{}, - /*consistency_token=*/std::string()) - .feed_request(); - - ASSERT_THAT(request.client_capability(), - testing::Contains(feedwire::Capability::SHARE)); -} - TEST(ProtoUtilTest, DisableCapabilitiesWithFinch) { // Try to disable BASE_UI and _INFINITE_FEED. BASE_UI is not an experimental // capability, and should not be affected. @@ -123,7 +110,7 @@ feedwire::Capability::LONG_PRESS_CARD_MENU, feedwire::Capability::OPEN_IN_TAB, feedwire::Capability::CARD_MENU, feedwire::Capability::DOWNLOAD_LINK, - feedwire::Capability::DISMISS_COMMAND, + feedwire::Capability::DISMISS_COMMAND, feedwire::Capability::SHARE, feedwire::Capability::UI_THEME_V2, feedwire::Capability::UNDO_FOR_DISMISS_COMMAND, feedwire::Capability::PREFETCH_METADATA));
diff --git a/components/feed/core/v2/public/feed_stream_surface.h b/components/feed/core/v2/public/feed_stream_surface.h index 1b04c568b3..f3fdd230 100644 --- a/components/feed/core/v2/public/feed_stream_surface.h +++ b/components/feed/core/v2/public/feed_stream_surface.h
@@ -6,6 +6,7 @@ #define COMPONENTS_FEED_CORE_V2_PUBLIC_FEED_STREAM_SURFACE_H_ #include "base/observer_list_types.h" +#include "components/feed/core/v2/public/reliability_logger.h" #include "components/feed/core/v2/public/stream_type.h" #include "components/feed/core/v2/public/types.h" @@ -37,6 +38,9 @@ base::StringPiece data) = 0; virtual void RemoveDataStoreEntry(base::StringPiece key) = 0; + // Returns the ReliabilityLogger associated with this surface. + virtual ReliabilityLogger* GetReliabilityLogger() = 0; + private: StreamType stream_type_; SurfaceId surface_id_;
diff --git a/components/feed/core/v2/public/reliability_logger.h b/components/feed/core/v2/public/reliability_logger.h new file mode 100644 index 0000000..ab327651 --- /dev/null +++ b/components/feed/core/v2/public/reliability_logger.h
@@ -0,0 +1,60 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_FEED_CORE_V2_PUBLIC_RELIABILITY_LOGGER_H_ +#define COMPONENTS_FEED_CORE_V2_PUBLIC_RELIABILITY_LOGGER_H_ + +#include "base/time/time.h" +#include "components/feed/core/proto/v2/wire/reliability_logging_enums.pb.h" +#include "components/feed/core/v2/public/stream_type.h" + +namespace feed { + +/** + * Interface for logging reliability-related timestamps and status codes. See + * chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/ + * xsurface/FeedLaunchReliabilityLogger.java. + */ +class ReliabilityLogger { + public: + // Set stream metadata needed for logging and send any launch events that were + // logged before the metadata was set. + virtual void SendPendingLaunchEvents(StreamType stream_type, + SurfaceId stream_id) = 0; + // Drop any pending events and reset the launch logger. + virtual void CancelPendingLaunchEvents() = 0; + + // Methods for logging various events. + virtual void LogCacheReadStart(base::TimeTicks timestamp) = 0; + virtual void LogCacheReadEnd( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverCardReadCacheResult result) = 0; + + virtual int LogFeedRequestStart(base::TimeTicks timestamp) = 0; + virtual int LogActionsUploadRequestStart(base::TimeTicks timestamp) = 0; + virtual void LogRequestSent(int request_id, base::TimeTicks timestamp) = 0; + virtual void LogResponseReceived( + int request_id, + base::TimeTicks server_receive_timestamp, + base::TimeTicks server_send_timestamp, + base::TimeTicks client_receive_timestamp) = 0; + virtual void LogRequestFinished(int request_id, + base::TimeTicks timestamp, + int combined_network_status_code) = 0; + + virtual void LogAtfRenderStart(base::TimeTicks timestamp) = 0; + virtual void LogAtfRenderEnd( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverAboveTheFoldRenderResult result) = 0; + + virtual void LogLaunchFinished( + base::TimeTicks timestamp, + feedreliabilitylogging::DiscoverLaunchResult result) = 0; + + virtual ~ReliabilityLogger() = default; +}; + +} // namespace feed + +#endif // COMPONENTS_FEED_CORE_V2_PUBLIC_RELIABILITY_LOGGER_H_ \ No newline at end of file
diff --git a/components/feed/core/v2/public/stream_type.h b/components/feed/core/v2/public/stream_type.h index f846a1e..c15764ce 100644 --- a/components/feed/core/v2/public/stream_type.h +++ b/components/feed/core/v2/public/stream_type.h
@@ -32,6 +32,7 @@ bool IsForYou() const { return type_ == Type::kForYou; } bool IsWebFeed() const { return type_ == Type::kWebFeed; } bool IsValid() const { return type_ != Type::kUnspecified; } + Type GetType() const { return type_; } // Returns a human-readable value, for debugging/DCHECK prints. std::string ToString() const;
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc index bfd82f8..1725a4c 100644 --- a/components/feed/feed_feature_list.cc +++ b/components/feed/feed_feature_list.cc
@@ -52,8 +52,6 @@ const base::Feature kInterestFeedSpinnerAlwaysAnimate{ "InterestFeedSpinnerAlwaysAnimate", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kFeedShare{"FeedShare", base::FEATURE_DISABLED_BY_DEFAULT}; - const base::Feature kWebFeed{"WebFeed", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kDiscoFeedEndpoint{"DiscoFeedEndpoint", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/feed/feed_feature_list.h b/components/feed/feed_feature_list.h index 9cad2a1..4ba0f33 100644 --- a/components/feed/feed_feature_list.h +++ b/components/feed/feed_feature_list.h
@@ -40,9 +40,6 @@ // Used for A:B testing of a bug fix (crbug.com/1151391). extern const base::Feature kInterestFeedSpinnerAlwaysAnimate; -// Feature that allows the user to share articles from their feed. -extern const base::Feature kFeedShare; - // Feature that allows users to keep up with and consume web content. extern const base::Feature kWebFeed;
diff --git a/components/full_restore/features.cc b/components/full_restore/features.cc index 6222286..0f77d42 100644 --- a/components/full_restore/features.cc +++ b/components/full_restore/features.cc
@@ -8,10 +8,10 @@ namespace features { const base::Feature kArcGhostWindow{"ArcGhostWindow", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kFullRestore{"FullRestore", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; bool IsArcGhostWindowEnabled() { return IsFullRestoreEnabled() &&
diff --git a/components/history_clusters/core/history_clusters_service_unittest.cc b/components/history_clusters/core/history_clusters_service_unittest.cc index 15c03d3..3759d4a 100644 --- a/components/history_clusters/core/history_clusters_service_unittest.cc +++ b/components/history_clusters/core/history_clusters_service_unittest.cc
@@ -195,7 +195,7 @@ for (auto visit_ids : clustered_visit_ids) { auto* cluster = response.add_clusters(); for (auto visit_id : visit_ids) - cluster->add_visit_ids(visit_id); + cluster->add_cluster_visits()->set_visit_id(visit_id); } if (!clustered_visit_ids.empty()) { response.mutable_clusters(0)->mutable_keywords()->Add("apples");
diff --git a/components/history_clusters/core/memories_remote_model_helper.cc b/components/history_clusters/core/memories_remote_model_helper.cc index 107bb18..5e27cbd 100644 --- a/components/history_clusters/core/memories_remote_model_helper.cc +++ b/components/history_clusters/core/memories_remote_model_helper.cc
@@ -35,8 +35,8 @@ base::ListValue debug_visits_list; for (auto& visit : visits) { // TODO(tommycli): Still need to set `site_engagement_score` and - // `is_from_google_search`. - proto::Visit* request_visit = request.add_visits(); + // `is_from_google_search` + proto::AnnotatedVisit* request_visit = request.add_visits(); request_visit->set_visit_id(visit.visit_row.visit_id); request_visit->set_url(visit.url_row.url().spec()); request_visit->set_origin(visit.url_row.url().GetOrigin().spec()); @@ -68,6 +68,9 @@ debug_visit.SetStringKey( "pageTransition", base::NumberToString(request_visit->page_transition())); + debug_visit.SetStringKey( + "referringVisitId", + base::NumberToString(request_visit->referring_visit_id())); debug_visits_list.Append(std::move(debug_visit)); } } @@ -98,9 +101,10 @@ history::Cluster cluster; for (const std::string& keyword : cluster_proto.keywords()) cluster.keywords.push_back(base::UTF8ToUTF16(keyword)); - for (int64_t visit_id : cluster_proto.visit_ids()) { + for (const proto::ClusterVisit& cluster_visit : + cluster_proto.cluster_visits()) { const auto visits_it = base::ranges::find( - visits, visit_id, + visits, cluster_visit.visit_id(), [](const auto& visit) { return visit.visit_row.visit_id; }); if (visits_it != visits.end()) cluster.annotated_visits.push_back(*visits_it); @@ -120,11 +124,17 @@ } debug_cluster.SetKey("keywords", std::move(debug_keywords)); - base::ListValue debug_visit_ids; - for (int64_t visit_id : cluster.visit_ids()) { - debug_visit_ids.Append(base::NumberToString(visit_id)); + base::ListValue debug_visits; + for (const proto::ClusterVisit& cluster_visit : + cluster.cluster_visits()) { + base::DictionaryValue debug_visit; + debug_visit.SetStringKey( + "visit_id", base::NumberToString(cluster_visit.visit_id())); + debug_visit.SetStringKey("score", + base::NumberToString(cluster_visit.score())); + debug_visits.Append(std::move(debug_visit)); } - debug_cluster.SetKey("visit_ids", std::move(debug_visit_ids)); + debug_cluster.SetKey("visits", std::move(debug_visits)); debug_clusters_list.Append(std::move(debug_cluster)); }
diff --git a/components/history_clusters/core/proto/clusters.proto b/components/history_clusters/core/proto/clusters.proto index 4b4c55a..23faed2 100644 --- a/components/history_clusters/core/proto/clusters.proto +++ b/components/history_clusters/core/proto/clusters.proto
@@ -11,7 +11,7 @@ message GetClustersRequest { // Represents a set of visits. - repeated Visit visits = 1; + repeated AnnotatedVisit visits = 1; // The experiment name that controls the clustering behavior served for // this request. string experiment_name = 2; @@ -22,7 +22,7 @@ repeated Cluster clusters = 1; } -message Visit { +message AnnotatedVisit { // The ID associated with this visit. int64 visit_id = 1; // The URL for the visit. @@ -47,10 +47,21 @@ int64 referring_visit_id = 10; } +message ClusterVisit { + // The ID of the visit where visit_id corresponds to the visit in the history + // table. + int64 visit_id = 1; + // The score associated with this visit. + // + // Used for calculating ordering of visits within a cluster. + float score = 2; +} + message Cluster { + reserved 2; + // The keywords that the cluster contains/is related to. repeated string keywords = 1; - // The ids of each visit that is attached to this cluster where - // visit_id corresponds to the visit in the history table. - repeated int64 visit_ids = 2; + // The visits that are attached to this cluster. + repeated ClusterVisit cluster_visits = 3; }
diff --git a/components/metrics/metrics_provider.h b/components/metrics/metrics_provider.h index eeef17a..0a11370 100644 --- a/components/metrics/metrics_provider.h +++ b/components/metrics/metrics_provider.h
@@ -34,6 +34,9 @@ virtual void AsyncInit(base::OnceClosure done_callback); // Called when a new MetricsLog is created. + // This can be used to log a histogram that will appear in the log. Not safe + // for some other uses, like user actions. + // TODO(crbug.com/1171830): Improve this. virtual void OnDidCreateMetricsLog(); // Called when metrics recording has been enabled.
diff --git a/components/metrics/metrics_service.cc b/components/metrics/metrics_service.cc index 75def06..d6fee1d 100644 --- a/components/metrics/metrics_service.cc +++ b/components/metrics/metrics_service.cc
@@ -85,25 +85,26 @@ // In more detail, we have: // // INIT_TASK_SCHEDULED, // Waiting for deferred init tasks to finish. -// Typically about 30 seconds after startup, a task is sent to a background -// thread to perform deferred (lower priority and slower) initialization steps -// such as getting the list of plugins. That task will (when complete) make an -// async callback (via a Task) to indicate the completion. +// Typically about 30 seconds after startup, a task is sent to a second thread +// (the file thread) to perform deferred (lower priority and slower) +// initialization steps such as getting the list of plugins. That task will +// (when complete) make an async callback (via a Task) to indicate the +// completion. // // INIT_TASK_DONE, // Waiting for timer to send initial log. // The callback has arrived, and it is now possible for an initial log to be // created. This callback typically arrives back less than one second after // the deferred init task is dispatched. // -// SENDING_LOGS, // Sending logs and creating new ones when we run out. -// Logs from previous sessions have been loaded, and an optional initial -// stability log has been created. We will send all of these logs, and when -// they run out, we will start cutting new logs to send. We will also cut a -// new log if we expect a shutdown. +// SENDING_LOGS, // Sending logs an creating new ones when we run out. +// Logs from previous sessions have been loaded, and initial logs have been +// created (an optional stability log and the first metrics log). We will +// send all of these logs, and when run out, we will start cutting new logs +// to send. We will also cut a new log if we expect a shutdown. // // The progression through the above states is simple, and sequential. -// States proceed from INITIALIZED to SENDING_LOGS, and remain in the latter -// until shutdown. +// States proceed from INITIAL to SENDING_LOGS, and remain in the latter until +// shutdown. // // Also note that whenever we successfully send a log, we mirror the list // of logs into the PrefService. This ensures that IF we crash, we won't start @@ -540,6 +541,16 @@ DCHECK_EQ(INIT_TASK_SCHEDULED, state_); state_ = INIT_TASK_DONE; + // Create the initial log. + if (!initial_metrics_log_) { + initial_metrics_log_ = CreateLog(MetricsLog::ONGOING_LOG); + // Note: We explicitly do not call OnDidCreateMetricsLog() here, as this + // function would have already been called in Start() and this log will + // already contain any histograms logged there. OnDidCreateMetricsLog() + // will be called again after the initial log is closed, for the next log. + // TODO(crbug.com/1171830): Consider getting rid of |initial_metrics_log_|. + } + rotation_scheduler_->InitTaskComplete(); } @@ -624,13 +635,12 @@ log_manager_.FinishCurrentLog(log_store()); } -bool MetricsService::PushPendingLogsToPersistentStorage() { +void MetricsService::PushPendingLogsToPersistentStorage() { if (state_ < SENDING_LOGS) - return false; + return; // We didn't and still don't have time to get plugin list etc. CloseCurrentLog(); log_store()->TrimAndPersistUnsentLogs(); - return true; } //------------------------------------------------------------------------------ @@ -642,8 +652,8 @@ return; // Even if reporting is disabled, the scheduler is needed to trigger the - // creation of the first ongoing log, which must be done in order for any - // logs to be persisted on shutdown or backgrounding. + // creation of the initial log, which must be done in order for any logs to be + // persisted on shutdown or backgrounding. if (recording_active() && (reporting_active() || state_ < SENDING_LOGS)) { rotation_scheduler_->Start(); @@ -659,9 +669,8 @@ // it's possible the computer is about to go to sleep, so don't upload and // stop the scheduler. // If recording has been turned off, the scheduler doesn't need to run. - // If reporting is off, proceed if the first ongoing log hasn't been created, - // since that has to happen in order for logs to be cut and stored when - // persisting. + // If reporting is off, proceed if the initial log hasn't been created, since + // that has to happen in order for logs to be cut and stored when persisting. // TODO(stuartmorgan): Call Stop() on the scheduler when reporting and/or // recording are turned off instead of letting it fire and then aborting. if (idle_since_last_transmission_ || @@ -672,17 +681,9 @@ return; } - // The first ongoing log should be collected prior to sending any unsent logs. - if (state_ == INIT_TASK_DONE) { - client_->CollectFinalMetricsForLog( - base::BindOnce(&MetricsService::OnFinalLogInfoCollectionDone, - self_ptr_factory_.GetWeakPtr())); - return; - } - // If there are unsent logs, send the next one. If not, start the asynchronous // process of finalizing the current log for upload. - if (has_unsent_logs()) { + if (state_ == SENDING_LOGS && has_unsent_logs()) { reporting_service_.Start(); rotation_scheduler_->RotationFinished(); } else { @@ -695,8 +696,6 @@ void MetricsService::OnFinalLogInfoCollectionDone() { DVLOG(1) << "OnFinalLogInfoCollectionDone"; - DCHECK(state_ >= INIT_TASK_DONE); - state_ = SENDING_LOGS; // Abort if metrics were turned off during the final info gathering. if (!recording_active()) { @@ -705,10 +704,13 @@ return; } - bool success = PushPendingLogsToPersistentStorage(); - DCHECK(success); - OpenNewLog(); - + if (state_ == INIT_TASK_DONE) { + PrepareInitialMetricsLog(); + } else { + DCHECK_EQ(SENDING_LOGS, state_); + CloseCurrentLog(); + OpenNewLog(); + } reporting_service_.Start(); rotation_scheduler_->RotationFinished(); HandleIdleSinceLastTransmission(true); @@ -748,6 +750,48 @@ return true; } +void MetricsService::PrepareInitialMetricsLog() { + DCHECK_EQ(INIT_TASK_DONE, state_); + + RecordCurrentEnvironment(initial_metrics_log_.get(), /*complete=*/true); + base::TimeDelta incremental_uptime; + base::TimeDelta uptime; + GetUptimes(local_state_, &incremental_uptime, &uptime); + + // Histograms only get written to the current log, so make the new log current + // before writing them. + log_manager_.PauseCurrentLog(); + log_manager_.BeginLoggingWithLog(std::move(initial_metrics_log_)); + + // Note: Some stability providers may record stability stats via histograms, + // so this call has to be after BeginLoggingWithLog(). + log_manager_.current_log()->RecordCurrentSessionData( + &delegating_provider_, base::TimeDelta(), base::TimeDelta()); + RecordCurrentHistograms(); + + DVLOG(1) << "Generated an initial log."; + log_manager_.FinishCurrentLog(log_store()); + log_manager_.ResumePausedLog(); + + // We call OnDidCreateMetricsLog() here for the next log. Normally, this is + // called when the log is created, but in this special case, the log we paused + // was created much earlier - by Start(). The histograms that were recorded + // via OnDidCreateMetricsLog() are now in the initial metrics log we just + // processed, so we need to record new ones for the next log. + delegating_provider_.OnDidCreateMetricsLog(); + + // Store unsent logs, including the initial log that was just saved, so + // that they're not lost in case of a crash before upload time. + log_store()->TrimAndPersistUnsentLogs(); + + state_ = SENDING_LOGS; +} + +void MetricsService::IncrementLongPrefsValue(const char* path) { + int64_t value = local_state_->GetInt64(path); + local_state_->SetInt64(path, value + 1); +} + void MetricsService::RegisterMetricsProvider( std::unique_ptr<MetricsProvider> provider) { DCHECK_EQ(CONSTRUCTED, state_);
diff --git a/components/metrics/metrics_service.h b/components/metrics/metrics_service.h index b0312a1..7fbcf1a 100644 --- a/components/metrics/metrics_service.h +++ b/components/metrics/metrics_service.h
@@ -198,7 +198,7 @@ INITIALIZED, // InitializeMetricsRecordingState() was called. INIT_TASK_SCHEDULED, // Waiting for deferred init tasks to finish. INIT_TASK_DONE, // Waiting for timer to send initial log. - SENDING_LOGS, // Sending logs and creating new ones when we run out. + SENDING_LOGS, // Sending logs an creating new ones when we run out. }; State state() const { return state_; } @@ -259,7 +259,8 @@ void CloseCurrentLog(); // Pushes the text of the current and staged logs into persistent storage. - bool PushPendingLogsToPersistentStorage(); + // Called when Chrome shuts down. + void PushPendingLogsToPersistentStorage(); // Ensures that scheduler is running, assuming the current settings are such // that metrics should be reported. If not, this is a no-op. @@ -280,6 +281,14 @@ // true if a log was created. bool PrepareInitialStabilityLog(const std::string& prefs_previous_version); + // Prepares the initial metrics log, which includes startup histograms and + // profiler data, as well as incremental stability-related metrics. + void PrepareInitialMetricsLog(); + + // Reads, increments and then sets the specified long preference that is + // stored as a string. + void IncrementLongPrefsValue(const char* path); + // Records that the browser was shut down cleanly. void LogCleanShutdown(bool end_completed); @@ -353,6 +362,11 @@ // state. State state_; + // The initial metrics log, used to record startup metrics (histograms and + // profiler data). Note that if a crash occurred in the previous session, an + // initial stability log may be sent before this. + std::unique_ptr<MetricsLog> initial_metrics_log_; + // Whether the MetricsService object has received any notifications since // the last time a transmission was sent. bool idle_since_last_transmission_;
diff --git a/components/metrics/metrics_service_unittest.cc b/components/metrics/metrics_service_unittest.cc index a61a1fce..5186745 100644 --- a/components/metrics/metrics_service_unittest.cc +++ b/components/metrics/metrics_service_unittest.cc
@@ -215,12 +215,6 @@ return GetHistogramSampleCount(log, kOnDidCreateMetricsLogHistogramName); } - int GetNumberOfUserActions(MetricsLogStore* test_log_store) { - ChromeUserMetricsExtension log; - EXPECT_TRUE(DecodeLogDataToProto(test_log_store->staged_log(), &log)); - return log.user_action_event_size(); - } - protected: scoped_refptr<base::TestSimpleTaskRunner> task_runner_; base::ThreadTaskRunnerHandle task_runner_handle_; @@ -429,8 +423,7 @@ std::unique_ptr<MetricsProvider>(test_provider)); service.InitializeMetricsRecordingState(); - // Start() will create the MetricsLog object for the first ongoing log, which - // won't be closed until the init task is complete. + // Start() will create the first ongoing log. service.Start(); ASSERT_EQ(TestMetricsService::INIT_TASK_SCHEDULED, service.state()); @@ -458,67 +451,14 @@ EXPECT_EQ(1, GetSampleCountOfOnDidCreateLogHistogram(test_log_store)); } -TEST_F(MetricsServiceTest, LogHasUserActions) { - // This test verifies that user actions are properly captured in UMA logs. - // In particular, it checks that the first log has actions, a behavior that - // was buggy in the past, plus additional checks for subsequent logs with - // different numbers of actions. - EnableMetricsReporting(); - TestMetricsServiceClient client; - TestMetricsService service(GetMetricsStateManager(), &client, - GetLocalState()); - - service.InitializeMetricsRecordingState(); - - // Start() will create an initial log. - service.Start(); - ASSERT_EQ(TestMetricsService::INIT_TASK_SCHEDULED, service.state()); - - base::RecordAction(base::UserMetricsAction("TestAction")); - base::RecordAction(base::UserMetricsAction("TestAction")); - base::RecordAction(base::UserMetricsAction("DifferentAction")); - - // Run pending tasks to finish init task and complete the first ongoing log. - task_runner_->RunPendingTasks(); - ASSERT_EQ(TestMetricsService::SENDING_LOGS, service.state()); - - MetricsLogStore* test_log_store = service.LogStoreForTest(); - - // Stage the next log, which should be the initial metrics log. - test_log_store->StageNextLog(); - EXPECT_EQ(3, GetNumberOfUserActions(test_log_store)); - - // Log another action. - base::RecordAction(base::UserMetricsAction("TestAction")); - test_log_store->DiscardStagedLog(); - service.StageCurrentLogForTest(); - EXPECT_EQ(1, GetNumberOfUserActions(test_log_store)); - - // Check a log with no actions. - test_log_store->DiscardStagedLog(); - service.StageCurrentLogForTest(); - EXPECT_EQ(0, GetNumberOfUserActions(test_log_store)); - - // And another one with a couple. - base::RecordAction(base::UserMetricsAction("TestAction")); - base::RecordAction(base::UserMetricsAction("TestAction")); - test_log_store->DiscardStagedLog(); - service.StageCurrentLogForTest(); - EXPECT_EQ(2, GetNumberOfUserActions(test_log_store)); -} - TEST_F(MetricsServiceTest, FirstLogCreatedBeforeUnsentLogsSent) { - // This test checks that we will create and serialize the first ongoing log - // before starting to send unsent logs from the past session. The latter is - // simulated by injecting some fake ongoing logs into the MetricsLogStore. EnableMetricsReporting(); TestMetricsServiceClient client; TestMetricsService service(GetMetricsStateManager(), &client, GetLocalState()); service.InitializeMetricsRecordingState(); - // Start() will create the MetricsLog object for the first ongoing log, which - // won't be closed until the init task is complete. + // Start() will create the first ongoing log. service.Start(); ASSERT_EQ(TestMetricsService::INIT_TASK_SCHEDULED, service.state()); @@ -537,8 +477,8 @@ // Run pending tasks to finish init task and complete the first ongoing log. task_runner_->RunPendingTasks(); ASSERT_EQ(TestMetricsService::SENDING_LOGS, service.state()); - // When the init task is complete, the first ongoing log for this session - // should be created and added to the ongoing logs. + // When the init task is complete, the first ongoing log should be created + // and added to the ongoing logs. EXPECT_EQ(0u, test_log_store->initial_log_count()); EXPECT_EQ(2u, test_log_store->ongoing_log_count()); }
diff --git a/components/no_state_prefetch/renderer/no_state_prefetch_helper.cc b/components/no_state_prefetch/renderer/no_state_prefetch_helper.cc index a12372103..169c9911 100644 --- a/components/no_state_prefetch/renderer/no_state_prefetch_helper.cc +++ b/components/no_state_prefetch/renderer/no_state_prefetch_helper.cc
@@ -32,10 +32,10 @@ NoStatePrefetchHelper::MaybeCreateThrottle(int render_frame_id) { content::RenderFrame* render_frame = content::RenderFrame::FromRoutingID(render_frame_id); - auto* helper = render_frame - ? NoStatePrefetchHelper::Get( - render_frame->GetRenderView()->GetMainRenderFrame()) - : nullptr; + auto* helper = + render_frame + ? NoStatePrefetchHelper::Get(render_frame->GetMainRenderFrame()) + : nullptr; if (!helper) return nullptr;
diff --git a/components/omnibox/browser/most_visited_sites_provider.cc b/components/omnibox/browser/most_visited_sites_provider.cc index 8d3ea902..769bcea 100644 --- a/components/omnibox/browser/most_visited_sites_provider.cc +++ b/components/omnibox/browser/most_visited_sites_provider.cc
@@ -43,7 +43,8 @@ void MostVisitedSitesProvider::Stop(bool clear_cached_results, bool due_to_user_inactivity) { request_weak_ptr_factory_.InvalidateWeakPtrs(); - matches_.clear(); + if (clear_cached_results) + matches_.clear(); } MostVisitedSitesProvider::MostVisitedSitesProvider(
diff --git a/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc b/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc index 189da59..8a65be9 100644 --- a/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc +++ b/components/omnibox/browser/zero_suggest_verbatim_match_provider.cc
@@ -87,5 +87,6 @@ void ZeroSuggestVerbatimMatchProvider::Stop(bool clear_cached_results, bool due_to_user_inactivity) { - matches_.clear(); + if (clear_cached_results) + matches_.clear(); }
diff --git a/components/onc/onc_constants.cc b/components/onc/onc_constants.cc index 9d4ace95..c91c2d9 100644 --- a/components/onc/onc_constants.cc +++ b/components/onc/onc_constants.cc
@@ -339,6 +339,7 @@ } // namespace eap_subject_alternative_name_match namespace vpn { +const char kArcVpn[] = "ARCVPN"; const char kAutoConnect[] = "AutoConnect"; const char kHost[] = "Host"; const char kIPsec[] = "IPsec"; @@ -347,10 +348,10 @@ const char kPassword[] = "Password"; const char kSaveCredentials[] = "SaveCredentials"; const char kThirdPartyVpn[] = "ThirdPartyVPN"; -const char kArcVpn[] = "ARCVPN"; const char kTypeL2TP_IPsec[] = "L2TP-IPsec"; const char kType[] = "Type"; const char kUsername[] = "Username"; +const char kWireGuard[] = "WireGuard"; } // namespace vpn namespace ipsec {
diff --git a/components/onc/onc_constants.h b/components/onc/onc_constants.h index 73b2615..cad2b64 100644 --- a/components/onc/onc_constants.h +++ b/components/onc/onc_constants.h
@@ -352,6 +352,7 @@ } // namespace eap_subject_alternative_name_match namespace vpn { +ONC_EXPORT extern const char kArcVpn[]; ONC_EXPORT extern const char kAutoConnect[]; ONC_EXPORT extern const char kHost[]; ONC_EXPORT extern const char kIPsec[]; @@ -360,10 +361,10 @@ ONC_EXPORT extern const char kPassword[]; ONC_EXPORT extern const char kSaveCredentials[]; ONC_EXPORT extern const char kThirdPartyVpn[]; -ONC_EXPORT extern const char kArcVpn[]; ONC_EXPORT extern const char kTypeL2TP_IPsec[]; ONC_EXPORT extern const char kType[]; ONC_EXPORT extern const char kUsername[]; +ONC_EXPORT extern const char kWireGuard[]; } // namespace vpn namespace ipsec {
diff --git a/components/openscreen_platform/BUILD.gn b/components/openscreen_platform/BUILD.gn index c57f5b5..004f974 100644 --- a/components/openscreen_platform/BUILD.gn +++ b/components/openscreen_platform/BUILD.gn
@@ -65,6 +65,25 @@ ] } +if (!is_win && !is_ios) { + source_set("message_port_tls_connection") { + sources = [ + "message_port_tls_connection.cc", + "message_port_tls_connection.h", + ] + + public_deps = [ + "//components/cast/message_port", + "//third_party/openscreen/src/platform", + ] + + deps = [ + "//base", + "//net", + ] + } +} + source_set("unittests") { testonly = true @@ -80,4 +99,9 @@ "//testing/gmock", "//testing/gtest", ] + + if (!is_win && !is_ios) { + sources += [ "message_port_tls_connection_unittest.cc" ] + deps += [ ":message_port_tls_connection" ] + } }
diff --git a/components/openscreen_platform/DEPS b/components/openscreen_platform/DEPS index 3945295..c057a46 100644 --- a/components/openscreen_platform/DEPS +++ b/components/openscreen_platform/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+components/cast/message_port", "+mojo/public/cpp", "+net", "+services/network/public/mojom",
diff --git a/components/openscreen_platform/message_port_tls_connection.cc b/components/openscreen_platform/message_port_tls_connection.cc new file mode 100644 index 0000000..cf87e742 --- /dev/null +++ b/components/openscreen_platform/message_port_tls_connection.cc
@@ -0,0 +1,83 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/openscreen_platform/message_port_tls_connection.h" + +#include "third_party/openscreen/src/platform/api/task_runner.h" +#include "third_party/openscreen/src/platform/base/error.h" + +namespace openscreen_platform { + +MessagePortTlsConnection::MessagePortTlsConnection( + std::unique_ptr<cast_api_bindings::MessagePort> message_port, + openscreen::TaskRunner* task_runner) + : message_port_(std::move(message_port)), task_runner_(task_runner) { + DCHECK(message_port_); + DCHECK(task_runner_); + + message_port_->SetReceiver(this); +} + +MessagePortTlsConnection::~MessagePortTlsConnection() = default; + +// TlsConnection overrides. +void MessagePortTlsConnection::SetClient(TlsConnection::Client* client) { + DCHECK(task_runner_->IsRunningOnTaskRunner()); + client_ = client; +} + +bool MessagePortTlsConnection::Send(const void* data, size_t len) { + return message_port_->PostMessage( + base::StringPiece(static_cast<const char*>(data), len)); +} + +openscreen::IPEndpoint MessagePortTlsConnection::GetLocalEndpoint() const { + return openscreen::IPEndpoint{openscreen::IPAddress::kV4LoopbackAddress()}; +} + +openscreen::IPEndpoint MessagePortTlsConnection::GetRemoteEndpoint() const { + return openscreen::IPEndpoint{openscreen::IPAddress::kV6LoopbackAddress()}; +} + +bool MessagePortTlsConnection::OnMessage( + base::StringPiece message, + std::vector<std::unique_ptr<cast_api_bindings::MessagePort>> ports) { + DCHECK(ports.empty()); + + if (client_) { + if (!task_runner_->IsRunningOnTaskRunner()) { + task_runner_->PostTask([ptr = AsWeakPtr(), m = std::move(message)]() { + if (ptr) { + ptr->OnMessage( + std::move(m), + std::vector<std::unique_ptr<cast_api_bindings::MessagePort>>()); + } + }); + + return true; + } + + client_->OnRead(this, std::vector<uint8_t>(message.begin(), message.end())); + } + + return true; +} + +void MessagePortTlsConnection::OnPipeError() { + if (client_) { + if (!task_runner_->IsRunningOnTaskRunner()) { + task_runner_->PostTask([ptr = AsWeakPtr()]() { + if (ptr) { + ptr->OnPipeError(); + } + }); + return; + } + + client_->OnError( + this, openscreen::Error(openscreen::Error::Code::kSocketFailure)); + } +} + +} // namespace openscreen_platform
diff --git a/components/openscreen_platform/message_port_tls_connection.h b/components/openscreen_platform/message_port_tls_connection.h new file mode 100644 index 0000000..d7bef37b --- /dev/null +++ b/components/openscreen_platform/message_port_tls_connection.h
@@ -0,0 +1,59 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_OPENSCREEN_PLATFORM_MESSAGE_PORT_TLS_CONNECTION_H_ +#define COMPONENTS_OPENSCREEN_PLATFORM_MESSAGE_PORT_TLS_CONNECTION_H_ + +#include <memory> +#include <vector> + +#include "base/memory/weak_ptr.h" +#include "base/strings/string_piece.h" +#include "components/cast/message_port/message_port.h" +#include "third_party/openscreen/src/platform/api/tls_connection.h" +#include "third_party/openscreen/src/platform/base/ip_address.h" + +namespace openscreen { +class TaskRunner; +} // namespace openscreen + +namespace openscreen_platform { + +// A TlsConnection implementation that is backed by a MessagePort. All messages +// received by the MessagePort are played out on the TlsConnection::Client +// that has been set, and all messages sent on the TlsConnection are forwarded +// to the MessagePort. +class MessagePortTlsConnection final + : public openscreen::TlsConnection, + public cast_api_bindings::MessagePort::Receiver, + public base::SupportsWeakPtr<MessagePortTlsConnection> { + public: + MessagePortTlsConnection( + std::unique_ptr<cast_api_bindings::MessagePort> message_port, + openscreen::TaskRunner* task_runner); + + ~MessagePortTlsConnection() final; + + // TlsConnection overrides. + void SetClient(TlsConnection::Client* client) final; + bool Send(const void* data, size_t len) final; + openscreen::IPEndpoint GetLocalEndpoint() const final; + openscreen::IPEndpoint GetRemoteEndpoint() const final; + + private: + // MessagePort::Receiver overrides. + bool OnMessage( + base::StringPiece message, + std::vector<std::unique_ptr<cast_api_bindings::MessagePort>> ports) final; + void OnPipeError() final; + + std::unique_ptr<cast_api_bindings::MessagePort> message_port_; + openscreen::TaskRunner* const task_runner_; + + TlsConnection::Client* client_ = nullptr; +}; + +} // namespace openscreen_platform + +#endif // COMPONENTS_OPENSCREEN_PLATFORM_MESSAGE_PORT_TLS_CONNECTION_H_
diff --git a/components/openscreen_platform/message_port_tls_connection_unittest.cc b/components/openscreen_platform/message_port_tls_connection_unittest.cc new file mode 100644 index 0000000..4d62855 --- /dev/null +++ b/components/openscreen_platform/message_port_tls_connection_unittest.cc
@@ -0,0 +1,170 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/openscreen_platform/message_port_tls_connection.h" + +#include <memory> +#include <queue> + +#include "base/strings/string_piece.h" +#include "components/cast/message_port/message_port.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/openscreen/src/platform/api/task_runner.h" +#include "third_party/openscreen/src/platform/api/tls_connection.h" +#include "third_party/openscreen/src/platform/base/ip_address.h" + +using ::testing::_; +using ::testing::Mock; +using ::testing::Return; +using ::testing::StrictMock; + +namespace openscreen_platform { +namespace { + +class MockMessagePort : public cast_api_bindings::MessagePort { + public: + ~MockMessagePort() override = default; + + MOCK_METHOD1(PostMessage, bool(base::StringPiece)); + MOCK_METHOD2(PostMessageWithTransferables, + bool(base::StringPiece, + std::vector<std::unique_ptr<MessagePort>>)); + MOCK_METHOD1(SetReceiver, void(cast_api_bindings::MessagePort::Receiver*)); + MOCK_METHOD0(Close, void()); + MOCK_CONST_METHOD0(CanPostMessage, bool()); +}; + +class MockTlsConnectionClient : public openscreen::TlsConnection::Client { + public: + ~MockTlsConnectionClient() override = default; + + MOCK_METHOD2(OnRead, void(openscreen::TlsConnection*, std::vector<uint8_t>)); + MOCK_METHOD2(OnError, void(openscreen::TlsConnection*, openscreen::Error)); +}; + +class MockTaskRunner : public openscreen::TaskRunner { + public: + ~MockTaskRunner() override = default; + + // openscreen::TaskRunner overrides; + MOCK_METHOD2(PostPackagedTaskWithDelay, + void(Task, openscreen::Clock::duration)); + MOCK_METHOD0(IsRunningOnTaskRunner, bool()); + + void PostPackagedTask(Task task) { + tasks_.push(std::move(task)); + PostTask(); + } + + void RunTasksUntilIdle() { + while (!tasks_.empty()) { + tasks_.front()(); + tasks_.pop(); + } + } + + MOCK_METHOD0(PostTask, void()); + + private: + std::queue<Task> tasks_; +}; + +} // namespace + +class MessagePortTlsConnectionTest : public testing::Test { + public: + MessagePortTlsConnectionTest() { + auto message_port = std::make_unique<MockMessagePort>(); + message_port_ = message_port.get(); + + EXPECT_CALL(*message_port_, SetReceiver(_)); + connection_ = std::make_unique<MessagePortTlsConnection>( + std::move(message_port), &task_runner_); + connection_as_receiver_ = connection_.get(); + } + ~MessagePortTlsConnectionTest() override = default; + + protected: + std::unique_ptr<MessagePortTlsConnection> connection_; + cast_api_bindings::MessagePort::Receiver* connection_as_receiver_; + + MockMessagePort* message_port_; + StrictMock<MockTlsConnectionClient> client_; + StrictMock<MockTaskRunner> task_runner_; +}; + +TEST_F(MessagePortTlsConnectionTest, OnMessage) { + base::StringPiece message = "foo"; + + // No operation done when no client is set. + connection_as_receiver_->OnMessage(message, {}); + + // Setting the client checks the Task runner. + // NOTE: The IsRunningOnTaskRunner() call is DCHECK'd, so it will only run on + // debug builds - so it may be called zero or one times. + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()) + .WillRepeatedly(Return(true)); + connection_->SetClient(&client_); + + // Once the client is set, a callback is made when OnMessage*() is called on + // the correct task runner. + message = "bar"; + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()).WillOnce(Return(true)); + EXPECT_CALL(client_, + OnRead(connection_.get(), + std::vector<uint8_t>(message.begin(), message.end()))); + connection_as_receiver_->OnMessage(message, {}); + + // Once the client is set, a callback is pushed to the task runner if it's not + // already being run from there. + message = "foobar"; + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()).WillOnce(Return(false)); + EXPECT_CALL(task_runner_, PostTask()); + connection_as_receiver_->OnMessage(message, {}); + + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()).WillOnce(Return(true)); + EXPECT_CALL(client_, + OnRead(connection_.get(), + std::vector<uint8_t>(message.begin(), message.end()))); + task_runner_.RunTasksUntilIdle(); +} + +TEST_F(MessagePortTlsConnectionTest, OnPipeError) { + // No operation done when no client is set. + connection_as_receiver_->OnPipeError(); + + // Setting the client checks the Task runner. + // NOTE: The IsRunningOnTaskRunner() call is DCHECK'd, so it will only run on + // debug builds - so it may be called zero or one times. + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()) + .WillRepeatedly(Return(true)); + connection_->SetClient(&client_); + + // Once the client is set, a callback is made when OnPipeError() is called on + // the correct task runner. + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()).WillOnce(Return(true)); + EXPECT_CALL(client_, OnError(connection_.get(), _)); + connection_as_receiver_->OnPipeError(); + + // Once the client is set, a callback is pushed to the task runner if it's not + // already being run from there. + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()).WillOnce(Return(false)); + EXPECT_CALL(task_runner_, PostTask()); + connection_as_receiver_->OnPipeError(); + + EXPECT_CALL(task_runner_, IsRunningOnTaskRunner()).WillOnce(Return(true)); + EXPECT_CALL(client_, OnError(connection_.get(), _)); + task_runner_.RunTasksUntilIdle(); +} + +TEST_F(MessagePortTlsConnectionTest, Send) { + const base::StringPiece message = "foobar"; + + // Set data is always forwarded to the underlying MessagePort's Send(). + EXPECT_CALL(*message_port_, PostMessage(message)); + connection_->Send(message.data(), message.length()); +} + +} // namespace openscreen_platform
diff --git a/components/paint_preview/browser/BUILD.gn b/components/paint_preview/browser/BUILD.gn index 41d74474..7dc28043 100644 --- a/components/paint_preview/browser/BUILD.gn +++ b/components/paint_preview/browser/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromeos/ui_mode.gni") import("//build/util/version.gni") import("//testing/test.gni") @@ -103,6 +104,7 @@ ":test_support", "//base", "//base/test:test_support", + "//build:chromeos_buildflags", "//components/paint_preview/common:test_utils", "//content/public/browser", "//content/test:test_support", @@ -112,6 +114,10 @@ "//url", ] + if (is_chromeos_lacros) { + deps += [ "//chromeos/lacros:test_support" ] + } + defines = [ "CHROME_VERSION_MAJOR=" + chrome_version_major, "CHROME_VERSION_MINOR=" + chrome_version_minor,
diff --git a/components/paint_preview/browser/DEPS b/components/paint_preview/browser/DEPS index fea23bd7..e6e5c8e7 100644 --- a/components/paint_preview/browser/DEPS +++ b/components/paint_preview/browser/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+cc/base", + "+chromeos/lacros", "+components/discardable_memory/service", "+components/keyed_service/core", "+components/services/paint_preview_compositor/public/mojom",
diff --git a/components/paint_preview/browser/paint_preview_base_service_unittest.cc b/components/paint_preview/browser/paint_preview_base_service_unittest.cc index dcbde0b2..79f06b5 100644 --- a/components/paint_preview/browser/paint_preview_base_service_unittest.cc +++ b/components/paint_preview/browser/paint_preview_base_service_unittest.cc
@@ -13,6 +13,7 @@ #include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" +#include "build/chromeos_buildflags.h" #include "components/paint_preview/browser/paint_preview_base_service_test_factory.h" #include "components/paint_preview/browser/paint_preview_file_mixin.h" #include "components/paint_preview/common/mojom/paint_preview_recorder.mojom.h" @@ -26,6 +27,10 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chromeos/lacros/lacros_test_helper.h" +#endif + namespace paint_preview { namespace { @@ -192,6 +197,10 @@ } private: +#if BUILDFLAG(IS_CHROMEOS_LACROS) + // Instantiate LacrosService for WakeLock support during capturing. + chromeos::ScopedLacrosServiceTestHelper scoped_lacros_service_test_helper_; +#endif std::unique_ptr<SimpleFactoryKey> key_; std::unique_ptr<SimpleFactoryKey> rejection_policy_key_; };
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 2ad895f..d13c8ffa 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -91,6 +91,8 @@ "generation/password_requirements_spec_fetcher_impl.h", "generation/password_requirements_spec_printer.cc", "generation/password_requirements_spec_printer.h", + "get_logins_with_affiliations_request_handler.cc", + "get_logins_with_affiliations_request_handler.h", "hsts_query.cc", "hsts_query.h", "http_auth_manager.h", @@ -625,6 +627,7 @@ "form_saver_impl_unittest.cc", "generation/password_generator_unittest.cc", "generation/password_requirements_spec_fetcher_unittest.cc", + "get_logins_with_affiliations_request_handler_unittest.cc", "hsts_query_unittest.cc", "http_auth_manager_unittest.cc", "http_password_store_migrator_unittest.cc",
diff --git a/components/password_manager/core/browser/get_logins_with_affiliations_request_handler.cc b/components/password_manager/core/browser/get_logins_with_affiliations_request_handler.cc new file mode 100644 index 0000000..a3172c2 --- /dev/null +++ b/components/password_manager/core/browser/get_logins_with_affiliations_request_handler.cc
@@ -0,0 +1,76 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/get_logins_with_affiliations_request_handler.h" + +#include "base/bind.h" +#include "base/callback.h" + +#include "components/password_manager/core/browser/password_form.h" +#include "components/password_manager/core/browser/password_manager_util.h" +#include "components/password_manager/core/browser/password_store_consumer.h" + +namespace password_manager { + +namespace { + +// Number of time 'forms_received_' closure should be called before executing. +// Once for perfect matches and once for affiliations. +constexpr int kCallsNumber = 2; + +} // namespace + +GetLoginsWithAffiliationsRequestHandler:: + GetLoginsWithAffiliationsRequestHandler( + base::WeakPtr<PasswordStoreConsumer> consumer, + PasswordStore* store) + : consumer_(std::move(consumer)), store_(store) { + forms_received_ = base::BarrierClosure( + kCallsNumber, + base::BindOnce(&GetLoginsWithAffiliationsRequestHandler::NotifyConsumer, + base::Unretained(this))); +} + +GetLoginsWithAffiliationsRequestHandler:: + ~GetLoginsWithAffiliationsRequestHandler() = default; + +base::OnceCallback<void(std::vector<std::unique_ptr<PasswordForm>>)> +GetLoginsWithAffiliationsRequestHandler::LoginsForFormClosure() { + return base::BindOnce( + &GetLoginsWithAffiliationsRequestHandler::HandleLoginsForFormReceived, + this); +} + +base::OnceCallback<void(std::vector<std::unique_ptr<PasswordForm>>)> +GetLoginsWithAffiliationsRequestHandler::AffiliatedLoginsClosure() { + return base::BindOnce( + &GetLoginsWithAffiliationsRequestHandler::HandleAffiliatedLoginsReceived, + this); +} + +void GetLoginsWithAffiliationsRequestHandler::HandleLoginsForFormReceived( + std::vector<std::unique_ptr<PasswordForm>> logins) { + results_.insert(results_.end(), std::make_move_iterator(logins.begin()), + std::make_move_iterator(logins.end())); + forms_received_.Run(); +} + +void GetLoginsWithAffiliationsRequestHandler::HandleAffiliatedLoginsReceived( + std::vector<std::unique_ptr<PasswordForm>> logins) { + password_manager_util::TrimUsernameOnlyCredentials(&logins); + std::transform(logins.begin(), logins.end(), std::back_inserter(results_), + [](auto& form) { + form->is_affiliation_based_match = true; + return std::move(form); + }); + forms_received_.Run(); +} + +void GetLoginsWithAffiliationsRequestHandler::NotifyConsumer() { + if (!consumer_) + return; + consumer_->OnGetPasswordStoreResultsFrom(store_, std::move(results_)); +} + +} // namespace password_manager
diff --git a/components/password_manager/core/browser/get_logins_with_affiliations_request_handler.h b/components/password_manager/core/browser/get_logins_with_affiliations_request_handler.h new file mode 100644 index 0000000..8e0aaaa --- /dev/null +++ b/components/password_manager/core/browser/get_logins_with_affiliations_request_handler.h
@@ -0,0 +1,64 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains utilities related to PasswordStore. + +#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_GET_LOGINS_WITH_AFFILIATIONS_REQUEST_HANDLER_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_GET_LOGINS_WITH_AFFILIATIONS_REQUEST_HANDLER_H_ + +#include "base/barrier_closure.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_refptr.h" + +namespace password_manager { + +class PasswordStore; +class PasswordStoreConsumer; +struct PasswordForm; + +// Helper object which is used to obtain PasswordForms for a particular login +// and affiliated logins parallelly. 'consumer' is notified about result +// afterwards. +class GetLoginsWithAffiliationsRequestHandler + : public base::RefCounted<GetLoginsWithAffiliationsRequestHandler> { + public: + using LoginsResult = std::vector<std::unique_ptr<PasswordForm>>; + + GetLoginsWithAffiliationsRequestHandler( + base::WeakPtr<PasswordStoreConsumer> consumer, + PasswordStore* store); + + // Returns a OnceCallback that calls 'HandleLoginsForFormReceived()'. + base::OnceCallback<void(LoginsResult)> LoginsForFormClosure(); + + // Returns a OnceCallback that calls 'HandleAffiliatedLoginsReceived()'. + base::OnceCallback<void(LoginsResult)> AffiliatedLoginsClosure(); + + private: + friend class base::RefCounted<GetLoginsWithAffiliationsRequestHandler>; + ~GetLoginsWithAffiliationsRequestHandler(); + + // Appends logins to the 'results_' and calls 'forms_received_'. + void HandleLoginsForFormReceived(LoginsResult logins); + + // Marks logins as affiliated and trims username only. Afterwards appends + // result to 'results_' and calls 'forms_received_'. + void HandleAffiliatedLoginsReceived(LoginsResult logins); + + void NotifyConsumer(); + + base::WeakPtr<PasswordStoreConsumer> consumer_; + + PasswordStore* store_; + + // Closure which is released after being called 2 times. + base::RepeatingClosure forms_received_; + + // PasswordForms to be sent to consumer. + std::vector<std::unique_ptr<PasswordForm>> results_; +}; + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_GET_LOGINS_WITH_AFFILIATIONS_REQUEST_HANDLER_H_
diff --git a/components/password_manager/core/browser/get_logins_with_affiliations_request_handler_unittest.cc b/components/password_manager/core/browser/get_logins_with_affiliations_request_handler_unittest.cc new file mode 100644 index 0000000..eae2acfb --- /dev/null +++ b/components/password_manager/core/browser/get_logins_with_affiliations_request_handler_unittest.cc
@@ -0,0 +1,163 @@ +// Copyright 2016 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/password_manager/core/browser/get_logins_with_affiliations_request_handler.h" + +#include "base/callback.h" +#include "base/test/task_environment.h" + +#include "components/password_manager/core/browser/mock_password_store.h" +#include "components/password_manager/core/browser/password_form.h" +#include "components/password_manager/core/browser/password_manager_test_utils.h" +#include "components/password_manager/core/browser/password_store_consumer.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace password_manager { + +namespace { + +// Creates a form. +PasswordForm CreateForm(base::StringPiece16 username, + base::StringPiece16 password) { + PasswordForm form; + form.username_value = std::u16string(username); + form.password_value = std::u16string(password); + return form; +} + +std::vector<std::unique_ptr<PasswordForm>> MakeCopy( + const std::vector<PasswordForm>& forms) { + std::vector<std::unique_ptr<PasswordForm>> copy; + for (const auto& form : forms) + copy.push_back(std::make_unique<PasswordForm>(form)); + return copy; +} + +class MockPasswordStoreConsumer : public PasswordStoreConsumer { + public: + MockPasswordStoreConsumer() = default; + + MOCK_METHOD(void, + OnGetPasswordStoreResultsConstRef, + (const std::vector<PasswordForm>&), + ()); + + // GMock cannot mock methods with move-only args. + void OnGetPasswordStoreResults( + std::vector<std::unique_ptr<PasswordForm>> results) override { + std::vector<PasswordForm> forms; + base::ranges::transform(results, std::back_inserter(forms), + [](auto& result) { return std::move(*result); }); + OnGetPasswordStoreResultsConstRef(forms); + } +}; + +} // namespace + +class GetLoginsWithAffiliationsRequestHandlerTest : public testing::Test { + public: + GetLoginsWithAffiliationsRequestHandlerTest() + : store_(new MockPasswordStore()), + consumer_(new MockPasswordStoreConsumer()) {} + + MockPasswordStoreConsumer* consumer() { return consumer_.get(); } + MockPasswordStore* store() { return store_.get(); } + scoped_refptr<GetLoginsWithAffiliationsRequestHandler> MakeRequestHandler() { + return base::MakeRefCounted<GetLoginsWithAffiliationsRequestHandler>( + consumer_->GetWeakPtr(), store_.get()); + } + + void TearDown() override { store()->ShutdownOnUIThread(); } + + private: + base::test::SingleThreadTaskEnvironment task_environment_; + scoped_refptr<MockPasswordStore> store_; + std::unique_ptr<MockPasswordStoreConsumer> consumer_; +}; + +TEST_F(GetLoginsWithAffiliationsRequestHandlerTest, LoginsReceivedFirst) { + std::vector<PasswordForm> forms = { + CreateForm(u"username1", u"password"), + CreateForm(u"username2", u"password"), + }; + PasswordForm affiliated_form = CreateForm(u"username3", u"password"); + + std::vector<PasswordForm> expected_forms = forms; + expected_forms.push_back(affiliated_form); + expected_forms.back().is_affiliation_based_match = true; + + auto handler = MakeRequestHandler(); + handler->LoginsForFormClosure().Run(MakeCopy(forms)); + + EXPECT_CALL(*consumer(), + OnGetPasswordStoreResultsConstRef( + testing::UnorderedElementsAreArray(expected_forms))); + + handler->AffiliatedLoginsClosure().Run(MakeCopy({affiliated_form})); +} + +TEST_F(GetLoginsWithAffiliationsRequestHandlerTest, + AffiliatedLoginsReceivedFirst) { + std::vector<PasswordForm> forms = { + CreateForm(u"username1", u"password"), + CreateForm(u"username2", u"password"), + }; + PasswordForm affiliated_form = CreateForm(u"username3", u"password"); + std::vector<PasswordForm> expected_forms = forms; + expected_forms.push_back(affiliated_form); + expected_forms.back().is_affiliation_based_match = true; + + auto handler = MakeRequestHandler(); + handler->AffiliatedLoginsClosure().Run(MakeCopy({affiliated_form})); + + EXPECT_CALL(*consumer(), + OnGetPasswordStoreResultsConstRef( + testing::UnorderedElementsAreArray(expected_forms))); + + handler->LoginsForFormClosure().Run(MakeCopy(forms)); +} + +TEST_F(GetLoginsWithAffiliationsRequestHandlerTest, ConsumerNotNotified) { + auto handler = MakeRequestHandler(); + std::vector<PasswordForm> forms = { + CreateForm(u"username1", u"password"), + CreateForm(u"username2", u"password"), + }; + PasswordForm affiliated_form = CreateForm(u"username3", u"password"); + + consumer()->CancelAllRequests(); + EXPECT_CALL(*consumer(), OnGetPasswordStoreResultsConstRef).Times(0); + + handler->AffiliatedLoginsClosure().Run(MakeCopy({affiliated_form})); + handler->LoginsForFormClosure().Run(MakeCopy(forms)); +} + +// Tests that handler lives out of scope it was declared. +TEST_F(GetLoginsWithAffiliationsRequestHandlerTest, LivesLongerThanScope) { + base::OnceCallback<void(std::vector<std::unique_ptr<PasswordForm>>)> + forms_callback; + base::OnceCallback<void(std::vector<std::unique_ptr<PasswordForm>>)> + affiliated_callback; + + { + auto handler = MakeRequestHandler(); + forms_callback = handler->LoginsForFormClosure(); + affiliated_callback = handler->LoginsForFormClosure(); + }; + + std::vector<PasswordForm> forms = { + CreateForm(u"username1", u"password"), + CreateForm(u"username2", u"password"), + }; + + std::move(forms_callback).Run(MakeCopy(forms)); + + EXPECT_CALL(*consumer(), OnGetPasswordStoreResultsConstRef( + testing::UnorderedElementsAreArray(forms))); + + std::move(affiliated_callback).Run({}); +} + +} // namespace password_manager
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h index 788180f..82f03a2 100644 --- a/components/password_manager/core/browser/mock_password_store.h +++ b/components/password_manager/core/browser/mock_password_store.h
@@ -58,6 +58,11 @@ const PasswordFormDigest& form) override { return std::vector<std::unique_ptr<PasswordForm>>(); } + void FillMatchingLoginsAsync( + LoginsReply callback, + const std::vector<PasswordFormDigest>& forms) override { + std::move(callback).Run(std::vector<std::unique_ptr<PasswordForm>>()); + } MOCK_METHOD1( FillMatchingLoginsByPassword, std::vector<std::unique_ptr<PasswordForm>>(const std::u16string&));
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index 7ac48379..e676c8e 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -31,6 +31,7 @@ #include "components/autofill/core/common/form_data.h" #include "components/password_manager/core/browser/android_affiliation/affiliated_match_helper.h" #include "components/password_manager/core/browser/field_info_table.h" +#include "components/password_manager/core/browser/get_logins_with_affiliations_request_handler.h" #include "components/password_manager/core/browser/insecure_credentials_consumer.h" #include "components/password_manager/core/browser/insecure_credentials_table.h" #include "components/password_manager/core/browser/password_form.h" @@ -82,6 +83,14 @@ &InsecureCredential::insecure_type); } +std::vector<PasswordFormDigest> ConvertToForms( + const std::vector<std::string>& realms) { + std::vector<PasswordFormDigest> forms; + for (const auto& realm : realms) + forms.emplace_back(PasswordForm::Scheme::kHtml, realm, GURL(realm)); + return forms; +} + } // namespace void PasswordStore::Observer::OnLoginsChangedIn( @@ -239,15 +248,21 @@ DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("passwords", "PasswordStore::GetLogins", consumer); + + scoped_refptr<GetLoginsWithAffiliationsRequestHandler> request_handler = + new GetLoginsWithAffiliationsRequestHandler(consumer->GetWeakPtr(), this); + if (affiliated_match_helper_) { affiliated_match_helper_->GetAffiliatedAndroidAndWebRealms( - form, base::BindOnce( - &PasswordStore::ScheduleGetFilteredLoginsWithAffiliations, - this, consumer->GetWeakPtr(), form)); + form, + base::BindOnce(ConvertToForms) + .Then(base::BindOnce(&PasswordStore::FillMatchingLoginsAsync, this, + request_handler->AffiliatedLoginsClosure()))); } else { - PostLoginsTaskAndReplyToConsumerWithResult( - consumer, base::BindOnce(&PasswordStore::GetLoginsImpl, this, form)); + request_handler->AffiliatedLoginsClosure().Run({}); } + + FillMatchingLoginsAsync(request_handler->LoginsForFormClosure(), {form}); } void PasswordStore::GetLoginsByPassword( @@ -1103,25 +1118,6 @@ return results; } -std::vector<std::unique_ptr<PasswordForm>> -PasswordStore::GetLoginsWithAffiliationsImpl( - const PasswordFormDigest& form, - const std::vector<std::string>& additional_affiliated_realms) { - DCHECK(background_task_runner_->RunsTasksInCurrentSequence()); - std::vector<std::unique_ptr<PasswordForm>> results(FillMatchingLogins(form)); - for (const std::string& realm : additional_affiliated_realms) { - std::vector<std::unique_ptr<PasswordForm>> more_results( - FillMatchingLogins({PasswordForm::Scheme::kHtml, realm, GURL()})); - for (auto& result : more_results) - result->is_affiliation_based_match = true; - password_manager_util::TrimUsernameOnlyCredentials(&more_results); - results.insert(results.end(), std::make_move_iterator(more_results.begin()), - std::make_move_iterator(more_results.end())); - } - - return results; -} - std::vector<InsecureCredential> PasswordStore::GetInsecureCredentialsWithAffiliationsImpl( const std::string& signon_realm, @@ -1151,18 +1147,6 @@ } } -void PasswordStore::ScheduleGetFilteredLoginsWithAffiliations( - base::WeakPtr<PasswordStoreConsumer> consumer, - const PasswordFormDigest& form, - const std::vector<std::string>& additional_affiliated_realms) { - if (consumer) { - PostLoginsTaskAndReplyToConsumerWithResult( - consumer.get(), - base::BindOnce(&PasswordStore::GetLoginsWithAffiliationsImpl, this, - form, additional_affiliated_realms)); - } -} - void PasswordStore::ScheduleGetInsecureCredentialsWithAffiliations( base::WeakPtr<InsecureCredentialsConsumer> consumer, const std::string& signon_realm,
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index cef203e..06b91c2 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -394,6 +394,12 @@ void ScheduleEnterprisePasswordURLUpdate(); protected: + using LoginsResult = std::vector<std::unique_ptr<PasswordForm>>; + using LoginsTask = base::OnceCallback<LoginsResult()>; + using LoginsReply = base::OnceCallback<void(LoginsResult)>; + using LoginsResultProcessor = + base::OnceCallback<void(LoginsReply, LoginsResult)>; + friend class base::RefCountedThreadSafe<PasswordStore>; // Represents a single CheckReuse() request. Implements functionality to @@ -496,6 +502,13 @@ virtual std::vector<std::unique_ptr<PasswordForm>> FillMatchingLogins( const PasswordFormDigest& form) = 0; + // Returns all PasswordForms with the same signon_realm as a form in the + // |forms|. If multiple forms are given, those will be concatenated. Callback + // is called on the main sequence. + virtual void FillMatchingLoginsAsync( + LoginsReply callback, + const std::vector<PasswordFormDigest>& forms) = 0; + // Finds and returns all not-blocklisted PasswordForms with the specified // |plain_text_password| stored in the credential database. virtual std::vector<std::unique_ptr<PasswordForm>> @@ -632,12 +645,6 @@ FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, AddInsecureCredentialsSync); FRIEND_TEST_ALL_PREFIXES(PasswordStoreTest, UpdateInsecureCredentialsSync); - using LoginsResult = std::vector<std::unique_ptr<PasswordForm>>; - using LoginsTask = base::OnceCallback<LoginsResult()>; - using LoginsReply = base::OnceCallback<void(LoginsResult)>; - using LoginsResultProcessor = - base::OnceCallback<void(LoginsReply, LoginsResult)>; - using StatsResult = std::vector<InteractionsStats>; using StatsTask = base::OnceCallback<StatsResult()>; @@ -740,17 +747,6 @@ // Finds all PasswordForms and returns the result. std::vector<std::unique_ptr<PasswordForm>> GetAllLoginsImpl(); - // Extended version of GetLoginsImpl that also returns credentials stored for - // the specified affiliated Android applications and Web realms. That is, it - // finds all PasswordForms with a signon_realm that is either: - // * equal to that of |form|, - // * is a PSL-match to the realm of |form|, - // * is one of those in |additional_affiliated_realms|, - // and returns the result. - std::vector<std::unique_ptr<PasswordForm>> GetLoginsWithAffiliationsImpl( - const PasswordFormDigest& form, - const std::vector<std::string>& additional_affiliated_realms); - // Extended version of GetMatchingInsecureCredentialsImpl that also returns // credentials stored for the specified affiliated Android applications or Web // realms. @@ -764,13 +760,6 @@ void InjectAffiliationAndBrandingInformation(LoginsReply callback, LoginsResult forms); - // Schedules GetLoginsWithAffiliationsImpl() to be run on the background - // sequence. - void ScheduleGetFilteredLoginsWithAffiliations( - base::WeakPtr<PasswordStoreConsumer> consumer, - const PasswordFormDigest& form, - const std::vector<std::string>& additional_affiliated_realms); - // Schedules GetInsecureCredentialsWithAffiliationsImpl() to be run on the // background sequence. void ScheduleGetInsecureCredentialsWithAffiliations(
diff --git a/components/password_manager/core/browser/password_store_impl.cc b/components/password_manager/core/browser/password_store_impl.cc index 898b278..6007b5ee4 100644 --- a/components/password_manager/core/browser/password_store_impl.cc +++ b/components/password_manager/core/browser/password_store_impl.cc
@@ -186,6 +186,21 @@ return matched_forms; } +void PasswordStoreImpl::FillMatchingLoginsAsync( + LoginsReply callback, + const std::vector<PasswordFormDigest>& forms) { + if (forms.empty()) { + std::move(callback).Run({}); + return; + } + + background_task_runner()->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce(&PasswordStoreImpl::FillMatchingLoginsInternal, this, + forms), + std::move(callback)); +} + std::vector<std::unique_ptr<PasswordForm>> PasswordStoreImpl::FillMatchingLoginsByPassword( const std::u16string& plain_text_password) { @@ -390,4 +405,21 @@ login_db_.reset(); } +std::vector<std::unique_ptr<PasswordForm>> +PasswordStoreImpl::FillMatchingLoginsInternal( + const std::vector<PasswordFormDigest>& forms) { + DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); + + std::vector<std::unique_ptr<PasswordForm>> results; + for (const auto& form : forms) { + std::vector<std::unique_ptr<PasswordForm>> matched_forms; + if (login_db_ && !login_db_->GetLogins(form, &matched_forms)) + continue; + results.insert(results.end(), + std::make_move_iterator(matched_forms.begin()), + std::make_move_iterator(matched_forms.end())); + } + return results; +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_impl.h b/components/password_manager/core/browser/password_store_impl.h index c381fb2..d8cd0c1 100644 --- a/components/password_manager/core/browser/password_store_impl.h +++ b/components/password_manager/core/browser/password_store_impl.h
@@ -60,6 +60,9 @@ base::Time delete_end) override; std::vector<std::unique_ptr<PasswordForm>> FillMatchingLogins( const PasswordFormDigest& form) override; + void FillMatchingLoginsAsync( + LoginsReply callback, + const std::vector<PasswordFormDigest>& forms) override; std::vector<std::unique_ptr<PasswordForm>> FillMatchingLoginsByPassword( const std::u16string& plain_text_password) override; bool FillAutofillableLogins( @@ -107,6 +110,10 @@ // Resets |login_db_| on the background sequence. void ResetLoginDB(); + // Synchronous implementation of FillMatchingLoginsAsync. + std::vector<std::unique_ptr<PasswordForm>> FillMatchingLoginsInternal( + const std::vector<PasswordFormDigest>& forms); + // The login SQL database. The LoginDatabase instance is received via the // in an uninitialized state, so as to allow injecting mocks, then Init() is // called on the background sequence in a deferred manner. If opening the DB
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index b31a8f8..5969478 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -2015,4 +2015,31 @@ store->ShutdownOnUIThread(); } +TEST_F(PasswordStoreTest, TestGetLoginRequestCancelable) { + scoped_refptr<PasswordStoreWithMockedMetadataStore> store = + CreatePasswordStoreWithMockedMetaData(); + store->Init(nullptr); + WaitForPasswordStore(); + + store->AddLogin(MakePasswordForm(kTestAndroidRealm1)); + WaitForPasswordStore(); + + PasswordFormDigest observed_form = {PasswordForm::Scheme::kHtml, + kTestWebRealm1, GURL(kTestWebRealm1)}; + + // Add affiliated android form corresponding to a 'observed_form'. + auto mock_helper = std::make_unique<MockAffiliatedMatchHelper>(); + mock_helper->ExpectCallToGetAffiliatedAndroidRealms(observed_form, + {kTestAndroidRealm1}); + store->SetAffiliatedMatchHelper(std::move(mock_helper)); + + MockPasswordStoreConsumer mock_consumer; + EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef).Times(0); + store->GetLogins(observed_form, &mock_consumer); + mock_consumer.CancelAllRequests(); + WaitForPasswordStore(); + + store->ShutdownOnUIThread(); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc index cc26cf16..a3b916b 100644 --- a/components/password_manager/core/browser/test_password_store.cc +++ b/components/password_manager/core/browser/test_password_store.cc
@@ -239,6 +239,15 @@ return matched_forms; } +void TestPasswordStore::FillMatchingLoginsAsync( + LoginsReply callback, + const std::vector<PasswordFormDigest>& forms) { + background_task_runner()->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce(&TestPasswordStore::FillMatchingLoginsBulk, this, forms), + std::move(callback)); +} + std::vector<std::unique_ptr<PasswordForm>> TestPasswordStore::FillMatchingLoginsByPassword( const std::u16string& plain_text_password) { @@ -450,4 +459,18 @@ return true; } +std::vector<std::unique_ptr<PasswordForm>> +TestPasswordStore::FillMatchingLoginsBulk( + const std::vector<PasswordFormDigest>& forms) { + std::vector<std::unique_ptr<PasswordForm>> results; + for (const auto& form : forms) { + std::vector<std::unique_ptr<PasswordForm>> matched_forms = + FillMatchingLogins(form); + results.insert(results.end(), + std::make_move_iterator(matched_forms.begin()), + std::make_move_iterator(matched_forms.end())); + } + return results; +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h index dd4607ca..6f56c21 100644 --- a/components/password_manager/core/browser/test_password_store.h +++ b/components/password_manager/core/browser/test_password_store.h
@@ -86,6 +86,9 @@ PasswordStoreChangeList RemoveLoginImpl(const PasswordForm& form) override; std::vector<std::unique_ptr<PasswordForm>> FillMatchingLogins( const PasswordFormDigest& form) override; + void FillMatchingLoginsAsync( + LoginsReply callback, + const std::vector<PasswordFormDigest>& forms) override; std::vector<std::unique_ptr<PasswordForm>> FillMatchingLoginsByPassword( const std::u16string& plain_text_password) override; bool FillAutofillableLogins( @@ -145,6 +148,9 @@ bool DeleteAndRecreateDatabaseFile() override; private: + std::vector<std::unique_ptr<PasswordForm>> FillMatchingLoginsBulk( + const std::vector<PasswordFormDigest>& forms); + const password_manager::IsAccountStore is_account_store_; PasswordMap stored_passwords_;
diff --git a/components/pdf/browser/BUILD.gn b/components/pdf/browser/BUILD.gn index 78b3f30..7a42793d 100644 --- a/components/pdf/browser/BUILD.gn +++ b/components/pdf/browser/BUILD.gn
@@ -3,13 +3,11 @@ # found in the LICENSE file. import("//build/config/features.gni") +import("//pdf/features.gni") +# TODO(crbug.com/1218971): Fix PDFWebContentsHelper usage to require enable_pdf. static_library("browser") { sources = [ - "pdf_navigation_throttle.cc", - "pdf_navigation_throttle.h", - "pdf_url_loader_request_interceptor.cc", - "pdf_url_loader_request_interceptor.h", "pdf_web_contents_helper.cc", "pdf_web_contents_helper.h", "pdf_web_contents_helper_client.h", @@ -25,3 +23,38 @@ public_deps = [ "//ipc" ] } + +if (enable_pdf) { + static_library("interceptors") { + sources = [ + "pdf_navigation_throttle.cc", + "pdf_navigation_throttle.h", + "pdf_url_loader_request_interceptor.cc", + "pdf_url_loader_request_interceptor.h", + ] + + deps = [ + "//base", + "//content/public/browser", + "//pdf:features", + "//services/network/public/cpp:cpp_base", + ] + } + + source_set("unit_tests") { + testonly = true + + sources = [ "pdf_navigation_throttle_unittest.cc" ] + + deps = [ + ":interceptors", + "//base", + "//base/test:test_support", + "//content/public/browser", + "//content/test:test_support", + "//pdf:features", + "//testing/gtest", + "//url", + ] + } +}
diff --git a/components/pdf/browser/DEPS b/components/pdf/browser/DEPS index 7589f41..bd23649 100644 --- a/components/pdf/browser/DEPS +++ b/components/pdf/browser/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+content/public/browser", "+mojo/public/cpp/bindings", + "+pdf/pdf_features.h", "+services/network/public/cpp", "+ui/base", "+ui/touch_selection",
diff --git a/components/pdf/browser/pdf_navigation_throttle.cc b/components/pdf/browser/pdf_navigation_throttle.cc index 12de4823..da87ba9 100644 --- a/components/pdf/browser/pdf_navigation_throttle.cc +++ b/components/pdf/browser/pdf_navigation_throttle.cc
@@ -4,11 +4,25 @@ #include "components/pdf/browser/pdf_navigation_throttle.h" +#include <memory> + +#include "base/feature_list.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_throttle.h" +#include "pdf/pdf_features.h" namespace pdf { +// static +std::unique_ptr<content::NavigationThrottle> +PdfNavigationThrottle::MaybeCreateThrottleFor( + content::NavigationHandle* navigation_handle) { + if (!base::FeatureList::IsEnabled(chrome_pdf::features::kPdfUnseasoned)) + return nullptr; + + return std::make_unique<PdfNavigationThrottle>(navigation_handle); +} + PdfNavigationThrottle::PdfNavigationThrottle( content::NavigationHandle* navigation_handle) : content::NavigationThrottle(navigation_handle) {}
diff --git a/components/pdf/browser/pdf_navigation_throttle.h b/components/pdf/browser/pdf_navigation_throttle.h index 6163437..fab0c598 100644 --- a/components/pdf/browser/pdf_navigation_throttle.h +++ b/components/pdf/browser/pdf_navigation_throttle.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_PDF_BROWSER_PDF_NAVIGATION_THROTTLE_H_ #define COMPONENTS_PDF_BROWSER_PDF_NAVIGATION_THROTTLE_H_ +#include <memory> + #include "content/public/browser/navigation_throttle.h" namespace content { @@ -15,6 +17,9 @@ class PdfNavigationThrottle final : public content::NavigationThrottle { public: + static std::unique_ptr<content::NavigationThrottle> MaybeCreateThrottleFor( + content::NavigationHandle* navigation_handle); + explicit PdfNavigationThrottle(content::NavigationHandle* navigation_handle); PdfNavigationThrottle(const PdfNavigationThrottle&) = delete; PdfNavigationThrottle& operator=(const PdfNavigationThrottle&) = delete;
diff --git a/components/pdf/browser/pdf_navigation_throttle_unittest.cc b/components/pdf/browser/pdf_navigation_throttle_unittest.cc new file mode 100644 index 0000000..9107093 --- /dev/null +++ b/components/pdf/browser/pdf_navigation_throttle_unittest.cc
@@ -0,0 +1,60 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/pdf/browser/pdf_navigation_throttle.h" + +#include "base/test/scoped_feature_list.h" +#include "content/public/test/mock_navigation_handle.h" +#include "content/public/test/test_renderer_host.h" +#include "pdf/pdf_features.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace pdf { + +namespace { + +class PdfNavigationThrottleTest : public content::RenderViewHostTestHarness { + protected: + void SetUp() override { + content::RenderViewHostTestHarness::SetUp(); + navigation_handle_ = std::make_unique<content::MockNavigationHandle>( + GURL("chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/" + "00000000-0000-0000-0000-000000000000"), + main_rfh()); + } + + base::test::ScopedFeatureList features_; + std::unique_ptr<content::MockNavigationHandle> navigation_handle_; +}; + +class PdfNavigationThrottleUnseasonedDisabledTest + : public PdfNavigationThrottleTest { + protected: + PdfNavigationThrottleUnseasonedDisabledTest() { + features_.InitAndDisableFeature(chrome_pdf::features::kPdfUnseasoned); + } +}; + +class PdfNavigationThrottleUnseasonedEnabledTest + : public PdfNavigationThrottleTest { + protected: + PdfNavigationThrottleUnseasonedEnabledTest() { + features_.InitAndEnableFeature(chrome_pdf::features::kPdfUnseasoned); + } +}; + +} // namespace + +TEST_F(PdfNavigationThrottleUnseasonedDisabledTest, MaybeCreateThrottleFor) { + EXPECT_FALSE( + PdfNavigationThrottle::MaybeCreateThrottleFor(navigation_handle_.get())); +} + +TEST_F(PdfNavigationThrottleUnseasonedEnabledTest, MaybeCreateThrottleFor) { + EXPECT_TRUE( + PdfNavigationThrottle::MaybeCreateThrottleFor(navigation_handle_.get())); +} + +} // namespace pdf
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc index 800f537..c696aa75 100644 --- a/components/permissions/permission_uma_util.cc +++ b/components/permissions/permission_uma_util.cc
@@ -89,7 +89,7 @@ #endif case RequestType::kNotifications: return RequestTypeForUma::PERMISSION_NOTIFICATIONS; -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) case RequestType::kProtectedMediaIdentifier: return RequestTypeForUma::PERMISSION_PROTECTED_MEDIA_IDENTIFIER; #endif
diff --git a/components/permissions/request_type.cc b/components/permissions/request_type.cc index 7e70c3b..be6afd15 100644 --- a/components/permissions/request_type.cc +++ b/components/permissions/request_type.cc
@@ -91,7 +91,7 @@ return vector_icons::kFileDownloadIcon; case RequestType::kNotifications: return vector_icons::kNotificationsIcon; -#if BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_CHROMEOS) || defined(OS_WIN) case RequestType::kProtectedMediaIdentifier: // This icon is provided by ChromePermissionsClient::GetOverrideIconId. NOTREACHED(); @@ -144,7 +144,7 @@ return RequestType::kMidiSysex; case ContentSettingsType::NOTIFICATIONS: return RequestType::kNotifications; -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) case ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER: return RequestType::kProtectedMediaIdentifier; #endif @@ -217,7 +217,7 @@ #endif case permissions::RequestType::kNotifications: return "notifications"; -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) case permissions::RequestType::kProtectedMediaIdentifier: return "protected_media_identifier"; #endif
diff --git a/components/permissions/request_type.h b/components/permissions/request_type.h index d219ccb..1fac33f3 100644 --- a/components/permissions/request_type.h +++ b/components/permissions/request_type.h
@@ -41,7 +41,7 @@ kNfcDevice, #endif kNotifications, -#if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN) +#if defined(OS_ANDROID) || defined(OS_CHROMEOS) || defined(OS_WIN) kProtectedMediaIdentifier, #endif #if !defined(OS_ANDROID)
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc index 8ba1accd..486b3d6f 100644 --- a/components/plugins/renderer/webview_plugin.cc +++ b/components/plugins/renderer/webview_plugin.cc
@@ -274,7 +274,8 @@ /*widgets_never_composited=*/false, /*opener=*/nullptr, mojo::NullAssociatedReceiver(), *agent_group_scheduler_, - /*session_storage_namespace_id=*/base::EmptyString()); + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt); // ApplyWebPreferences before making a WebLocalFrame so that the frame sees a // consistent view of our preferences. blink::WebView::ApplyWebPreferences(parent_web_preferences, web_view_);
diff --git a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc index 835ac52..c281ba5 100644 --- a/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc +++ b/components/policy/core/common/cloud/cloud_policy_refresh_scheduler.cc
@@ -152,9 +152,13 @@ void CloudPolicyRefreshScheduler::OnRegistrationStateChanged( CloudPolicyClient* client) { - error_retry_delay_ms_ = kInitialErrorRetryDelayMs; + if (!client->is_registered()) { + CancelRefresh(); + return; + } - // The client might have registered, so trigger an immediate refresh. + // The client has registered, so trigger an immediate refresh. + error_retry_delay_ms_ = kInitialErrorRetryDelayMs; RefreshSoon(); }
diff --git a/components/policy/core/common/cloud/cloud_policy_service.cc b/components/policy/core/common/cloud/cloud_policy_service.cc index d6f0fb2..381b925 100644 --- a/components/policy/core/common/cloud/cloud_policy_service.cc +++ b/components/policy/core/common/cloud/cloud_policy_service.cc
@@ -100,8 +100,10 @@ void CloudPolicyService::OnRegistrationStateChanged(CloudPolicyClient* client) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (unregister_state_ == UNREGISTER_PENDING) + if (unregister_state_ == UNREGISTER_PENDING) { + DCHECK(!client->is_registered()); UnregisterCompleted(true); + } } void CloudPolicyService::OnClientError(CloudPolicyClient* client) {
diff --git a/components/prefs/in_memory_pref_store.cc b/components/prefs/in_memory_pref_store.cc index 662e7a1..1f9b76f3 100644 --- a/components/prefs/in_memory_pref_store.cc +++ b/components/prefs/in_memory_pref_store.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/notreached.h" #include "base/values.h" InMemoryPrefStore::InMemoryPrefStore() {} @@ -80,6 +81,12 @@ return PersistentPrefStore::PREF_READ_ERROR_NONE; } +void InMemoryPrefStore::CommitPendingWriteSynchronously() { + // This function was added for one very specific use case and is intentionally + // not implemented for other pref stores. + NOTREACHED(); +} + void InMemoryPrefStore::ReportValueChanged(const std::string& key, uint32_t flags) { for (Observer& observer : observers_)
diff --git a/components/prefs/in_memory_pref_store.h b/components/prefs/in_memory_pref_store.h index c8f78ce4..e99bd4e3 100644 --- a/components/prefs/in_memory_pref_store.h +++ b/components/prefs/in_memory_pref_store.h
@@ -46,6 +46,7 @@ PrefReadError GetReadError() const override; PersistentPrefStore::PrefReadError ReadPrefs() override; void ReadPrefsAsync(ReadErrorDelegate* error_delegate) override {} + void CommitPendingWriteSynchronously() override; void SchedulePendingLossyWrites() override {} void ClearMutableValues() override {} void OnStoreDeletionFromDisk() override {}
diff --git a/components/prefs/json_pref_store.cc b/components/prefs/json_pref_store.cc index 2f1f2c7..000931e 100644 --- a/components/prefs/json_pref_store.cc +++ b/components/prefs/json_pref_store.cc
@@ -321,6 +321,28 @@ } } +void JsonPrefStore::CommitPendingWriteSynchronously() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + // Schedule a write for any lossy writes that are outstanding to ensure that + // they get flushed when this function is called. + SchedulePendingLossyWrites(); + if (!writer_.HasPendingWrite() || read_only_) + return; + + const base::FilePath path = writer_.path(); + std::string data; + if (!SerializeData(&data)) { + DVLOG(1) << "Failed to serialize data to be saved in " << path.value(); + return; + } + + const std::string suffix = GetHistogramSuffix(path); + if (!base::ImportantFileWriter::WriteFileAtomically(path, data, suffix)) { + DVLOG(1) << "Could not write " << suffix << " into " << path.value(); + } +} + void JsonPrefStore::SchedulePendingLossyWrites() { if (pending_lossy_write_) writer_.ScheduleWrite(this);
diff --git a/components/prefs/json_pref_store.h b/components/prefs/json_pref_store.h index c3d6b60..fc396e0 100644 --- a/components/prefs/json_pref_store.h +++ b/components/prefs/json_pref_store.h
@@ -101,6 +101,7 @@ base::OnceClosure reply_callback = base::OnceClosure(), base::OnceClosure synchronous_done_callback = base::OnceClosure()) override; + void CommitPendingWriteSynchronously() override; void SchedulePendingLossyWrites() override; void ReportValueChanged(const std::string& key, uint32_t flags) override;
diff --git a/components/prefs/json_pref_store_unittest.cc b/components/prefs/json_pref_store_unittest.cc index fa7df78..63d42f9 100644 --- a/components/prefs/json_pref_store_unittest.cc +++ b/components/prefs/json_pref_store_unittest.cc
@@ -24,10 +24,12 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/waitable_event.h" +#include "base/test/gtest_util.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread.h" +#include "base/threading/thread_restrictions.h" #include "base/values.h" #include "components/prefs/persistent_pref_store_unittest.h" #include "components/prefs/pref_filter.h" @@ -570,6 +572,65 @@ JsonPrefStoreTest, ::testing::Values(CommitPendingWriteMode::WITH_SYNCHRONOUS_CALLBACK)); +class JsonPrefStoreWriteSynchronouslyTest : public testing::Test { + public: + JsonPrefStoreWriteSynchronouslyTest() = default; + ~JsonPrefStoreWriteSynchronouslyTest() override = default; + + protected: + void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } + + base::test::TaskEnvironment task_environment_; + base::ScopedTempDir temp_dir_; +}; + +TEST_F(JsonPrefStoreWriteSynchronouslyTest, + WriteFailsWhenBlockingIsDisallowed) { + const char kEmptyPrefContents[] = "{}"; + + base::FilePath pref_file = temp_dir_.GetPath().AppendASCII("write.json"); + ASSERT_LT(0, base::WriteFile(pref_file, kEmptyPrefContents, + base::size(kEmptyPrefContents) - 1)); + + auto pref_store = base::MakeRefCounted<JsonPrefStore>(pref_file); + ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, pref_store->ReadPrefs()); + + const std::string test_pref = "test"; + pref_store->SetValue(test_pref, std::make_unique<Value>(3), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + { + base::ScopedDisallowBlocking scoped_disallow_blocking; + EXPECT_DCHECK_DEATH(pref_store->CommitPendingWriteSynchronously()); + } +} + +TEST_F(JsonPrefStoreWriteSynchronouslyTest, CommitPendingWriteSynchronously) { + const char kInputPrefContents[] = + "{\n" + " \"homepage\": \"http://www.cnn.com\"\n" + "}"; + + const std::string kExpectedPrefContents = + "{\"homepage\":\"http://www.cnn.com\",\"test\":3}"; + + base::FilePath pref_file = temp_dir_.GetPath().AppendASCII("write.json"); + ASSERT_LT(0, base::WriteFile(pref_file, kInputPrefContents, + base::size(kInputPrefContents) - 1)); + + auto pref_store = base::MakeRefCounted<JsonPrefStore>(pref_file); + ASSERT_EQ(PersistentPrefStore::PREF_READ_ERROR_NONE, pref_store->ReadPrefs()); + + const std::string test_pref = "test"; + pref_store->SetValue(test_pref, std::make_unique<Value>(3), + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); + pref_store->CommitPendingWriteSynchronously(); + + std::string pref_file_contents; + ASSERT_TRUE(base::ReadFileToString(pref_file, &pref_file_contents)); + EXPECT_EQ(kExpectedPrefContents, pref_file_contents); + ASSERT_TRUE(base::DeleteFile(pref_file)); +} + class JsonPrefStoreLossyWriteTest : public JsonPrefStoreTest { public: JsonPrefStoreLossyWriteTest() = default;
diff --git a/components/prefs/overlay_user_pref_store.cc b/components/prefs/overlay_user_pref_store.cc index b337493..02b3167 100644 --- a/components/prefs/overlay_user_pref_store.cc +++ b/components/prefs/overlay_user_pref_store.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/memory/ptr_util.h" +#include "base/notreached.h" #include "base/values.h" #include "components/prefs/in_memory_pref_store.h" @@ -193,6 +194,12 @@ // We do not write our content intentionally. } +void OverlayUserPrefStore::CommitPendingWriteSynchronously() { + // This function was added for one very specific use case and is intentionally + // not implemented for other pref stores. + NOTREACHED(); +} + void OverlayUserPrefStore::SchedulePendingLossyWrites() { persistent_user_pref_store_->SchedulePendingLossyWrites(); }
diff --git a/components/prefs/overlay_user_pref_store.h b/components/prefs/overlay_user_pref_store.h index fc42dffa..d86ecb2 100644 --- a/components/prefs/overlay_user_pref_store.h +++ b/components/prefs/overlay_user_pref_store.h
@@ -60,6 +60,7 @@ void ReadPrefsAsync(ReadErrorDelegate* delegate) override; void CommitPendingWrite(base::OnceClosure reply_callback, base::OnceClosure synchronous_done_callback) override; + void CommitPendingWriteSynchronously() override; void SchedulePendingLossyWrites() override; void ReportValueChanged(const std::string& key, uint32_t flags) override;
diff --git a/components/prefs/persistent_pref_store.h b/components/prefs/persistent_pref_store.h index 0da1423..2b1f80b0 100644 --- a/components/prefs/persistent_pref_store.h +++ b/components/prefs/persistent_pref_store.h
@@ -71,7 +71,13 @@ base::OnceClosure reply_callback = base::OnceClosure(), base::OnceClosure synchronous_done_callback = base::OnceClosure()); - // Schedule a write if there is any lossy data pending. Unlike + // Like CommitPendingWrite(), but writes to disk on this thread synchronously + // rather than scheduling a write. CommitPendingWriteSynchronously() is + // appropriate to call only in the exceptional situation in which you need to + // write to disk early on during startup before threads have been started. + virtual void CommitPendingWriteSynchronously() = 0; + + // Schedules a write if there is any lossy data pending. Unlike // CommitPendingWrite() this does not immediately sync to disk, instead it // triggers an eventual write if there is lossy data pending and if there // isn't one scheduled already.
diff --git a/components/prefs/pref_service.cc b/components/prefs/pref_service.cc index 77a8b38..47d5840 100644 --- a/components/prefs/pref_service.cc +++ b/components/prefs/pref_service.cc
@@ -711,3 +711,8 @@ DCHECK(value) << "Trying to read an unregistered pref: " << path; return value; } + +void PrefService::CommitPendingWriteSynchronously() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + user_pref_store_->CommitPendingWriteSynchronously(); +}
diff --git a/components/prefs/pref_service.h b/components/prefs/pref_service.h index 6471f58e..923008a4 100644 --- a/components/prefs/pref_service.h +++ b/components/prefs/pref_service.h
@@ -57,6 +57,10 @@ class ScopedUserPrefUpdateBase; } +namespace variations { +class VariationsFieldTrialCreator; +} + // Base class for PrefServices. You can use the base class to read and // interact with preferences, but not to register new preferences; for // that see e.g. PrefRegistrySimple. @@ -194,7 +198,7 @@ base::OnceClosure reply_callback = base::OnceClosure(), base::OnceClosure synchronous_done_callback = base::OnceClosure()); - // Schedule a write if there is any lossy data pending. Unlike + // Schedules a write if there is any lossy data pending. Unlike // CommitPendingWrite() this does not immediately sync to disk, instead it // triggers an eventual write if there is lossy data pending and if there // isn't one scheduled already. @@ -419,6 +423,10 @@ friend class PrefChangeRegistrar; friend class subtle::PrefMemberBase; + // Give access to CommitPendingWriteSynchronously(). + // TODO(crbug/1218908): Limit VariationsFieldTrialCreator's access. + friend class variations::VariationsFieldTrialCreator; + // These are protected so they can only be accessed by the friend // classes listed above. // @@ -465,6 +473,12 @@ const base::Value* GetPreferenceValue(const std::string& path) const; const base::Value* GetPreferenceValueChecked(const std::string& path) const; + // Like CommitPendingWrite(), but writes to disk on this thread synchronously + // rather than scheduling a write. CommitPendingWriteSynchronously() is + // appropriate to call only in the exceptional situation in which you need to + // write to disk early on during startup before threads have been started. + void CommitPendingWriteSynchronously(); + const scoped_refptr<PrefRegistry> pref_registry_; // Local cache of registered Preference objects. The pref_registry_
diff --git a/components/prefs/segregated_pref_store.cc b/components/prefs/segregated_pref_store.cc index aabbd9a..b838fb3 100644 --- a/components/prefs/segregated_pref_store.cc +++ b/components/prefs/segregated_pref_store.cc
@@ -195,6 +195,12 @@ synchronous_callback_wrapper); } +void SegregatedPrefStore::CommitPendingWriteSynchronously() { + // This function was added for one very specific use case and is intentionally + // not implemented for other pref stores. + NOTREACHED(); +} + void SegregatedPrefStore::SchedulePendingLossyWrites() { default_pref_store_->SchedulePendingLossyWrites(); selected_pref_store_->SchedulePendingLossyWrites();
diff --git a/components/prefs/segregated_pref_store.h b/components/prefs/segregated_pref_store.h index 6e1fdbd..537ae83 100644 --- a/components/prefs/segregated_pref_store.h +++ b/components/prefs/segregated_pref_store.h
@@ -73,6 +73,7 @@ base::OnceClosure reply_callback = base::OnceClosure(), base::OnceClosure synchronous_done_callback = base::OnceClosure()) override; + void CommitPendingWriteSynchronously() override; void SchedulePendingLossyWrites() override; void ClearMutableValues() override; void OnStoreDeletionFromDisk() override;
diff --git a/components/prefs/testing_pref_store.cc b/components/prefs/testing_pref_store.cc index 5d3d1ec..ce0bd44 100644 --- a/components/prefs/testing_pref_store.cc +++ b/components/prefs/testing_pref_store.cc
@@ -111,6 +111,12 @@ std::move(synchronous_done_callback)); } +void TestingPrefStore::CommitPendingWriteSynchronously() { + // This function was added for one very specific use case and is intentionally + // not implemented for other pref stores. + NOTREACHED(); +} + void TestingPrefStore::SchedulePendingLossyWrites() {} void TestingPrefStore::SetInitializationCompleted() {
diff --git a/components/prefs/testing_pref_store.h b/components/prefs/testing_pref_store.h index 86fa676..34e2791 100644 --- a/components/prefs/testing_pref_store.h +++ b/components/prefs/testing_pref_store.h
@@ -48,6 +48,7 @@ void ReadPrefsAsync(ReadErrorDelegate* error_delegate) override; void CommitPendingWrite(base::OnceClosure reply_callback, base::OnceClosure synchronous_done_callback) override; + void CommitPendingWriteSynchronously() override; void SchedulePendingLossyWrites() override; // Marks the store as having completed initialization.
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index 2831dbf..0f30b5b 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -672,7 +672,8 @@ /*compositing_enabled=*/false, /*widgets_never_composited=*/false, /*opener=*/nullptr, mojo::NullAssociatedReceiver(), *source_frame.GetAgentGroupScheduler(), - /*session_storage_namespace_id=*/base::EmptyString()); + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt); web_view->GetSettings()->SetJavaScriptEnabled(true); class HeaderAndFooterClient final : public blink::WebLocalFrameClient { @@ -951,7 +952,8 @@ /*widgets_never_composited=*/false, /*opener=*/nullptr, mojo::NullAssociatedReceiver(), agent_group_scheduler_, - /*session_storage_namespace_id=*/base::EmptyString()); + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt); blink::WebView::ApplyWebPreferences(prefs, web_view); blink::WebLocalFrame* main_frame = blink::WebLocalFrame::CreateMainFrame( web_view, this, nullptr, blink::LocalFrameToken(), nullptr);
diff --git a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc index f52bea1e8..e137b42 100644 --- a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc +++ b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
@@ -63,6 +63,8 @@ using testing::Return; using testing::StrictMock; +namespace safe_browsing { + namespace { const char kFormActionUrl[] = "https://form_action.com/"; @@ -75,10 +77,6 @@ const unsigned int kMinute = 60; const unsigned int kDay = 24 * 60 * kMinute; -} // namespace - -namespace safe_browsing { - using PasswordReuseEvent = LoginReputationClientRequest::PasswordReuseEvent; class MockSafeBrowsingTokenFetcher : public SafeBrowsingTokenFetcher { @@ -265,6 +263,8 @@ DISALLOW_COPY_AND_ASSIGN(TestPasswordProtectionService); }; +} // namespace + class PasswordProtectionServiceTest : public ::testing::Test { public: PasswordProtectionServiceTest()
diff --git a/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h b/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h index 6b21b59d..d6d3113 100644 --- a/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h +++ b/components/safe_browsing/core/browser/safe_browsing_token_fetcher.h
@@ -9,9 +9,6 @@ namespace safe_browsing { -constexpr char kAPIScope[] = - "https://www.googleapis.com/auth/chrome-safe-browsing"; - // This interface is used to fetch access tokens for communcations with Safe // Browsing. It asynchronously returns an access token for the current account // (as determined in concrete implementations), or the empty string if no access
diff --git a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc index 513a0cf..a245709b 100644 --- a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc +++ b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc
@@ -35,8 +35,6 @@ return arg.threat_source == threatSource; } -} // namespace - class MockSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager { public: MockSafeBrowsingDatabaseManager() = default; @@ -237,6 +235,8 @@ bool is_cached_response_ = false; }; +} // namespace + class SafeBrowsingUrlCheckerTest : public PlatformTest { public: SafeBrowsingUrlCheckerTest()
diff --git a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc index 448ea57..dccc4ea3 100644 --- a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc +++ b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc
@@ -12,6 +12,7 @@ #include "components/signin/public/identity_manager/consent_level.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "google_apis/gaia/core_account_id.h" +#include "google_apis/gaia/gaia_constants.h" #include "google_apis/gaia/google_service_auth_error.h" namespace safe_browsing { @@ -40,7 +41,8 @@ identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin); token_fetchers_[request_id] = identity_manager_->CreateAccessTokenFetcherForAccount( - account_id, "safe_browsing_service", {kAPIScope}, + account_id, "safe_browsing_service", + {GaiaConstants::kChromeSafeBrowsingOAuth2Scope}, base::BindOnce( &SafeBrowsingPrimaryAccountTokenFetcher::OnTokenFetched, weak_ptr_factory_.GetWeakPtr(), request_id), @@ -51,8 +53,9 @@ const std::string& invalid_access_token) { CoreAccountId account_id = identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin); - identity_manager_->RemoveAccessTokenFromCache(account_id, {kAPIScope}, - invalid_access_token); + identity_manager_->RemoveAccessTokenFromCache( + account_id, {GaiaConstants::kChromeSafeBrowsingOAuth2Scope}, + invalid_access_token); } void SafeBrowsingPrimaryAccountTokenFetcher::OnTokenFetched(
diff --git a/components/safe_browsing/core/password_protection/password_protection_service_base.h b/components/safe_browsing/core/password_protection/password_protection_service_base.h index 4f8222ed..54d2e6eb 100644 --- a/components/safe_browsing/core/password_protection/password_protection_service_base.h +++ b/components/safe_browsing/core/password_protection/password_protection_service_base.h
@@ -382,7 +382,6 @@ private: friend class PasswordProtectionServiceTest; - friend class TestPasswordProtectionService; friend class ChromePasswordProtectionServiceTest; friend class ChromePasswordProtectionServiceBrowserTest; FRIEND_TEST_ALL_PREFIXES(PasswordProtectionServiceTest,
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter index 3cfaa0d3..8f28b4f 100644 --- a/components/segmentation_platform/components_unittests.filter +++ b/components/segmentation_platform/components_unittests.filter
@@ -1,9 +1,14 @@ +DummyModelExecutionManagerTest.* MetadataUtilsTest.* +ModelExecutionManagerFactoryTest.* ModelExecutionManagerTest.* ModelExecutionSchedulerTest.* SegmentationModelExecutorTest.* SegmentationPlatformServiceImplTest.* SegmentInfoDatabaseTest.* SegmentSelectorTest.* +SignalDatabaseTest.* SignalFilterProcessorTest.* +SignalKeyInternalTest.* +SignalKeyTest.* UserActionSignalHandlerTest.*
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn index 4d0877b..1f90087 100644 --- a/components/segmentation_platform/internal/BUILD.gn +++ b/components/segmentation_platform/internal/BUILD.gn
@@ -19,7 +19,18 @@ "database/metadata_utils.h", "database/segment_info_database.cc", "database/segment_info_database.h", + "database/signal_database.cc", + "database/signal_database.h", + "database/signal_key.cc", + "database/signal_key.h", + "database/signal_key_internal.cc", + "database/signal_key_internal.h", "database/user_action_database.h", + "execution/dummy_model_execution_manager.cc", + "execution/dummy_model_execution_manager.h", + "execution/model_execution_manager.h", + "execution/model_execution_manager_factory.cc", + "execution/model_execution_manager_factory.h", "execution/model_execution_status.h", "scheduler/model_execution_scheduler.h", "scheduler/model_execution_scheduler_impl.cc", @@ -45,12 +56,13 @@ "//components/segmentation_platform/public", ] - public_deps = - [ "//components/optimization_guide/proto:optimization_guide_proto" ] + public_deps = [ + "//components/optimization_guide/core", + "//components/optimization_guide/proto:optimization_guide_proto", + ] if (build_with_tflite_lib) { sources += [ - "execution/model_execution_manager.h", "execution/model_execution_manager_impl.cc", "execution/model_execution_manager_impl.h", "execution/segmentation_model_executor.cc", @@ -63,8 +75,6 @@ "//third_party/tflite:tflite_public_headers", "//third_party/tflite-support", ] - - public_deps += [ "//components/optimization_guide/core" ] } } @@ -78,8 +88,13 @@ sources = [ "database/metadata_utils_unittest.cc", "database/segment_info_database_unittest.cc", + "database/signal_database_unittest.cc", + "database/signal_key_internal_unittest.cc", + "database/signal_key_unittest.cc", "database/test_segment_info_database.cc", "database/test_segment_info_database.h", + "execution/dummy_model_execution_manager_unittest.cc", + "execution/model_execution_manager_factory_unittest.cc", "scheduler/model_execution_scheduler_unittest.cc", "segmentation_platform_service_impl_unittest.cc", "selection/segment_selector_unittest.cc", @@ -89,8 +104,10 @@ deps = [ ":internal", + "//base", "//base/test:test_support", "//components/leveldb_proto:test_support", + "//components/optimization_guide/core:test_support", "//components/segmentation_platform/internal/proto", "//components/segmentation_platform/public", "//testing/gmock", @@ -104,11 +121,6 @@ "execution/model_execution_manager_impl_unittest.cc", "execution/segmentation_model_executor_unittest.cc", ] - - deps += [ - "//base", - "//components/optimization_guide/core:test_support", - ] } }
diff --git a/components/segmentation_platform/internal/database/signal_database.cc b/components/segmentation_platform/internal/database/signal_database.cc new file mode 100644 index 0000000..e6bdbf74 --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_database.cc
@@ -0,0 +1,215 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/database/signal_database.h" + +#include "components/segmentation_platform/internal/proto/signal.pb.h" + +namespace segmentation_platform { +namespace { + +// TODO(shaktisahu): May be make this a class member for ease of testing. +bool FilterKeyBasedOnRange(SignalType signal_type, + uint64_t name_hash, + base::Time end_time, + base::Time start_time, + const std::string& signal_key) { + DCHECK(start_time <= end_time); + SignalKey key; + SignalKey::FromBinary(signal_key, &key); + DCHECK(key.IsValid()); + if (key.kind() != signal_type || key.name_hash() != name_hash) + return false; + + // Check if the key range is contained within the given range. + return key.range_end() <= end_time && start_time <= key.range_start(); +} + +} // namespace + +SignalDatabase::SignalDatabase(std::unique_ptr<SignalProtoDb> database) + : database_(std::move(database)) {} + +SignalDatabase::~SignalDatabase() = default; + +void SignalDatabase::Initialize(SuccessCallback callback) { + database_->Init( + leveldb_proto::CreateSimpleOptions(), + base::BindOnce(&SignalDatabase::OnDatabaseInitialized, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void SignalDatabase::WriteSample(SignalType signal_type, + uint64_t name_hash, + absl::optional<int32_t> value, + base::Time timestamp, + SuccessCallback callback) { + SignalKey key(signal_type, name_hash, timestamp, timestamp); + + proto::SignalData signal_data; + proto::Sample* sample = signal_data.add_samples(); + if (value.has_value()) + sample->set_value(value.value()); + + // Convert to delta from UTC midnight. This results in smaller values thereby + // requiring less storage space in the DB. + base::TimeDelta midnight_delta = timestamp - timestamp.UTCMidnight(); + sample->set_time_sec_delta(midnight_delta.InSeconds()); + + // Write as a new db entry. + auto entries_to_save = std::make_unique< + std::vector<std::pair<std::string, proto::SignalData>>>(); + auto keys_to_delete = std::make_unique<std::vector<std::string>>(); + entries_to_save->emplace_back( + std::make_pair(key.ToBinary(), std::move(signal_data))); + database_->UpdateEntries(std::move(entries_to_save), + std::move(keys_to_delete), std::move(callback)); +} + +void SignalDatabase::GetSamples(SignalType signal_type, + uint64_t name_hash, + base::Time start_time, + base::Time end_time, + SampleCallback callback) { + SignalKey dummy_key(signal_type, name_hash, base::Time(), base::Time()); + std::string key_prefix = dummy_key.GetPrefixInBinary(); + database_->LoadKeysAndEntriesWithFilter( + base::BindRepeating(&FilterKeyBasedOnRange, signal_type, name_hash, + end_time, start_time), + leveldb::ReadOptions(), key_prefix, + base::BindOnce(&SignalDatabase::OnGetSamples, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + start_time, end_time)); +} + +void SignalDatabase::OnGetSamples( + SampleCallback callback, + base::Time start_time, + base::Time end_time, + bool success, + std::unique_ptr<std::map<std::string, proto::SignalData>> entries) { + std::vector<std::pair<base::Time, absl::optional<int32_t>>> out; + if (!success || !entries) { + std::move(callback).Run(out); + return; + } + + for (const auto& pair : *entries.get()) { + SignalKey key; + SignalKey::FromBinary(pair.first, &key); + DCHECK(key.IsValid()); + // TODO(shaktisahu): Remove DCHECK and collect UMA. + const auto& signal_data = pair.second; + base::Time midnight = key.range_start().UTCMidnight(); + for (int i = 0; i < signal_data.samples_size(); ++i) { + const auto& sample = signal_data.samples(i); + base::Time timestamp = + midnight + base::TimeDelta::FromSeconds(sample.time_sec_delta()); + if (timestamp < start_time || timestamp > end_time) + continue; + + out.emplace_back(std::make_pair( + timestamp, sample.has_value() ? absl::make_optional(sample.value()) + : absl::nullopt)); + } + } + + std::move(callback).Run(out); +} + +void SignalDatabase::DeleteSamples(SignalType signal_type, + uint64_t name_hash, + base::Time end_time, + SuccessCallback callback) { + SignalKey dummy_key(signal_type, name_hash, base::Time(), base::Time()); + std::string key_prefix = dummy_key.GetPrefixInBinary(); + database_->LoadKeysAndEntriesWithFilter( + base::BindRepeating(&FilterKeyBasedOnRange, signal_type, name_hash, + end_time, base::Time()), + leveldb::ReadOptions(), key_prefix, + base::BindOnce(&SignalDatabase::OnGetSamplesForDeletion, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void SignalDatabase::OnGetSamplesForDeletion( + SuccessCallback callback, + bool success, + std::unique_ptr<std::map<std::string, proto::SignalData>> entries) { + if (!success || !entries) { + std::move(callback).Run(success); + return; + } + + auto entries_to_save = std::make_unique< + std::vector<std::pair<std::string, proto::SignalData>>>(); + auto keys_to_delete = std::make_unique<std::vector<std::string>>(); + + // Collect the keys to be deleted. + for (const auto& pair : *entries.get()) { + keys_to_delete->emplace_back(pair.first); + } + + // Write to DB. + database_->UpdateEntries(std::move(entries_to_save), + std::move(keys_to_delete), std::move(callback)); +} + +void SignalDatabase::CompactSamplesForDay(SignalType signal_type, + uint64_t name_hash, + base::Time day_start_time, + SuccessCallback callback) { + // Compact the signals between 00:00:00AM to 23:59:59PM. + day_start_time = day_start_time.UTCMidnight(); + base::Time day_end_time = day_start_time + base::TimeDelta::FromDays(1) - + base::TimeDelta::FromSeconds(1); + SignalKey compact_key(signal_type, name_hash, day_end_time, day_start_time); + database_->LoadKeysAndEntriesWithFilter( + base::BindRepeating(&FilterKeyBasedOnRange, signal_type, name_hash, + day_end_time, day_start_time), + base::BindOnce(&SignalDatabase::OnGetSamplesForCompaction, + weak_ptr_factory_.GetWeakPtr(), std::move(callback), + compact_key.ToBinary())); +} + +void SignalDatabase::OnGetSamplesForCompaction( + SuccessCallback callback, + std::string compact_key, + bool success, + std::unique_ptr<std::map<std::string, proto::SignalData>> entries) { + if (!success || !entries || entries->empty()) { + std::move(callback).Run(success); + return; + } + + // We found one or more entries for the day. Let's compact them. + auto keys_to_delete = std::make_unique<std::vector<std::string>>(); + + // Aggregate samples under a new proto. Delete the old entries. + proto::SignalData compact; + for (const auto& pair : *entries.get()) { + const auto& signal_data = pair.second; + for (int i = 0; i < signal_data.samples_size(); i++) { + auto* new_sample = compact.add_samples(); + new_sample->CopyFrom(signal_data.samples(i)); + } + + keys_to_delete->emplace_back(pair.first); + } + + // Write to DB. + auto entries_to_save = std::make_unique< + std::vector<std::pair<std::string, proto::SignalData>>>(); + entries_to_save->emplace_back( + std::make_pair(compact_key, std::move(compact))); + database_->UpdateEntries(std::move(entries_to_save), + std::move(keys_to_delete), std::move(callback)); +} + +void SignalDatabase::OnDatabaseInitialized( + SuccessCallback callback, + leveldb_proto::Enums::InitStatus status) { + std::move(callback).Run(status == leveldb_proto::Enums::InitStatus::kOK); +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/signal_database.h b/components/segmentation_platform/internal/database/signal_database.h new file mode 100644 index 0000000..506153a --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_database.h
@@ -0,0 +1,101 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_DATABASE_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_DATABASE_H_ + +#include "base/time/time.h" +#include "components/leveldb_proto/public/proto_database.h" +#include "components/segmentation_platform/internal/database/signal_key.h" + +namespace segmentation_platform { +namespace proto { +class SignalData; +} // namespace proto + +// Responsible for storing histogram signals and user action events in a +// database. The signal samples are lazily bucketed into daily buckets for +// efficient storage and retrieval. A periodic job is responsible for running +// the compaction and deletion of old entries. +class SignalDatabase { + public: + using SuccessCallback = base::OnceCallback<void(bool)>; + using SampleCallback = base::OnceCallback<void( + std::vector<std::pair<base::Time, absl::optional<int32_t>>>)>; + using SignalProtoDb = leveldb_proto::ProtoDatabase<proto::SignalData>; + + explicit SignalDatabase(std::unique_ptr<SignalProtoDb> database); + virtual ~SignalDatabase(); + + // Disallow copy/assign. + SignalDatabase(const SignalDatabase&) = delete; + SignalDatabase& operator=(const SignalDatabase&) = delete; + + // Called to initialize the database. Must be called before other methods. + virtual void Initialize(SuccessCallback callback); + + // Called to write UMA events to the database. Sample timestamps are converted + // to delta from UTC midnight for efficient storage. + virtual void WriteSample(SignalType signal_type, + uint64_t name_hash, + absl::optional<int32_t> value, + base::Time timestamp, + SuccessCallback callback); + + // Called to get signals collected between any two timestamps. The samples are + // returned in the |callback| as a list of pairs containing signal timestamp + // and and an optional value. + virtual void GetSamples(SignalType signal_type, + uint64_t name_hash, + base::Time start_time, + base::Time end_time, + SampleCallback callback); + + // Called to delete database entries having end time earlier than |end_time|. + virtual void DeleteSamples(SignalType signal_type, + uint64_t name_hash, + base::Time end_time, + SuccessCallback callback); + + // Called to compact the signals collected for the given day. Do not run this + // for the current day as it might lead to read/write race condition. Meant to + // be used for compacting the entries for the previous day from a background + // job. Nevertheless, the database will work correctly without the need for + // any compaction. |time| is used for finding the associated day. + virtual void CompactSamplesForDay(SignalType signal_type, + uint64_t name_hash, + base::Time time, + SuccessCallback callback); + + private: + void OnDatabaseInitialized(SuccessCallback callback, + leveldb_proto::Enums::InitStatus status); + + void OnGetSamples( + SampleCallback callback, + base::Time start_time, + base::Time end_time, + bool success, + std::unique_ptr<std::map<std::string, proto::SignalData>> entries); + + void OnGetSamplesForCompaction( + SuccessCallback callback, + std::string compact_key, + bool success, + std::unique_ptr<std::map<std::string, proto::SignalData>> entries); + + void OnGetSamplesForDeletion( + SuccessCallback callback, + bool success, + std::unique_ptr<std::map<std::string, proto::SignalData>> entries); + + // The backing LevelDB proto database. + std::unique_ptr<SignalProtoDb> database_; + + base::WeakPtrFactory<SignalDatabase> weak_ptr_factory_{this}; +}; + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_DATABASE_H_
diff --git a/components/segmentation_platform/internal/database/signal_database_unittest.cc b/components/segmentation_platform/internal/database/signal_database_unittest.cc new file mode 100644 index 0000000..c4457c6 --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_database_unittest.cc
@@ -0,0 +1,245 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/database/signal_database.h" + +#include "base/test/simple_test_clock.h" +#include "base/test/task_environment.h" +#include "components/leveldb_proto/testing/fake_db.h" +#include "components/segmentation_platform/internal/proto/signal.pb.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { + +bool IsWithinOneSecond(base::Time t1, base::Time t2) { + return (t1 - t2).magnitude() < base::TimeDelta::FromSeconds(1); +} + +void CheckVectorsEqual( + const std::vector<std::pair<base::Time, absl::optional<int32_t>>>& + expected_list, + const std::vector<std::pair<base::Time, absl::optional<int32_t>>>& + actual_list) { + EXPECT_EQ(expected_list.size(), actual_list.size()); + unsigned int equal_count = 0; + for (const auto& expected : expected_list) { + for (const auto& actual : actual_list) { + if (expected.second == actual.second && + IsWithinOneSecond(expected.first, actual.first)) { + equal_count++; + } + } + } + + EXPECT_EQ(equal_count, actual_list.size()); +} + +class SignalDatabaseTest : public testing::Test { + public: + SignalDatabaseTest() = default; + ~SignalDatabaseTest() override = default; + + void OnGetSamples( + std::vector<std::pair<base::Time, absl::optional<int32_t>>> samples) { + get_samples_result_ = samples; + } + + protected: + void SetUpDB() { + DCHECK(!db_); + DCHECK(!signal_db_); + + auto db = std::make_unique<leveldb_proto::test::FakeDB<proto::SignalData>>( + &db_entries_); + db_ = db.get(); + signal_db_ = std::make_unique<SignalDatabase>(std::move(db)); + + signal_db_->Initialize(base::DoNothing()); + db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); + + test_clock_.SetNow(base::Time::Now().UTCMidnight() + + base::TimeDelta::FromHours(8)); + } + + void TearDown() override { + db_entries_.clear(); + db_ = nullptr; + signal_db_.reset(); + } + + base::test::TaskEnvironment task_environment_; + base::SimpleTestClock test_clock_; + std::vector<std::pair<base::Time, absl::optional<int32_t>>> + get_samples_result_; + std::map<std::string, proto::SignalData> db_entries_; + leveldb_proto::test::FakeDB<proto::SignalData>* db_{nullptr}; + std::unique_ptr<SignalDatabase> signal_db_; +}; + +TEST_F(SignalDatabaseTest, WriteSampleAndRead) { + SetUpDB(); + base::Time now = + base::Time::Now().UTCMidnight() + base::TimeDelta::FromHours(8); + + uint64_t name_hash = 1234; + SignalType signal_type = SignalType::HISTOGRAM_VALUE; + + // No entries to begin with. + signal_db_->GetSamples(signal_type, name_hash, now.UTCMidnight(), now, + base::BindOnce(&SignalDatabaseTest::OnGetSamples, + base::Unretained(this))); + db_->LoadCallback(true); + CheckVectorsEqual({}, get_samples_result_); + + // Write a sample. + int32_t value = 10; + base::Time timestamp = now - base::TimeDelta::FromHours(1); + signal_db_->WriteSample(signal_type, name_hash, value, timestamp, + base::DoNothing()); + db_->UpdateCallback(true); + + // Read back the sample and verify. + signal_db_->GetSamples(signal_type, name_hash, now.UTCMidnight(), now, + base::BindOnce(&SignalDatabaseTest::OnGetSamples, + base::Unretained(this))); + db_->LoadCallback(true); + CheckVectorsEqual({{timestamp, value}}, get_samples_result_); + EXPECT_EQ(1u, db_entries_.size()); +} + +TEST_F(SignalDatabaseTest, DeleteSamples) { + SetUpDB(); + + SignalType signal_type = SignalType::USER_ACTION; + uint64_t name_hash = 1234; + base::Time timestamp1 = test_clock_.Now() - base::TimeDelta::FromHours(3); + base::Time timestamp2 = timestamp1 + base::TimeDelta::FromHours(1); + base::Time timestamp3 = timestamp2 + base::TimeDelta::FromHours(1); + + // Write two samples, at timestamp1 and timestamp3. + signal_db_->WriteSample(signal_type, name_hash, absl::nullopt, timestamp1, + base::DoNothing()); + db_->UpdateCallback(true); + EXPECT_EQ(1u, db_entries_.size()); + + signal_db_->WriteSample(signal_type, name_hash, absl::nullopt, timestamp3, + base::DoNothing()); + db_->UpdateCallback(true); + EXPECT_EQ(2u, db_entries_.size()); + + // Now delete samples till timestamp2 and verify. + signal_db_->DeleteSamples(signal_type, name_hash, timestamp2, + base::DoNothing()); + db_->LoadCallback(true); + db_->UpdateCallback(true); + EXPECT_EQ(1u, db_entries_.size()); + + // Now delete samples till timestamp3 and verify. + signal_db_->DeleteSamples(signal_type, name_hash, timestamp3, + base::DoNothing()); + db_->LoadCallback(true); + db_->UpdateCallback(true); + EXPECT_EQ(0u, db_entries_.size()); + + // Try deleting again for the same period. + signal_db_->DeleteSamples(signal_type, name_hash, timestamp3, + base::DoNothing()); + db_->LoadCallback(true); + db_->UpdateCallback(true); + EXPECT_EQ(0u, db_entries_.size()); +} + +TEST_F(SignalDatabaseTest, WriteMultipleSamplesAndRunCompaction) { + // Set up three consecutive date timestamps, each at 8:00AM. + base::Time day1 = base::Time::Now().UTCMidnight() + + base::TimeDelta::FromHours(8) - + base::TimeDelta::FromDays(2); + base::Time day2 = day1 + base::TimeDelta::FromDays(1); + base::Time day3 = day2 + base::TimeDelta::FromDays(1); + + SetUpDB(); + EXPECT_EQ(0u, db_entries_.size()); + + SignalType signal_type = SignalType::USER_ACTION; + uint64_t name_hash = 1234; + + // Collect two samples on day1, and one on day2. + base::Time timestamp_day1_1 = day1 + base::TimeDelta::FromHours(1); + base::Time timestamp_day1_2 = day1 + base::TimeDelta::FromHours(2); + base::Time timestamp_day2_1 = day2 + base::TimeDelta::FromHours(2); + + signal_db_->WriteSample(signal_type, name_hash, absl::nullopt, + timestamp_day1_1, base::DoNothing()); + db_->UpdateCallback(true); + + signal_db_->WriteSample(signal_type, name_hash, absl::nullopt, + timestamp_day1_2, base::DoNothing()); + db_->UpdateCallback(true); + + signal_db_->WriteSample(signal_type, name_hash, absl::nullopt, + timestamp_day2_1, base::DoNothing()); + db_->UpdateCallback(true); + + EXPECT_EQ(3u, db_entries_.size()); + + // Verify samples for the day1. There should be two of them. + signal_db_->GetSamples(signal_type, name_hash, day1.UTCMidnight(), + day2.UTCMidnight(), + base::BindOnce(&SignalDatabaseTest::OnGetSamples, + base::Unretained(this))); + db_->LoadCallback(true); + CheckVectorsEqual( + {{timestamp_day1_1, absl::nullopt}, {timestamp_day1_2, absl::nullopt}}, + get_samples_result_); + + // Compact samples for the day1 and verify. We will have two samples, but one + // less entry. + signal_db_->CompactSamplesForDay(signal_type, name_hash, day1, + base::DoNothing()); + db_->LoadCallback(true); + db_->UpdateCallback(true); + + signal_db_->GetSamples(signal_type, name_hash, day1.UTCMidnight(), + day2.UTCMidnight(), + base::BindOnce(&SignalDatabaseTest::OnGetSamples, + base::Unretained(this))); + db_->LoadCallback(true); + CheckVectorsEqual( + {{timestamp_day1_1, absl::nullopt}, {timestamp_day1_2, absl::nullopt}}, + get_samples_result_); + + EXPECT_EQ(2u, db_entries_.size()); + + // Compact samples for the day2 and verify. + signal_db_->CompactSamplesForDay(signal_type, name_hash, day2, + base::DoNothing()); + db_->LoadCallback(true); + db_->UpdateCallback(true); + + signal_db_->GetSamples(signal_type, name_hash, day2.UTCMidnight(), + day3.UTCMidnight(), + base::BindOnce(&SignalDatabaseTest::OnGetSamples, + base::Unretained(this))); + db_->LoadCallback(true); + CheckVectorsEqual({{timestamp_day2_1, absl::nullopt}}, get_samples_result_); + + EXPECT_EQ(2u, db_entries_.size()); + + // Compact samples for the day3 and verify. There should be no change since + // there are no samples. + signal_db_->CompactSamplesForDay(signal_type, name_hash, day3, + base::DoNothing()); + db_->LoadCallback(true); + + signal_db_->GetSamples(signal_type, name_hash, day3.UTCMidnight(), + day3.UTCMidnight() + base::TimeDelta::FromDays(1), + base::BindOnce(&SignalDatabaseTest::OnGetSamples, + base::Unretained(this))); + db_->LoadCallback(true); + CheckVectorsEqual({}, get_samples_result_); + + EXPECT_EQ(2u, db_entries_.size()); +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/signal_key.cc b/components/segmentation_platform/internal/database/signal_key.cc new file mode 100644 index 0000000..1f9de01 --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_key.cc
@@ -0,0 +1,110 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/database/signal_key.h" + +#include <ostream> +#include <sstream> +#include <string> + +#include "base/time/time.h" +#include "components/segmentation_platform/internal/database/signal_key_internal.h" + +namespace segmentation_platform { + +namespace { +char ToInternalSignalKindRepresentation(SignalKey::Kind kind) { + switch (kind) { + case SignalKey::Kind::USER_ACTION: + return 'u'; + case SignalKey::Kind::HISTOGRAM_VALUE: + return 'h'; + case SignalKey::Kind::HISTOGRAM_ENUM: + return 'e'; + default: + return '0'; + } +} + +SignalKey::Kind FromInternalSignalKindRepresentation(char kind) { + switch (kind) { + case 'u': + return SignalKey::Kind::USER_ACTION; + case 'h': + return SignalKey::Kind::HISTOGRAM_VALUE; + case 'e': + return SignalKey::Kind::HISTOGRAM_ENUM; + default: + return SignalKey::Kind::UNKNOWN; + } +} + +base::Time StripResolutionSmallerThanSeconds(base::Time time) { + return base::Time::FromDeltaSinceWindowsEpoch(base::TimeDelta::FromSeconds( + time.ToDeltaSinceWindowsEpoch().InSeconds())); +} +} // namespace + +SignalKey::SignalKey(Kind kind, + uint64_t name_hash, + base::Time range_start, + base::Time range_end) + : kind_(kind), + name_hash_(name_hash), + range_start_(StripResolutionSmallerThanSeconds(range_start)), + range_end_(StripResolutionSmallerThanSeconds(range_end)) {} + +SignalKey::SignalKey() : kind_(Kind::UNKNOWN), name_hash_(0) {} + +SignalKey::~SignalKey() = default; + +bool SignalKey::IsValid() const { + return kind_ != Kind::UNKNOWN && name_hash_ != 0 && !range_start_.is_null() && + !range_end_.is_null(); +} + +std::string SignalKey::ToBinary() const { + SignalKeyInternal internal_key; + internal_key.prefix.kind = ToInternalSignalKindRepresentation(kind_); + internal_key.prefix.name_hash = name_hash_; + internal_key.time_range_end_sec = + range_end_.ToDeltaSinceWindowsEpoch().InSeconds(); + internal_key.time_range_start_sec = + range_start_.ToDeltaSinceWindowsEpoch().InSeconds(); + return SignalKeyInternalToBinary(internal_key); +} + +std::string SignalKey::GetPrefixInBinary() const { + SignalKeyInternal::Prefix prefix; + prefix.kind = ToInternalSignalKindRepresentation(kind_); + prefix.name_hash = name_hash_; + return SignalKeyInternalPrefixToBinary(prefix); +} + +// static +void SignalKey::FromBinary(const std::string& input, SignalKey* output) { + SignalKeyInternal internal_key; + SignalKeyInternalFromBinary(input, &internal_key); + output->kind_ = + FromInternalSignalKindRepresentation(internal_key.prefix.kind); + output->name_hash_ = internal_key.prefix.name_hash; + output->range_start_ = base::Time::FromDeltaSinceWindowsEpoch( + base::TimeDelta::FromSeconds(internal_key.time_range_start_sec)); + output->range_end_ = base::Time::FromDeltaSinceWindowsEpoch( + base::TimeDelta::FromSeconds(internal_key.time_range_end_sec)); +} + +std::string SignalKey::ToDebugString() const { + std::stringstream buffer; + buffer << *this; + return buffer.str(); +} + +std::ostream& operator<<(std::ostream& os, const SignalKey& key) { + return os << "{kind=" << key.kind() << ", name_hash=" << key.name_hash() + << ", range_start=" << key.range_start() + << ", range_end=" << key.range_end() << "}"; +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/signal_key.h b/components/segmentation_platform/internal/database/signal_key.h new file mode 100644 index 0000000..eea453f --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_key.h
@@ -0,0 +1,96 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_KEY_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_KEY_H_ + +#include <cstdint> +#include <ostream> +#include <string> + +#include "base/time/time.h" + +namespace segmentation_platform { + +// The SignalKey is used for identifying a particular record in the +// SignalDatabase. The format is defined in go/chrome-segmentation-storage-mvp. +// +// It provides functionality to convert to and from a binary format. The format +// for this binary key must never change on a single device, so an internal +// representation for this, SignalKeyInternal, is used. +// +// The SignalKey is not meant to be used by external clients in any way, +// and should be considered as an internal implementation detail of the +// SignalDatabase. +// +// The binary representation of the key does not store any resolution smaller +// than seconds, so any constructed SignalKey is immediately stripped of +// resolutions smaller than 1 second to ensure a SignalKey which has been +// converted to a binary key and back again matches the original SignalKey. +// +// Since the binary representation is not human readable, the struct also +// supports being streamed or by calling ToDebugString(), which will make it be +// presented using this format: +// {kind=..., name_hash=..., range_start=..., range_start=...} which is useful +// for debugging. +// +// The binary representation of a key can be lexicographically compared. The +// fields are in the following order: kind, name_hash, range_start, range_end. +class SignalKey { + public: + enum Kind { + UNKNOWN = 0, + USER_ACTION = 1, + HISTOGRAM_VALUE = 2, + HISTOGRAM_ENUM = 3, + }; + + SignalKey(Kind kind, + uint64_t name_hash, + base::Time range_start, + base::Time range_end); + SignalKey(); + ~SignalKey(); + + // Whether this object has been initialized and does not contain unknown data. + bool IsValid() const; + + Kind kind() const { return kind_; } + uint64_t name_hash() const { return name_hash_; } + // The smallest resolution for range_start() and range_end() is 1 second, so + // any fraction of a second is dropped. + const base::Time& range_start() const { return range_start_; } + const base::Time& range_end() const { return range_end_; } + + // A machine readable representation of the SignalKey. + // See ToDebugString and operator<< implementation for a human readable + // format. + std::string ToBinary() const; + // Parses a machine readable representation of a SignalKeyInternal into + // a SignalKey. Use IsValid() to check that the resulting SignalKey is valid. + static void FromBinary(const std::string& input, SignalKey* output); + // The SignalKey prefix in binary format. + std::string GetPrefixInBinary() const; + // Returns a human readable representation of the SignalKey. + std::string ToDebugString() const; + + private: + // The type of record this key refers to. + Kind kind_; + // The name of the sample identifier, for example the hash of the histogram + // or user action. + uint64_t name_hash_; + // The first record timestamp this key refers to. + base::Time range_start_; + // The latest record timestamp this key refers to. + base::Time range_end_; +}; + +typedef SignalKey::Kind SignalType; + +std::ostream& operator<<(std::ostream& os, const SignalKey& key); + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_KEY_H_
diff --git a/components/segmentation_platform/internal/database/signal_key_internal.cc b/components/segmentation_platform/internal/database/signal_key_internal.cc new file mode 100644 index 0000000..46ede24 --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_key_internal.cc
@@ -0,0 +1,92 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/database/signal_key_internal.h" + +#include <stdint.h> +#include <ostream> +#include <sstream> +#include <string> +#include <utility> + +#include "base/big_endian.h" +#include "base/check.h" +#include "base/logging.h" + +namespace segmentation_platform { + +std::string SignalKeyInternalToBinary(const SignalKeyInternal& input) { + char output[sizeof(SignalKeyInternal)]; + base::BigEndianWriter writer(output, sizeof(output)); + writer.WriteBytes(&input.prefix.kind, sizeof(input.prefix.kind)); + writer.WriteBytes(&input.prefix.padding, sizeof(input.prefix.padding)); + writer.WriteU64(input.prefix.name_hash); + base::WriteBigEndian(writer.ptr(), input.time_range_end_sec); + writer.Skip(sizeof(input.time_range_end_sec)); + base::WriteBigEndian(writer.ptr(), input.time_range_start_sec); + writer.Skip(sizeof(input.time_range_start_sec)); + CHECK_EQ(0UL, writer.remaining()); + return std::string(output, sizeof(output)); +} + +void SignalKeyInternalFromBinary(const std::string& input, + SignalKeyInternal* output) { + CHECK_EQ(input.size(), sizeof(SignalKeyInternal)); + base::BigEndianReader reader(input.data(), input.size()); + reader.ReadBytes(&output->prefix.kind, sizeof(output->prefix.kind)); + reader.Skip(sizeof(SignalKeyInternal::Prefix::padding)); + reader.ReadU64(&output->prefix.name_hash); + base::ReadBigEndian(reader.ptr(), &output->time_range_end_sec); + reader.Skip(sizeof(SignalKeyInternal::time_range_end_sec)); + base::ReadBigEndian(reader.ptr(), &output->time_range_start_sec); + reader.Skip(sizeof(SignalKeyInternal::time_range_start_sec)); + CHECK_EQ(0UL, reader.remaining()); +} + +std::string SignalKeyInternalToDebugString(const SignalKeyInternal& input) { + std::stringstream buffer; + buffer << input; + return buffer.str(); +} + +std::string SignalKeyInternalPrefixToBinary( + const SignalKeyInternal::Prefix& input) { + char output[sizeof(SignalKeyInternal::Prefix)]; + base::BigEndianWriter writer(output, sizeof(output)); + writer.WriteBytes(&input.kind, sizeof(input.kind)); + writer.WriteBytes(&input.padding, sizeof(input.padding)); + writer.WriteU64(input.name_hash); + CHECK_EQ(0UL, writer.remaining()); + std::string output_str = std::string(output, sizeof(output)); + return output_str; +} + +void SignalKeyInternalPrefixFromBinary(const std::string& input, + SignalKeyInternal::Prefix* output) { + CHECK_EQ(input.size(), sizeof(SignalKeyInternal::Prefix)); + base::BigEndianReader reader(input.data(), input.size()); + reader.ReadBytes(&output->kind, sizeof(output->kind)); + reader.Skip(sizeof(SignalKeyInternal::Prefix::padding)); + reader.ReadU64(&output->name_hash); + CHECK_EQ(0UL, reader.remaining()); +} + +std::string SignalKeyInternalPrefixToDebugString( + const SignalKeyInternal::Prefix& input) { + std::stringstream buffer; + buffer << input; + return buffer.str(); +} + +std::ostream& operator<<(std::ostream& os, + const SignalKeyInternal::Prefix& prefix) { + return os << "{" << prefix.kind << ":" << prefix.name_hash << "}"; +} + +std::ostream& operator<<(std::ostream& os, const SignalKeyInternal& key) { + return os << "{" << key.prefix << ":" << key.time_range_end_sec << ":" + << key.time_range_start_sec << "}"; +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/signal_key_internal.h b/components/segmentation_platform/internal/database/signal_key_internal.h new file mode 100644 index 0000000..17b6327 --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_key_internal.h
@@ -0,0 +1,128 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_KEY_INTERNAL_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_KEY_INTERNAL_H_ + +#include <stdint.h> +#include <ostream> +#include <string> +#include <type_traits> + +namespace segmentation_platform { + +// The SignalKeyInternal is used for identifying a particular record in the +// SignalDatabase. The format is defined in go/chrome-segmentation-storage-mvp. +// It is important that on a single device, this representation never changes, +// so steps are taken to make sure it is safe to make assumptions about the +// memory layout of the key. +// +// The SignalKeyInternal is not meant to be used by external clients in any way, +// and should be considered as an internal implementation detail of the +// SignalDatabase. +// +// Since the binary representation is not human readable, the struct also +// supports being streamed or by calling SignalKeyInternalToDebugString(), +// which will make it be presented using this format: +// {{kind:name_hash}:time_range_end_sec:time_range_start_sec} which is useful +// for debugging. +// +// The structure of the key is on the following format: +// +----+---------------------------+ +// |kind| (PADDING) | +// |char| char[7] | +// +----+---------------------------+ +// | name_hash | +// | uint64_t | +// +--------------------------------+ +// | time_range_end_sec | +// | int64_t | +// +--------------------------------+ +// | time_range_start_sec | +// | int64_t | +// +--------------------------------+ +// +// Even though SignalKeyInternal is serialized/deserialized using big endian +// writer and reader respectively, it still cannot contain any implicit padding +// since implicit padding bytes could contain any value and prevent two +// otherwise equal binary keys from comparing as equal. +// +// The binary format is created using big endian, which means that the binary +// key can be used to do lexicographical comparisons in its binary format +// (represented as std::string). The same is true for prefix-based lookups using +// the SignalKeyInternal::Prefix. +// The fields are in the following order: kind, name_hash, range_start, +// range_end (SignalKey::Prefix only contains the first two fields). +struct SignalKeyInternal { + struct Prefix { + // The type of record this key refers to. + char kind{}; + + // This padding is required to be able to guarantee a standard layout. + const char padding[7]{}; + + // The name of the sample identifier, for example the hash of the histogram + // or user action. + uint64_t name_hash{}; + }; + Prefix prefix; + + // The latest record timestamp this key refers to. + int64_t time_range_end_sec{}; + // The first record timestamp this key refers to. + int64_t time_range_start_sec{}; +}; + +// Verify that we can safely make assumptions about the memory layout. +// It is important to recognize that if you change how the key is laid out, +// old keys will no longer be usable, and since this key is persisted to disk, +// this is something that should be avoided. +// See https://en.cppreference.com/w/cpp/named_req/StandardLayoutType +static_assert(std::is_standard_layout<SignalKeyInternal>::value, + "SignalKeyInternal must have a standard layout."); + +// Ensure there is no implicit padding. +// TODO(C++17): Use std::has_unique_object_representations instead. +static_assert(sizeof(SignalKeyInternal) == 32, "Size must be 32"); +static_assert(sizeof(SignalKeyInternal) == + sizeof(SignalKeyInternal::Prefix::kind) + + sizeof(SignalKeyInternal::Prefix::padding) + + sizeof(SignalKeyInternal::Prefix::name_hash) + + sizeof(SignalKeyInternal::time_range_end_sec) + + sizeof(SignalKeyInternal::time_range_start_sec), + "Sum of the size of all fields must be 32"); + +// A machine readable representation of the SignalKeyInternal. +// See ToDebugString and operator<< implementation for a human readable +// format. +std::string SignalKeyInternalToBinary(const SignalKeyInternal& input); +// Parses a machine readable representation of a SignalKeyInternal into +// a SignalKeyInternal. +void SignalKeyInternalFromBinary(const std::string& input, + SignalKeyInternal* output); +// Returns a human readable representation of the SignalKeyInternal. +std::string SignalKeyInternalToDebugString(const SignalKeyInternal& input); + +// A machine readable representation of the SignalKeyInternal::Prefix. +// See ToDebugString and operator<< implementation for a human readable +// format. +std::string SignalKeyInternalPrefixToBinary( + const SignalKeyInternal::Prefix& input); +// Parses a machine readable representation of a SignalKeyInternal::Prefix into +// a SignalKeyInternal::Prefix. +void SignalKeyInternalPrefixFromBinary(const std::string& input, + SignalKeyInternal::Prefix* output); +// Returns a human readable representation of the SignalKeyInternal::Prefix. +std::string SignalKeyInternalPrefixToDebugString( + const SignalKeyInternal::Prefix& input); + +// The following streaming operators make it easy to get a human readable +// version of the SignalKeyInternal and SignalKeyInternal::Prefix. +std::ostream& operator<<(std::ostream& os, const SignalKeyInternal& key); +std::ostream& operator<<(std::ostream& os, + const SignalKeyInternal::Prefix& prefix); + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_DATABASE_SIGNAL_KEY_INTERNAL_H_
diff --git a/components/segmentation_platform/internal/database/signal_key_internal_unittest.cc b/components/segmentation_platform/internal/database/signal_key_internal_unittest.cc new file mode 100644 index 0000000..a234283 --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_key_internal_unittest.cc
@@ -0,0 +1,330 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/database/signal_key_internal.h" + +#include <sstream> +#include <string> + +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { + +namespace { +void VerifyEqual(SignalKeyInternal a, SignalKeyInternal b) { + ASSERT_EQ(0, memcmp(&a, &b, sizeof(SignalKeyInternal))); +} + +void VerifyNotEqual(SignalKeyInternal a, SignalKeyInternal b) { + ASSERT_NE(0, memcmp(&a, &b, sizeof(SignalKeyInternal))); +} + +void VerifyEqual(SignalKeyInternal::Prefix a, SignalKeyInternal::Prefix b) { + ASSERT_EQ(0, memcmp(&a, &b, sizeof(SignalKeyInternal::Prefix))); +} + +void VerifyNotEqual(SignalKeyInternal::Prefix a, SignalKeyInternal::Prefix b) { + ASSERT_NE(0, memcmp(&a, &b, sizeof(SignalKeyInternal::Prefix))); +} + +TEST(SignalKeyInternalTest, TestKeyConversionToAndFromBinary) { + SignalKeyInternal key; + key.prefix.kind = 'u'; + key.prefix.name_hash = 42; + key.time_range_end_sec = 1577836800000; + key.time_range_start_sec = 1609459200000; + + std::string binary = SignalKeyInternalToBinary(key); + SignalKeyInternal result; + SignalKeyInternalFromBinary(binary, &result); + VerifyEqual(key, result); +} + +TEST(SignalKeyInternalTest, TestPrefixConversionToAndFromBinary) { + SignalKeyInternal::Prefix prefix; + prefix.kind = 'u'; + prefix.name_hash = 42; + + std::string binary = SignalKeyInternalPrefixToBinary(prefix); + SignalKeyInternal::Prefix result; + SignalKeyInternalPrefixFromBinary(binary, &result); + VerifyEqual(prefix, result); +} + +TEST(SignalKeyInternalTest, TestChangingAnyKeyFieldMakesNotEqual) { + SignalKeyInternal original; + original.prefix.kind = 'u'; + original.prefix.name_hash = 42; + original.time_range_end_sec = 1577836800000; + original.time_range_start_sec = 1609459200000; + + SignalKeyInternal copy = original; + SignalKeyInternal result; + SignalKeyInternalFromBinary(SignalKeyInternalToBinary(copy), &result); + VerifyEqual(original, result); + + SignalKeyInternal different_kind = original; + different_kind.prefix.kind = 'r'; + SignalKeyInternalFromBinary(SignalKeyInternalToBinary(different_kind), + &result); + VerifyNotEqual(original, result); + + SignalKeyInternal different_name_hash = original; + different_name_hash.prefix.name_hash = 84; + SignalKeyInternalFromBinary(SignalKeyInternalToBinary(different_name_hash), + &result); + VerifyNotEqual(original, result); + + SignalKeyInternal different_time_range_end_sec = original; + different_time_range_end_sec.time_range_end_sec = 1546300800000; + SignalKeyInternalFromBinary( + SignalKeyInternalToBinary(different_time_range_end_sec), &result); + VerifyNotEqual(original, result); + + SignalKeyInternal different_time_range_start_sec = original; + different_time_range_start_sec.time_range_start_sec = 1546300800000; + SignalKeyInternalFromBinary( + SignalKeyInternalToBinary(different_time_range_start_sec), &result); + VerifyNotEqual(original, result); +} + +TEST(SignalKeyInternalTest, TestChangingAnyPrefixFieldMakesNotEqual) { + SignalKeyInternal::Prefix original; + original.kind = 'u'; + original.name_hash = 42; + + SignalKeyInternal::Prefix copy = original; + SignalKeyInternal::Prefix result; + SignalKeyInternalPrefixFromBinary(SignalKeyInternalPrefixToBinary(copy), + &result); + VerifyEqual(original, result); + + SignalKeyInternal::Prefix different_kind = original; + different_kind.kind = 'r'; + SignalKeyInternalPrefixFromBinary( + SignalKeyInternalPrefixToBinary(different_kind), &result); + VerifyNotEqual(original, result); + + SignalKeyInternal::Prefix different_name_hash = original; + different_name_hash.name_hash = 84; + SignalKeyInternalPrefixFromBinary( + SignalKeyInternalPrefixToBinary(different_name_hash), &result); + VerifyNotEqual(original, result); +} + +TEST(SignalKeyInternalTest, TestKeyDebugStringRepresentation) { + SignalKeyInternal key1; + key1.prefix.kind = 'u'; + key1.prefix.name_hash = 1; + key1.time_range_end_sec = 3; + key1.time_range_start_sec = 2; + + EXPECT_EQ("{{u:1}:3:2}", SignalKeyInternalToDebugString(key1)); + std::stringstream key1_buffer; + key1_buffer << key1; + EXPECT_EQ("{{u:1}:3:2}", key1_buffer.str()); + + SignalKeyInternal key2; + key2.prefix.kind = 'u'; + key2.prefix.name_hash = 1; + key2.time_range_end_sec = -2; + key2.time_range_start_sec = -3; + EXPECT_EQ("{{u:1}:-2:-3}", SignalKeyInternalToDebugString(key2)); + std::stringstream key2_buffer; + key2_buffer << key2; + EXPECT_EQ("{{u:1}:-2:-3}", key2_buffer.str()); +} + +TEST(SignalKeyInternalTest, TestPrefixDebugStringRepresentation) { + SignalKeyInternal::Prefix prefix; + prefix.kind = 'u'; + prefix.name_hash = 1; + EXPECT_EQ("{u:1}", SignalKeyInternalPrefixToDebugString(prefix)); + std::stringstream prefix_buffer; + prefix_buffer << prefix; + EXPECT_EQ("{u:1}", prefix_buffer.str()); +} + +TEST(SignalKeyInternalTest, TestBinaryKeyLexicographicalComparison) { + // The members prefix.name_hash, time_range_end_sec, and time_range_start_sec + // are not lexicographically comparable using their in-memory representation + // on little endian systems. Verify that the resulting binary key still is + // lexicographically comparable since big endian should be used. + // It is important to use multiple bytes when creating test scenarios, since + // both little endian and big endian store each individual byte the same way. + SignalKeyInternal original; + original.prefix.kind = 'u'; + original.prefix.name_hash = 1 << 8; + original.time_range_end_sec = 1 << 24; + original.time_range_start_sec = 1 << 8; + std::string original_binary = SignalKeyInternalToBinary(original); + + SignalKeyInternal other{{'u', {}, 1 << 8}, 1 << 24, 1 << 8}; + std::string other_binary = SignalKeyInternalToBinary(other); + EXPECT_EQ(original_binary, other_binary); + + SignalKeyInternal kind_smaller{{'a', {}, 1 << 8}, 1 << 24, 1 << 8}; + std::string kind_smaller_binary = SignalKeyInternalToBinary(kind_smaller); + EXPECT_GT(original_binary, kind_smaller_binary); + + SignalKeyInternal kind_larger{{'z', {}, 1 << 8}, 1 << 24, 1 << 8}; + std::string kind_larger_binary = SignalKeyInternalToBinary(kind_larger); + EXPECT_LT(original_binary, kind_larger_binary); + + SignalKeyInternal name_hash_smaller{{'u', {}, 1}, 1 << 24, 1 << 8}; + std::string name_hash_smaller_binary = + SignalKeyInternalToBinary(name_hash_smaller); + EXPECT_GT(original_binary, name_hash_smaller_binary); + + SignalKeyInternal name_hash_larger{{'u', {}, 1 << 16}, 1 << 24, 1 << 8}; + std::string name_hash_larger_binary = + SignalKeyInternalToBinary(name_hash_larger); + EXPECT_LT(original_binary, name_hash_larger_binary); + + SignalKeyInternal range_end_smaller{{'u', {}, 1 << 8}, 1 << 16, 1 << 8}; + std::string range_end_smaller_binary = + SignalKeyInternalToBinary(range_end_smaller); + EXPECT_GT(original_binary, range_end_smaller_binary); + + SignalKeyInternal range_end_larger{{'u', {}, 1 << 8}, 1LL << 32, 1 << 8}; + std::string range_end_larger_binary = + SignalKeyInternalToBinary(range_end_larger); + EXPECT_LT(original_binary, range_end_larger_binary); + + SignalKeyInternal range_start_smaller{{'u', {}, 1 << 8}, 1 << 24, 1}; + std::string range_start_smaller_binary = + SignalKeyInternalToBinary(range_start_smaller); + EXPECT_GT(original_binary, range_start_smaller_binary); + + SignalKeyInternal range_start_larger{{'u', {}, 1 << 8}, 1 << 24, 1 << 16}; + std::string range_start_larger_binary = + SignalKeyInternalToBinary(range_start_larger); + EXPECT_LT(original_binary, range_start_larger_binary); +} + +TEST(SignalKeyInternalTest, TestBinaryKeyFieldOrder) { + // This test changes one field at a time, and ensures that all fields expected + // to be later in the binary representation are set to values that would fail + // the comparison if they were in a different order. + SignalKeyInternal original; + original.prefix.kind = 'u'; + original.prefix.name_hash = 1 << 8; + original.time_range_end_sec = 1 << 8; + original.time_range_start_sec = 1 << 8; + std::string original_binary = SignalKeyInternalToBinary(original); + + // First value should be prefix.kind. + SignalKeyInternal kind_smaller{{'a', {}, 1 << 16}, 1 << 16, 1 << 16}; + std::string kind_smaller_binary = SignalKeyInternalToBinary(kind_smaller); + EXPECT_GT(original_binary, kind_smaller_binary); + + SignalKeyInternal kind_larger{{'z', {}, 1}, 1, 1}; + std::string kind_larger_binary = SignalKeyInternalToBinary(kind_larger); + EXPECT_LT(original_binary, kind_larger_binary); + + // Second value should be prefix.name_hash. + SignalKeyInternal name_hash_smaller{{'u', {}, 1}, 1 << 16, 1 << 16}; + std::string name_hash_smaller_binary = + SignalKeyInternalToBinary(name_hash_smaller); + EXPECT_GT(original_binary, name_hash_smaller_binary); + + SignalKeyInternal name_hash_larger{{'u', {}, 1 << 16}, 1, 1}; + std::string name_hash_larger_binary = + SignalKeyInternalToBinary(name_hash_larger); + EXPECT_LT(original_binary, name_hash_larger_binary); + + // Third value should be time_range_end_sec. + SignalKeyInternal time_range_end_sec_smaller{{'u', {}, 1 << 8}, 1, 1 << 16}; + std::string time_range_end_sec_smaller_binary = + SignalKeyInternalToBinary(time_range_end_sec_smaller); + EXPECT_GT(original_binary, time_range_end_sec_smaller_binary); + + SignalKeyInternal time_range_end_sec_larger{{'u', {}, 1 << 8}, 1 << 16, 1}; + std::string time_range_end_sec_larger_binary = + SignalKeyInternalToBinary(time_range_end_sec_larger); + EXPECT_LT(original_binary, time_range_end_sec_larger_binary); + + // Fourth value should be time_range_start_sec. + SignalKeyInternal time_range_start_sec_smaller{{'u', {}, 1 << 8}, 1 << 8, 1}; + std::string time_range_start_sec_smaller_binary = + SignalKeyInternalToBinary(time_range_start_sec_smaller); + EXPECT_GT(original_binary, time_range_start_sec_smaller_binary); + + SignalKeyInternal time_range_start_sec_larger{ + {'u', {}, 1 << 8}, 1 << 8, 1 << 16}; + std::string time_range_start_sec_larger_binary = + SignalKeyInternalToBinary(time_range_start_sec_larger); + EXPECT_LT(original_binary, time_range_start_sec_larger_binary); +} + +TEST(SignalKeyInternalTest, TestBinaryPrefixLexicographicalComparison) { + // The members prefix.name_hash is not lexicographically comparable using + // their in-memory representation on little endian systems. Verify that the + // resulting binary prefix still is lexicographically comparable since big + // endian should be used. + // It is important to use multiple bytes when creating test scenarios, since + // both little endian and big endian store each individual byte the same way. + SignalKeyInternal::Prefix original; + original.kind = 'u'; + original.name_hash = 1 << 8; + std::string original_binary = SignalKeyInternalPrefixToBinary(original); + + SignalKeyInternal::Prefix other{'u', {}, 1 << 8}; + std::string other_binary = SignalKeyInternalPrefixToBinary(other); + EXPECT_EQ(original_binary, other_binary); + + SignalKeyInternal::Prefix kind_smaller{'a', {}, 1 << 8}; + std::string kind_smaller_binary = + SignalKeyInternalPrefixToBinary(kind_smaller); + EXPECT_GT(original_binary, kind_smaller_binary); + + SignalKeyInternal::Prefix kind_larger{'z', {}, 1 << 8}; + std::string kind_larger_binary = SignalKeyInternalPrefixToBinary(kind_larger); + EXPECT_LT(original_binary, kind_larger_binary); + + SignalKeyInternal::Prefix name_hash_smaller{'u', {}, 1}; + std::string name_hash_smaller_binary = + SignalKeyInternalPrefixToBinary(name_hash_smaller); + EXPECT_GT(original_binary, name_hash_smaller_binary); + + SignalKeyInternal::Prefix name_hash_larger{'u', {}, 1 << 16}; + std::string name_hash_larger_binary = + SignalKeyInternalPrefixToBinary(name_hash_larger); + EXPECT_LT(original_binary, name_hash_larger_binary); +} + +TEST(SignalKeyInternalTest, TestBinaryPrefixFieldOrder) { + // This test changes one field at a time, and ensures that all fields expected + // to be later in the binary representation are set to values that would fail + // the comparison if they were in a different order. + SignalKeyInternal::Prefix original; + original.kind = 'u'; + original.name_hash = 1 << 8; + std::string original_binary = SignalKeyInternalPrefixToBinary(original); + + // First value should be kind. + SignalKeyInternal::Prefix kind_smaller{'a', {}, 1 << 16}; + std::string kind_smaller_binary = + SignalKeyInternalPrefixToBinary(kind_smaller); + EXPECT_GT(original_binary, kind_smaller_binary); + + SignalKeyInternal::Prefix kind_larger{'z', {}, 1}; + std::string kind_larger_binary = SignalKeyInternalPrefixToBinary(kind_larger); + EXPECT_LT(original_binary, kind_larger_binary); + + // Second value should be name_hash. + SignalKeyInternal::Prefix name_hash_smaller{'u', {}, 1}; + std::string name_hash_smaller_binary = + SignalKeyInternalPrefixToBinary(name_hash_smaller); + EXPECT_GT(original_binary, name_hash_smaller_binary); + + SignalKeyInternal::Prefix name_hash_larger{'u', {}, 1 << 16}; + std::string name_hash_larger_binary = + SignalKeyInternalPrefixToBinary(name_hash_larger); + EXPECT_LT(original_binary, name_hash_larger_binary); +} + +} // namespace + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/database/signal_key_unittest.cc b/components/segmentation_platform/internal/database/signal_key_unittest.cc new file mode 100644 index 0000000..62268ff --- /dev/null +++ b/components/segmentation_platform/internal/database/signal_key_unittest.cc
@@ -0,0 +1,195 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/database/signal_key.h" + +#include <cmath> +#include <cstring> + +#include "base/logging.h" +#include "base/test/simple_test_clock.h" +#include "base/time/time.h" +#include "components/segmentation_platform/internal/database/signal_key_internal.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { + +namespace { +int CompareBinaryKeys(const SignalKey& a, const SignalKey& b) { + std::string a_key = a.ToBinary(); + std::string b_key = b.ToBinary(); + CHECK_EQ(a_key.size(), b_key.size()); + return std::memcmp(a_key.data(), b_key.data(), a_key.size()); +} + +bool Equal(const SignalKey& k1, const SignalKey& k2) { + // Log comparison debugging info for failing tests. + VLOG(0) << k1 << " ==? " << k2; + return k1.kind() == k2.kind() && k1.name_hash() == k2.name_hash() && + k1.range_start() == k2.range_start() && + k1.range_end() == k2.range_end() && CompareBinaryKeys(k1, k2) == 0; +} +} // namespace + +class SignalKeyTest : public testing::Test { + public: + SignalKeyTest() = default; + ~SignalKeyTest() override = default; + + void VerifyConversion(const SignalKey& key) { + std::string binary_key = key.ToBinary(); + SignalKey result; + SignalKey::FromBinary(binary_key, &result); + EXPECT_TRUE(Equal(key, result)); + } + + protected: + void SetUp() override { + test_clock_.SetNow(base::Time::UnixEpoch() + base::TimeDelta::FromHours(8)); + } + + base::SimpleTestClock test_clock_; +}; + +TEST_F(SignalKeyTest, TestConvertToAndFromBinary) { + VerifyConversion( + SignalKey(SignalKey::Kind::USER_ACTION, 1, test_clock_.Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(10))); + VerifyConversion( + SignalKey(SignalKey::Kind::HISTOGRAM_VALUE, 2, base::Time::Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(20))); + VerifyConversion( + SignalKey(SignalKey::Kind::HISTOGRAM_ENUM, 3, base::Time::Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(30))); +} + +TEST_F(SignalKeyTest, TestValidity) { + SignalKey valid_key(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(10)); + EXPECT_TRUE(valid_key.IsValid()); + + // A default constructed key should not be valid. + SignalKey default_constructed_key; + EXPECT_FALSE(default_constructed_key.IsValid()); + + // Verify that each individual field is tested for validity. + SignalKey invalid_key1(SignalKey::Kind::UNKNOWN, 42, test_clock_.Now(), + test_clock_.Now()); + EXPECT_FALSE(invalid_key1.IsValid()); + + SignalKey invalid_key2(SignalKey::Kind::USER_ACTION, 0, test_clock_.Now(), + test_clock_.Now()); + EXPECT_FALSE(invalid_key2.IsValid()); + + SignalKey invalid_key3(SignalKey::Kind::USER_ACTION, 42, base::Time(), + test_clock_.Now()); + EXPECT_FALSE(invalid_key3.IsValid()); + + SignalKey invalid_key4(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + base::Time()); + EXPECT_FALSE(invalid_key4.IsValid()); +} + +TEST_F(SignalKeyTest, TestUsesSafeBinaryFormat) { + // By testing that the underlying format is the binary version of + // SignalKeyInternal, we can ensure API guarantees based on SignalKeyInternal. + SignalKey key(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(10)); + + std::string binary_key = key.ToBinary(); + SignalKeyInternal internal_key; + SignalKeyInternalFromBinary(binary_key, &internal_key); + EXPECT_EQ('u', internal_key.prefix.kind); + EXPECT_EQ(42UL, internal_key.prefix.name_hash); + EXPECT_EQ(11644502400, internal_key.time_range_start_sec); + EXPECT_EQ(11644502410, internal_key.time_range_end_sec); +} + +TEST_F(SignalKeyTest, TestGetPrefixInBinary) { + SignalKey key(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(10)); + + std::string binary_prefix = key.GetPrefixInBinary(); + SignalKeyInternal::Prefix prefix; + SignalKeyInternalPrefixFromBinary(binary_prefix, &prefix); + EXPECT_EQ('u', prefix.kind); + EXPECT_EQ(42UL, prefix.name_hash); +} + +TEST_F(SignalKeyTest, EarliestEndTimeComesFirst) { + SignalKey early(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now()); + + SignalKey late(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(20)); + + EXPECT_LT(CompareBinaryKeys(early, late), 0); +} + +TEST_F(SignalKeyTest, EqualKeysHaveEqualBinaryKeys) { + SignalKey a(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now()); + SignalKey b(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now()); + + EXPECT_EQ(0, CompareBinaryKeys(a, b)); +} + +TEST_F(SignalKeyTest, EndTimeMoreSignificantThanStartTime) { + SignalKey early_end(SignalKey::Kind::USER_ACTION, 42, + test_clock_.Now() + base::TimeDelta::FromSeconds(20), + test_clock_.Now() + base::TimeDelta::FromSeconds(20)); + SignalKey early_start(SignalKey::Kind::USER_ACTION, 42, + test_clock_.Now() + base::TimeDelta::FromSeconds(10), + test_clock_.Now() + base::TimeDelta::FromSeconds(30)); + + EXPECT_LT(CompareBinaryKeys(early_end, early_start), 0); +} + +TEST_F(SignalKeyTest, OrderByStartTimeIfEverythingElseIsEqual) { + SignalKey early_start(SignalKey::Kind::USER_ACTION, 42, + test_clock_.Now() + base::TimeDelta::FromSeconds(10), + test_clock_.Now()); + SignalKey late_start(SignalKey::Kind::USER_ACTION, 42, + test_clock_.Now() + base::TimeDelta::FromSeconds(20), + test_clock_.Now()); + + EXPECT_LT(CompareBinaryKeys(early_start, late_start), 0); +} + +TEST_F(SignalKeyTest, DifferentNameHashGivesDifferentKey) { + SignalKey a(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now()); + SignalKey b(SignalKey::Kind::USER_ACTION, 84, test_clock_.Now(), + test_clock_.Now()); + + EXPECT_NE(0, CompareBinaryKeys(a, b)); +} + +TEST_F(SignalKeyTest, DifferentKindGivesDifferentKey) { + SignalKey a(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now()); + SignalKey b(SignalKey::Kind::HISTOGRAM_VALUE, 42, test_clock_.Now(), + test_clock_.Now()); + + EXPECT_NE(0, CompareBinaryKeys(a, b)); +} + +TEST_F(SignalKeyTest, TestKeyDebugStringRepresentation) { + SignalKey key(SignalKey::Kind::USER_ACTION, 42, test_clock_.Now(), + test_clock_.Now() + base::TimeDelta::FromSeconds(10)); + + EXPECT_EQ( + "{kind=1, name_hash=42, range_start=1970-01-01 08:00:00.000 UTC, " + "range_end=1970-01-01 08:00:10.000 UTC}", + key.ToDebugString()); + std::stringstream key_buffer; + key_buffer << key; + EXPECT_EQ( + "{kind=1, name_hash=42, range_start=1970-01-01 08:00:00.000 UTC, " + "range_end=1970-01-01 08:00:10.000 UTC}", + key_buffer.str()); +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/execution/dummy_model_execution_manager.cc b/components/segmentation_platform/internal/execution/dummy_model_execution_manager.cc new file mode 100644 index 0000000..58dc8613 --- /dev/null +++ b/components/segmentation_platform/internal/execution/dummy_model_execution_manager.cc
@@ -0,0 +1,44 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/execution/dummy_model_execution_manager.h" + +#include <memory> +#include <utility> + +#include "base/bind.h" +#include "base/location.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/internal/execution/model_execution_manager.h" +#include "components/segmentation_platform/internal/execution/model_execution_status.h" + +namespace optimization_guide { +class OptimizationGuideModelProvider; +using proto::OptimizationTarget; +} // namespace optimization_guide + +namespace segmentation_platform { +namespace { +void RunModelExecutionCallback( + ModelExecutionManager::ModelExecutionCallback callback) { + std::move(callback).Run( + std::make_pair(0, ModelExecutionStatus::EXECUTION_ERROR)); +} +} // namespace + +DummyModelExecutionManager::DummyModelExecutionManager() = default; + +DummyModelExecutionManager::~DummyModelExecutionManager() = default; + +void DummyModelExecutionManager::ExecuteModel( + optimization_guide::proto::OptimizationTarget segment_id, + ModelExecutionCallback callback) { + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&RunModelExecutionCallback, std::move(callback))); + return; +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/execution/dummy_model_execution_manager.h b/components/segmentation_platform/internal/execution/dummy_model_execution_manager.h new file mode 100644 index 0000000..3c0283c --- /dev/null +++ b/components/segmentation_platform/internal/execution/dummy_model_execution_manager.h
@@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_EXECUTION_DUMMY_MODEL_EXECUTION_MANAGER_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_EXECUTION_DUMMY_MODEL_EXECUTION_MANAGER_H_ + +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/internal/execution/model_execution_manager.h" + +namespace segmentation_platform { + +// The DummyModelExecutionManager provides an implementation of the core +// ModelExecutionManager that always posts a callback results with +// ModelExecutionStatus::EXECUTION_ERROR. +// +// It has no dependencies on TFLite, so it can be used even when +// BUILDFLAG(BUILD_WITH_TFLITE_LIB) is not set. +class DummyModelExecutionManager : public ModelExecutionManager { + public: + DummyModelExecutionManager(); + ~DummyModelExecutionManager() override; + + // Disallow copy/assign. + DummyModelExecutionManager(const DummyModelExecutionManager&) = delete; + DummyModelExecutionManager& operator=(const DummyModelExecutionManager&) = + delete; + + // ModelExecutionManager overrides. + void ExecuteModel(optimization_guide::proto::OptimizationTarget segment_id, + ModelExecutionCallback callback) override; +}; + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_EXECUTION_DUMMY_MODEL_EXECUTION_MANAGER_H_
diff --git a/components/segmentation_platform/internal/execution/dummy_model_execution_manager_unittest.cc b/components/segmentation_platform/internal/execution/dummy_model_execution_manager_unittest.cc new file mode 100644 index 0000000..525776b --- /dev/null +++ b/components/segmentation_platform/internal/execution/dummy_model_execution_manager_unittest.cc
@@ -0,0 +1,61 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/execution/dummy_model_execution_manager.h" + +#include <memory> + +#include "base/bind.h" +#include "base/run_loop.h" +#include "base/test/task_environment.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/internal/execution/model_execution_status.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { +class DummyModelExecutionManagerTest : public testing::Test { + public: + DummyModelExecutionManagerTest() = default; + ~DummyModelExecutionManagerTest() override = default; + + void TearDown() override { + model_execution_manager_.reset(); + // Allow for the background class to be destroyed. + RunUntilIdle(); + } + + void CreateModelExecutionManager() { + model_execution_manager_ = std::make_unique<DummyModelExecutionManager>(); + } + + void RunUntilIdle() { task_environment_.RunUntilIdle(); } + + void ExecuteModel() { + base::RunLoop loop; + model_execution_manager_->ExecuteModel( + optimization_guide::proto::OptimizationTarget:: + OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, + base::BindOnce(&DummyModelExecutionManagerTest::OnExecutionCallback, + base::Unretained(this), loop.QuitClosure())); + loop.Run(); + } + + void OnExecutionCallback( + base::RepeatingClosure closure, + const std::pair<float, ModelExecutionStatus>& actual) { + EXPECT_EQ(ModelExecutionStatus::EXECUTION_ERROR, actual.second); + EXPECT_EQ(0, actual.first); + std::move(closure).Run(); + } + + base::test::TaskEnvironment task_environment_; + std::unique_ptr<DummyModelExecutionManager> model_execution_manager_; +}; + +TEST_F(DummyModelExecutionManagerTest, AlwaysSameResult) { + CreateModelExecutionManager(); + ExecuteModel(); +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/execution/model_execution_manager_factory.cc b/components/segmentation_platform/internal/execution/model_execution_manager_factory.cc new file mode 100644 index 0000000..09a2791 --- /dev/null +++ b/components/segmentation_platform/internal/execution/model_execution_manager_factory.cc
@@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/execution/model_execution_manager_factory.h" + +#include <memory> +#include <vector> + +#include "base/sequenced_task_runner.h" +#include "components/optimization_guide/machine_learning_tflite_buildflags.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/internal/execution/model_execution_manager.h" + +#if BUILDFLAG(BUILD_WITH_TFLITE_LIB) +#include "components/segmentation_platform/internal/execution/model_execution_manager_impl.h" +#else +#include "components/segmentation_platform/internal/execution/dummy_model_execution_manager.h" +#endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) + +namespace optimization_guide { +class OptimizationGuideModelProvider; +} // namespace optimization_guide + +namespace segmentation_platform { +class SegmentInfoDatabase; + +std::unique_ptr<ModelExecutionManager> CreateModelExecutionManager( + optimization_guide::OptimizationGuideModelProvider* model_provider, + scoped_refptr<base::SequencedTaskRunner> background_task_runner, + std::vector<optimization_guide::proto::OptimizationTarget> segment_ids, + SegmentInfoDatabase* segment_database) { +#if BUILDFLAG(BUILD_WITH_TFLITE_LIB) + return std::make_unique<ModelExecutionManagerImpl>( + model_provider, background_task_runner, segment_ids, segment_database); +#else + return std::make_unique<DummyModelExecutionManager>(); +#endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/execution/model_execution_manager_factory.h b/components/segmentation_platform/internal/execution/model_execution_manager_factory.h new file mode 100644 index 0000000..e322df7 --- /dev/null +++ b/components/segmentation_platform/internal/execution/model_execution_manager_factory.h
@@ -0,0 +1,34 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_EXECUTION_MODEL_EXECUTION_MANAGER_FACTORY_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_EXECUTION_MODEL_EXECUTION_MANAGER_FACTORY_H_ + +#include <memory> +#include <vector> + +#include "base/sequenced_task_runner.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/internal/execution/model_execution_manager.h" + +namespace optimization_guide { +class OptimizationGuideModelProvider; +} // namespace optimization_guide + +namespace segmentation_platform { +class SegmentInfoDatabase; + +// Creates a ModelExecutionManager that is appropriate for the current platform. +// In particular, it creates a DummyModelExecutionManager in cases where +// BUILDFLAG(BUILD_WITH_TFLITE_LIB) is not set, in case of the full +// implementation provided by ModelExecutionManagerImpl. +std::unique_ptr<ModelExecutionManager> CreateModelExecutionManager( + optimization_guide::OptimizationGuideModelProvider* model_provider, + scoped_refptr<base::SequencedTaskRunner> background_task_runner, + std::vector<optimization_guide::proto::OptimizationTarget> segment_ids, + SegmentInfoDatabase* segment_database); + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_EXECUTION_MODEL_EXECUTION_MANAGER_FACTORY_H_
diff --git a/components/segmentation_platform/internal/execution/model_execution_manager_factory_unittest.cc b/components/segmentation_platform/internal/execution/model_execution_manager_factory_unittest.cc new file mode 100644 index 0000000..a4b08a9 --- /dev/null +++ b/components/segmentation_platform/internal/execution/model_execution_manager_factory_unittest.cc
@@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/segmentation_platform/internal/execution/model_execution_manager_factory.h" + +#include <memory> + +#include "base/bind.h" +#include "base/callback_forward.h" +#include "base/run_loop.h" +#include "base/test/task_environment.h" +#include "components/optimization_guide/core/test_optimization_guide_model_provider.h" +#include "components/optimization_guide/proto/models.pb.h" +#include "components/segmentation_platform/internal/database/test_segment_info_database.h" +#include "components/segmentation_platform/internal/execution/model_execution_status.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { +class ModelExecutionManagerFactoryTest : public testing::Test { + public: + ModelExecutionManagerFactoryTest() = default; + ~ModelExecutionManagerFactoryTest() override = default; + + void SetUp() override { + optimization_guide_model_provider_ = std::make_unique< + optimization_guide::TestOptimizationGuideModelProvider>(); + segment_database_ = std::make_unique<test::TestSegmentInfoDatabase>(); + } + + void TearDown() override { + // Allow for the SegmentationModelExecutor owned by SegmentationModelHandler + // to be destroyed. + task_environment_.RunUntilIdle(); + } + + base::test::TaskEnvironment task_environment_; + std::unique_ptr<optimization_guide::TestOptimizationGuideModelProvider> + optimization_guide_model_provider_; + std::unique_ptr<test::TestSegmentInfoDatabase> segment_database_; +}; + +TEST_F(ModelExecutionManagerFactoryTest, CreateModelExecutionManager) { + auto model_execution_manager = CreateModelExecutionManager( + optimization_guide_model_provider_.get(), + task_environment_.GetMainThreadTaskRunner(), + {OptimizationTarget::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB}, + segment_database_.get()); + // This should work regardless of whether a DummyModelExecutionManager or + // ModelExecutionManagerImpl is returned. + CHECK(model_execution_manager); +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/execution/model_execution_manager_impl_unittest.cc b/components/segmentation_platform/internal/execution/model_execution_manager_impl_unittest.cc index 8e4771e..14ce24e 100644 --- a/components/segmentation_platform/internal/execution/model_execution_manager_impl_unittest.cc +++ b/components/segmentation_platform/internal/execution/model_execution_manager_impl_unittest.cc
@@ -33,7 +33,8 @@ void TearDown() override { model_execution_manager_.reset(); - // Allow for the background class to be destroyed. + // Allow for the SegmentationModelExecutor owned by SegmentationModelHandler + // to be destroyed. RunUntilIdle(); }
diff --git a/components/segmentation_platform/internal/execution/segmentation_model_executor_unittest.cc b/components/segmentation_platform/internal/execution/segmentation_model_executor_unittest.cc index 6e1d004..693360ce 100644 --- a/components/segmentation_platform/internal/execution/segmentation_model_executor_unittest.cc +++ b/components/segmentation_platform/internal/execution/segmentation_model_executor_unittest.cc
@@ -56,7 +56,8 @@ void ResetModelExecutor() { model_executor_handle_.reset(); - // Allow for the background class to be destroyed. + // Allow for the SegmentationModelExecutor owned by SegmentationModelHandler + // to be destroyed. RunUntilIdle(); }
diff --git a/components/segmentation_platform/internal/proto/BUILD.gn b/components/segmentation_platform/internal/proto/BUILD.gn index 5b274d8..738a2edc7 100644 --- a/components/segmentation_platform/internal/proto/BUILD.gn +++ b/components/segmentation_platform/internal/proto/BUILD.gn
@@ -10,6 +10,7 @@ "aggregation.proto", "model_metadata.proto", "model_prediction.proto", + "signal.proto", ] link_deps =
diff --git a/components/segmentation_platform/internal/proto/signal.proto b/components/segmentation_platform/internal/proto/signal.proto new file mode 100644 index 0000000..2273bbd6 --- /dev/null +++ b/components/segmentation_platform/internal/proto/signal.proto
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; +option optimize_for = LITE_RUNTIME; + +package segmentation_platform.proto; + +// Represents the signal data collected during a certain time range. +message SignalData { + // The list of samples during the time range. + repeated Sample samples = 1; +} + +// Represents the signal data sample for a single timestamp. +message Sample { + // The value of the histogram sample. Not provided for user actions. + optional int32 value = 1; + + // Timestamp relative to the start of the UTC day. This results in a smaller + // value which can be efficiently stored in the proto. + optional int32 time_sec_delta = 2; +}
diff --git a/components/signin/public/identity_manager/identity_manager_builder.h b/components/signin/public/identity_manager/identity_manager_builder.h index 26818a57..0b9b301 100644 --- a/components/signin/public/identity_manager/identity_manager_builder.h +++ b/components/signin/public/identity_manager/identity_manager_builder.h
@@ -20,9 +20,7 @@ #include "base/callback.h" #endif -class AccountTrackerService; class PrefService; -class ProfileOAuth2TokenService; class SigninClient; #if !defined(OS_ANDROID) @@ -66,14 +64,12 @@ AccountConsistencyMethod account_consistency = AccountConsistencyMethod::kDisabled; - std::unique_ptr<AccountTrackerService> account_tracker_service; std::unique_ptr<image_fetcher::ImageDecoder> image_decoder; PrefService* local_state = nullptr; network::NetworkConnectionTracker* network_connection_tracker; PrefService* pref_service = nullptr; base::FilePath profile_path; SigninClient* signin_client = nullptr; - std::unique_ptr<ProfileOAuth2TokenService> token_service; #if !defined(OS_ANDROID) bool delete_signin_cookies_on_exit = false;
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 5e9ae8e..58d8c089 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Kort kant eerste</translation> <translation id="168693727862418163">Hierdie beleidwaarde kon nie teen die skema bekragtig word nie en sal geïgnoreer word.</translation> <translation id="168841957122794586">Die bedienersertifikaat bevat 'n swak kriptografiese sleutel.</translation> -<translation id="1696290444144917273">Bekyk virtuele kaart se besonderhede</translation> <translation id="1697532407822776718">Als is nou reg!</translation> <translation id="1699570257714336246">Inligting ontbreek</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Brosjuremaker</translation> <translation id="5316812925700871227">Draai antikloksgewys</translation> <translation id="5317780077021120954">Berg</translation> -<translation id="5321288445143113935">Gemaksimeer</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> uit <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Kies kontakinligting</translation> <translation id="5327248766486351172">Naam</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index d77f0260..161e765a 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">አጭር ጠርዝ መጀመሪያ</translation> <translation id="168693727862418163">ይህ የመመሪያ እሴት ከዕቅዱ ጋር ሲተያይ ማረጋገጥ አልቻለም፣ እና ችላ ይባላል።</translation> <translation id="168841957122794586">የአገልጋይ እውቅና ማረጋገጫው ደካማ የሆነ ባለስውር መረጃ ቁልፍ ነው ያለው።</translation> -<translation id="1696290444144917273">ምናባዊ የካርድ ዝርዝሮችን ይመልከቱ</translation> <translation id="1697532407822776718">በቃ ጨርሰዋል!</translation> <translation id="1699570257714336246">መረጃ ይጎድላል</translation> <translation id="1703835215927279855">ደብዳቤ</translation> @@ -1200,7 +1199,6 @@ <translation id="5314967030527622926">የአነሰተኛ መጽሐፍ መሥሪያ</translation> <translation id="5316812925700871227">በተቃራኒ ሰዓት አቅጣጫ አሽከርክር</translation> <translation id="5317780077021120954">አስቀምጥ</translation> -<translation id="5321288445143113935">ሰፍቷል</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />፣ <ph name="MATCH_POSITION" /> ከ<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">የእውቂያ መረጃ ይምረጡ</translation> <translation id="5327248766486351172">ስም</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 484ee12d..1e5e78e 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">حافة قصيرة أولًا</translation> <translation id="168693727862418163">تعذّر التحقُّق من قيمة السياسة هذه وفقًا لمخططها وسيتم تجاهلها.</translation> <translation id="168841957122794586">تحتوي شهادة الخادم على مفتاح ترميز ضعيف.</translation> -<translation id="1696290444144917273">عرض تفاصيل البطاقة الافتراضية</translation> <translation id="1697532407822776718">أنت الآن على أتم استعداد.</translation> <translation id="1699570257714336246">معلومات غير متوفرة</translation> <translation id="1703835215927279855">خطاب</translation> @@ -1204,7 +1203,6 @@ <translation id="5314967030527622926">أداة إنشاء الكتيبات</translation> <translation id="5316812925700871227">تدوير عكس اتجاه عقارب الساعة</translation> <translation id="5317780077021120954">حفظ</translation> -<translation id="5321288445143113935">نافذة كبيرة الحجم</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />، <ph name="MATCH_POSITION" /> من <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">اختيار معلومات الاتصال</translation> <translation id="5327248766486351172">الاسم</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 57371f2..f832f292 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">চুটি কাষটো প্ৰথমে</translation> <translation id="168693727862418163">এই নীতিৰ মানটোৱে ইয়াৰ স্কীমাৰ বিৰুদ্ধে সত্যাপন কৰিব নোৱাৰিলে আৰু ইয়াক উপেক্ষা কৰা হ’ব।</translation> <translation id="168841957122794586">ছার্ভাৰ প্ৰমাণপত্ৰখনত এটা দুৰ্বল ক্ৰিপ্টগ্ৰাফিক কী আছে।</translation> -<translation id="1696290444144917273">ভাৰ্ছুৱেল কাৰ্ডৰ সবিশেষ চাওক</translation> <translation id="1697532407822776718">আপুনি সম্পূৰ্ণ সাজু!</translation> <translation id="1699570257714336246">তথ্য নাই</translation> <translation id="1703835215927279855">লেটাৰ</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">বুকলেট প্ৰস্তুত কৰোঁতা</translation> <translation id="5316812925700871227">ঘড়ীৰ কাঁটাৰ বিপৰীত দিশত ঘূৰাওক</translation> <translation id="5317780077021120954">ছেভ কৰক</translation> -<translation id="5321288445143113935">আকাৰ বিস্তাৰিত কৰা হ'ল</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" />ৰ <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">সম্পর্কৰ তথ্য বাছনি কৰক</translation> <translation id="5327248766486351172">নাম</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 9512416..5fc3cf5 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Qısa kənar əvvəldə</translation> <translation id="168693727862418163">Bu siyasət dəyəri sxem əsasında doğrulanmadı və nəzərə alınmayacaq.</translation> <translation id="168841957122794586">Server sertifikatının kriptoqrafik açarı zəifdir.</translation> -<translation id="1696290444144917273">Virtual kart detallarına baxın</translation> <translation id="1697532407822776718">Hər şey hazırdır!</translation> <translation id="1699570257714336246">Əskik məlumat var</translation> <translation id="1703835215927279855">Letter</translation> @@ -312,6 +311,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Bu kontrol aktiv olduqda və status "aktiv" olduğu zaman Chrome axtarış fəaliyyətinizin ən çox bənzədiyi çox iştirakçısı olan qrupu, yaxud "kohortu" müəyyən edir. Reklamçılar qrup üçün reklamlar seçə bilər və axtarış fəaliyyətiniz cihazınızda məxfi saxlanılır. Qrupunuz hər gün yenilənir.}=1{Bu kontrol aktiv olduqda və status "aktiv" olduğu zaman Chrome axtarış fəaliyyətinizin ən çox bənzədiyi çox iştirakçısı olan qrupu, yaxud "kohortu" müəyyən edir. Reklamçılar qrup üçün reklamlar seçə bilər və axtarış fəaliyyətiniz cihazınızda məxfi saxlanılır. Qrupunuz hər gün yenilənir.}other{Bu kontrol aktiv olduqda və status "aktiv" olduğu zaman Chrome axtarış fəaliyyətinizin ən çox bənzədiyi çox iştirakçısı olan qrupu, yaxud "kohortu" müəyyən edir. Reklamçılar qrup üçün reklamlar seçə bilər və axtarış fəaliyyətiniz cihazınızda məxfi saxlanılır. Qrupunuz {NUM_DAYS} gündən bir yenilənir.}}</translation> <translation id="2053553514270667976">Poçt indeksi</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 təklif}other{# təklif}}</translation> +<translation id="2071156619270205202">Bu kart virtual kart nömrəsi üçün uyğun deyil.</translation> <translation id="2071692954027939183">Bildirişlərə adətən icazə vermədiyinizə görə onlar avtomatik olaraq bloklanıb</translation> <translation id="2079545284768500474">Geri qaytarın</translation> <translation id="20817612488360358">Sistem proksi ayarları işlənməyə ayarlanıb, lakin açıq proksi sazlanması da bəlirlənib.</translation> @@ -440,9 +440,11 @@ <translation id="2521385132275182522">Aşağı sağdan ştapel vurun</translation> <translation id="2523886232349826891">Yalnız bu cihaz yadda saxlanıldı</translation> <translation id="2524461107774643265">Ətraflı Məlumat Əlavə Edin</translation> +<translation id="2529899080962247600">Bu sahədə maksimum <ph name="MAX_ITEMS_LIMIT" /> daxiletmə olmalıdır. Bundan sonrakı daxiletmələr nəzərə alınmayacaq.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{və daha 1}other{and daha #}}</translation> <translation id="2536110899380797252">Ünvan Əlavə Edin</translation> <translation id="2539524384386349900">Aşkarlayın</translation> +<translation id="2540701853218677861">Zaman nişanı və uğursuz cəhdlər daxil olmaqla cihaz giriş/çıxış tarixçəsi</translation> <translation id="2541219929084442027">Bütün Anonim tabları bağladıqdan sonra Anonim rejimdə baxdığınız səhifələr brauzerinizin tarixçəsində, kuki yaddaşında və ya axtarış tarixçəsində saxlanılmayacaq. Endirdiyiniz və ya əlfəcin yaratdığınız fayllar isə saxlanılacaq.</translation> <translation id="2544644783021658368">Tək sənəd</translation> <translation id="254947805923345898">Siyasət dəyəri düzgün deyil.</translation> @@ -633,6 +635,7 @@ <translation id="3320021301628644560">Və faktura ünvanı</translation> <translation id="3324983252691184275">Tünd-qırmızı</translation> <translation id="3329013043687509092">Saturasiya</translation> +<translation id="3333762389743153920">Virtual kart üçün uyğun deyil</translation> <translation id="3338095232262050444">Güvənli</translation> <translation id="3355823806454867987">Proksi ayarlarını dəyişin...</translation> <translation id="3360103848165129075">Ödəniş səhifəsi</translation> @@ -764,6 +767,7 @@ <translation id="3754210790023674521">Şəkildə şəkil rejimindən çıxın</translation> <translation id="3759461132968374835">Xəbər verdiyiniz qəza yoxdur. Qəza haqqında hesabat deaktiv edildikdə baş verən qəzalar burada görünmür.</translation> <translation id="3760561303380396507">CVC əvəzinə Windows Hello istifadə edilsin?</translation> +<translation id="3761171036307311438">Kartdakı ad:</translation> <translation id="3761718714832595332">Statusu gizlədin</translation> <translation id="3765032636089507299">Təhlükəsiz Axtarış səhifəsi yenidən hazırlanır.</translation> <translation id="3765588406864124894">Poçt qutusu 9</translation> @@ -1142,6 +1146,7 @@ <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Kartı təsdiq edin</translation> <translation id="5135404736266831032">Ünvanları idarə edin...</translation> +<translation id="5138014172396933048">Virtual kart hazırda əlçatan deyil, bankınızla əlaqə saxlayın</translation> <translation id="5138227688689900538">Daha azına baxın</translation> <translation id="514010763713772514">Növbəti dəfə daha sürətli ödəniş edin</translation> <translation id="5145883236150621069">Xəta kodu siyasət cavabında mövcuddur</translation> @@ -1188,6 +1193,7 @@ <translation id="5287240709317226393">Kukilərə baxın</translation> <translation id="5287456746628258573">Bu sayt vaxtı keçmiş təhlükəsizlik konfiqurasiyasından istifadə edir və bu da sayta göndərilən məlumatınızın (məsələn, parol və ya kredit kartı nömrəsi) yayılmasına səbəb ola bilər.</translation> <translation id="5288108484102287882">Siyasət dəyərlərinin doğrulanması haqqında xəbərdarlıq var</translation> +<translation id="5288808348893593856">Chrome sizə əksini bildirmədiyi halda saytınızın bağlantısı təhlükəsizdir</translation> <translation id="5289384342738547352">Çoxsaylı sənədin idarə edilməsi</translation> <translation id="5299298092464848405">Siyasət təhlili xətası</translation> <translation id="5300589172476337783">Göstərin</translation> @@ -1198,7 +1204,6 @@ <translation id="5314967030527622926">Buklet düzəldən</translation> <translation id="5316812925700871227">Saat əqrəbinin əksi istiqamətində fırladın</translation> <translation id="5317780077021120954">Yadda saxlayın</translation> -<translation id="5321288445143113935">Böyüdülüb</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Kontakt Məlumatı seçin</translation> <translation id="5327248766486351172">Ad</translation> @@ -1550,9 +1555,11 @@ <translation id="6685834062052613830">Çıxın və quraşdırmanı tamamlayın</translation> <translation id="6687335167692595844">Şrift ölçüsü üzrə sorğu göndərildi</translation> <translation id="6688743156324860098">Güncəlləmə…</translation> +<translation id="6688775486821967877">Virtual kart hazırda əlçatan deyil, sonra yenidən cəhd edin</translation> <translation id="6689249931105087298">Qara nöqtə sıxılması ilə nisbi</translation> <translation id="6689271823431384964">Daxil olduğunuza görə Chrome kartları Google Hesabında yadda saxlamağı təklif edir. Bunu ayarlarda dəyişə bilərsiniz. Kart sahibinin adı hesabınızdan götürülüb.</translation> <translation id="6698381487523150993">Yaradılıb:</translation> +<translation id="6699188552522342100">Bu vebsayt doğrudur?</translation> <translation id="6702919718839027939">Təqdim edin</translation> <translation id="6710213216561001401">Əvvəlki</translation> <translation id="6710594484020273272"><Axtarış sözünü yazın></translation> @@ -2057,6 +2064,7 @@ <ph name="LIST_ITEM" />Kukilər və sayt datası <ph name="END_LIST" /></translation> <translation id="8574899947864779331">Kartları daha sürətli təsdiqləmək üçün Toxunuş İD'si istifadə edin</translation> +<translation id="8577348305244205642">Virtual kart əlçatan deyil</translation> <translation id="858637041960032120">Telefon nömrəsi əlavə edin</translation> <translation id="8589998999637048520">Ən yüksək keyfiyyət</translation> <translation id="8600271352425265729">Yalnız bu dəfə</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index d0cee23..03ac7b0 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Спачатку кароткі край</translation> <translation id="168693727862418163">Не ўдалося пацвердзіць адпаведнасць значэння палітыкі схеме, таму яно будзе ігнаравацца.</translation> <translation id="168841957122794586">У сертыфіката сервера слабы крыптаграфічны ключ.</translation> -<translation id="1696290444144917273">Паглядзець рэквізіты віртуальнай карткі</translation> <translation id="1697532407822776718">Усё гатова!</translation> <translation id="1699570257714336246">Звесткі адсутнічаюць</translation> <translation id="1703835215927279855">Letter</translation> @@ -1209,7 +1208,6 @@ <translation id="5314967030527622926">Стварэнне брашур</translation> <translation id="5316812925700871227">Павярнуць супраць гадзіннікавай стрэлкі</translation> <translation id="5317780077021120954">Захаваць</translation> -<translation id="5321288445143113935">Максімальны памер</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> з <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Выбраць кантактныя звесткі</translation> <translation id="5327248766486351172">Імя</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 4c58472..77f2b09 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Късата страна напред</translation> <translation id="168693727862418163">Стойността на това правило не бе потвърдена спрямо съответната схема и ще бъде пренебрегната.</translation> <translation id="168841957122794586">Сертификатът на сървъра съдържа слаб криптографски ключ.</translation> -<translation id="1696290444144917273">Преглед на данните за виртуалната карта</translation> <translation id="1697532407822776718">Готово!</translation> <translation id="1699570257714336246">Липсва информация</translation> <translation id="1703835215927279855">Letter</translation> @@ -1206,7 +1205,6 @@ <translation id="5314967030527622926">Дизайнер на брошури</translation> <translation id="5316812925700871227">Завъртане обратно на часовниковата стрелка</translation> <translation id="5317780077021120954">Запазване</translation> -<translation id="5321288445143113935">Увеличено</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> от <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Избиране на информация за връзка</translation> <translation id="5327248766486351172">Име</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 5cd59b2..f357d0c3 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">আগে ছোট প্রান্ত</translation> <translation id="168693727862418163">এই নীতির মান সেটির স্কিমার সাথে যাচাই করা যায়নি, তাই সেটি উপেক্ষা করা হবে।</translation> <translation id="168841957122794586">সার্ভার সার্টিফিকেটে একটি দুর্বল ক্রিপ্টোগ্রাফিক কী আছে৷</translation> -<translation id="1696290444144917273">ভার্চুয়াল কার্ডের বিবরণ দেখুন</translation> <translation id="1697532407822776718">আপনার সমস্ত সেট আছে!</translation> <translation id="1699570257714336246">সম্পূর্ণ তথ্য দেওয়া হয়নি</translation> <translation id="1703835215927279855">Letter</translation> @@ -1205,7 +1204,6 @@ <translation id="5314967030527622926">বুকলেট প্রস্তুতকারী</translation> <translation id="5316812925700871227">ঘড়ির কাঁটার বিপরীত দিকে ঘোরান</translation> <translation id="5317780077021120954">সেভ করুন</translation> -<translation id="5321288445143113935">বড় করা হয়েছে</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> এর মধ্যে <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">পরিচিতির তথ্য বেছে নিন</translation> <translation id="5327248766486351172">নাম</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 668adacb02..c4a6594a 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Najprije kratka strana</translation> <translation id="168693727862418163">Vrijednost ovog pravila u odnosu na njegovu šemu nije potvrđena pa će biti zanemareno.</translation> <translation id="168841957122794586">Potvrda servera sadrži slab kriptografski ključ.</translation> -<translation id="1696290444144917273">Pogledajte detalje virtuelne kartice</translation> <translation id="1697532407822776718">Sve je spremno!</translation> <translation id="1699570257714336246">Podaci nedostaju</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Alat za brošure</translation> <translation id="5316812925700871227">Zakretanje u suprotnom smjeru od kazaljke na satu</translation> <translation id="5317780077021120954">Sačuvaj</translation> -<translation id="5321288445143113935">Maksimizirano</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> od <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Odaberi kontakt informacije</translation> <translation id="5327248766486351172">Ime</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index c344113..2a09d88 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">La vora curta primer</translation> <translation id="168693727862418163">No s'ha pogut validar el valor d'aquesta política comparant-lo amb l'esquema i, per tant, s'ignorarà.</translation> <translation id="168841957122794586">El certificat de servidor conté una clau criptogràfica dèbil.</translation> -<translation id="1696290444144917273">Mostra les dades de la targeta virtual</translation> <translation id="1697532407822776718">Ja estàs a punt!</translation> <translation id="1699570257714336246">Falta informació</translation> <translation id="1703835215927279855">Letter</translation> @@ -1199,7 +1198,6 @@ <translation id="5314967030527622926">Creador de fullets</translation> <translation id="5316812925700871227">Gira en sentit antihorari</translation> <translation id="5317780077021120954">Desa</translation> -<translation id="5321288445143113935">Maximitzada</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Tria la informació de contacte</translation> <translation id="5327248766486351172">Nom</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 63437738..815c118 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Krátkou hranou napřed</translation> <translation id="168693727862418163">Hodnotu zásady se nepodařilo ověřit proti schématu a bude ignorována.</translation> <translation id="168841957122794586">Certifikát serveru obsahuje slabý kryptografický klíč.</translation> -<translation id="1696290444144917273">Zobrazit podrobnosti o virtuální kartě</translation> <translation id="1697532407822776718">Vše je nastaveno!</translation> <translation id="1699570257714336246">Některé informace chybí</translation> <translation id="1703835215927279855">Letter</translation> @@ -1194,7 +1193,6 @@ <translation id="5314967030527622926">Brožura</translation> <translation id="5316812925700871227">Otočit proti směru hodinových ručiček</translation> <translation id="5317780077021120954">Uložit</translation> -<translation id="5321288445143113935">Maximalizováno</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> z <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Vybrat kontaktní údaje</translation> <translation id="5327248766486351172">Jméno</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 8bbc4dd..5242fa6 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Kort kant først</translation> <translation id="168693727862418163">Politikkens værdi blev ikke bekræftet i forhold til dens skema, og den ignoreres derfor.</translation> <translation id="168841957122794586">Servercertifikatet indeholder en svag kryptografisk nøgle.</translation> -<translation id="1696290444144917273">Se virtuelle kortoplysninger</translation> <translation id="1697532407822776718">Fuldført</translation> <translation id="1699570257714336246">Der mangler oplysninger</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Brochureværktøj</translation> <translation id="5316812925700871227">Rotér mod uret</translation> <translation id="5317780077021120954">Gem</translation> -<translation id="5321288445143113935">Maksimeret</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> af <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Vælg kontaktoplysninger</translation> <translation id="5327248766486351172">Navn</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index a130e0d..9aa237c2 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Kurze Seite zuerst</translation> <translation id="168693727862418163">Die Richtlinienwertprüfung des Schemas ist fehlgeschlagen. Der Richtlinienwert wird ignoriert.</translation> <translation id="168841957122794586">Das Serverzertifikat weist einen schwachen kryptografischen Schlüssel auf.</translation> -<translation id="1696290444144917273">Details der virtuellen Karte anzeigen</translation> <translation id="1697532407822776718">Fertig!</translation> <translation id="1699570257714336246">Fehlende Informationen</translation> <translation id="1703835215927279855">Letter</translation> @@ -1197,7 +1196,6 @@ <translation id="5314967030527622926">Falzmaschine</translation> <translation id="5316812925700871227">Gegen den Uhrzeigersinn drehen</translation> <translation id="5317780077021120954">Speichern</translation> -<translation id="5321288445143113935">Maximiert</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> von <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Kontaktdaten auswählen</translation> <translation id="5327248766486351172">Name</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 3ff6363b..9770ce9 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Πρώτα η μικρή πλευρά</translation> <translation id="168693727862418163">Αυτή η τιμή πολιτικής δεν επικυρώθηκε με επιτυχία έναντι του σχήματός της και θα παραβλεφθεί.</translation> <translation id="168841957122794586">Το πιστοποιητικό διακομιστή περιέχει ένα αδύναμο κρυπτογραφικό κλειδί.</translation> -<translation id="1696290444144917273">Προβολή λεπτομερειών εικονικής κάρτας</translation> <translation id="1697532407822776718">Είστε έτοιμοι!</translation> <translation id="1699570257714336246">Λείπουν πληροφορίες</translation> <translation id="1703835215927279855">Letter</translation> @@ -1213,7 +1212,6 @@ <translation id="5314967030527622926">Εργαλείο δημιουργίας φυλλαδίων</translation> <translation id="5316812925700871227">Περιστροφή προς τα αριστερά</translation> <translation id="5317780077021120954">Αποθήκευση</translation> -<translation id="5321288445143113935">Μεγιστοποιημένη</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> από <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Επιλογή στοιχείων επικοινωνίας</translation> <translation id="5327248766486351172">Όνομα</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 59416ba..1b0e267d 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Short edge first</translation> <translation id="168693727862418163">This policy value failed to validate against its schema and will be ignored.</translation> <translation id="168841957122794586">The server certificate contains a weak cryptographic key.</translation> -<translation id="1696290444144917273">View virtual card details</translation> <translation id="1697532407822776718">You're all set!</translation> <translation id="1699570257714336246">Information missing</translation> <translation id="1703835215927279855">Letter</translation> @@ -1209,7 +1208,6 @@ <translation id="5314967030527622926">Booklet maker</translation> <translation id="5316812925700871227">Rotate Anti-clockwise</translation> <translation id="5317780077021120954">Save</translation> -<translation id="5321288445143113935">Maximised</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> of <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Choose contact info</translation> <translation id="5327248766486351172">Name</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index a90cd5d..84f3cfee 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Borde corto primero</translation> <translation id="168693727862418163">No se pudo validar el valor de esta política con su esquema y, por lo tanto, se ignorará.</translation> <translation id="168841957122794586">El certificado del servidor contiene una clave criptográfica no segura.</translation> -<translation id="1696290444144917273">Ver detalles de la tarjeta virtual</translation> <translation id="1697532407822776718">¡Listo!</translation> <translation id="1699570257714336246">Falta información</translation> <translation id="1703835215927279855">Letter</translation> @@ -1200,7 +1199,6 @@ <translation id="5314967030527622926">Creador de cuadernillos</translation> <translation id="5316812925700871227">Girar a la izquierda</translation> <translation id="5317780077021120954">Guardar</translation> -<translation id="5321288445143113935">Maximizado</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Seleccionar información de contacto</translation> <translation id="5327248766486351172">Nombre</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 3be786e7..53d0a57 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Borde corto primero</translation> <translation id="168693727862418163">No se ha podido validar el valor de esta política con su esquema y se ignorará.</translation> <translation id="168841957122794586">El certificado del servidor contiene una clave criptográfica no segura.</translation> -<translation id="1696290444144917273">Ver los detalle de la tarjeta virtual</translation> <translation id="1697532407822776718">¡Listo!</translation> <translation id="1699570257714336246">Falta información</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Creación de cuadernillo</translation> <translation id="5316812925700871227">Girar hacia la izquierda</translation> <translation id="5317780077021120954">Guardar</translation> -<translation id="5321288445143113935">Maximizada</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Seleccionar información de contacto</translation> <translation id="5327248766486351172">Nombre</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index e6228c3..cdf553b 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Lühem serv enne</translation> <translation id="168693727862418163">Seda reegli väärtust ei õnnestunud skeemiga võrdluses kinnitada ja seda eiratakse.</translation> <translation id="168841957122794586">Serveri sertifikaat sisaldab nõrka krüptograafilist võtit.</translation> -<translation id="1696290444144917273">Virtuaalkaardi üksikasjade kuvamine</translation> <translation id="1697532407822776718">Kõik on valmis!</translation> <translation id="1699570257714336246">Teave on puudu</translation> <translation id="1703835215927279855">Letter</translation> @@ -1209,7 +1208,6 @@ <translation id="5314967030527622926">Brošüürilooja</translation> <translation id="5316812925700871227">Pööra vastupäeva</translation> <translation id="5317780077021120954">Salvesta</translation> -<translation id="5321288445143113935">Maksimeeritud</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Valige kontaktteave</translation> <translation id="5327248766486351172">Nimi</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 7bbd629..d2ae840 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Ertz laburra lehenbizi</translation> <translation id="168693727862418163">Ezin izan da baliozkotu gidalerroaren balioa haren eskemarekin, eta ez ikusi egingo zaio.</translation> <translation id="168841957122794586">Zerbitzariaren ziurtagiriak okerreko gako kriptografikoa du.</translation> -<translation id="1696290444144917273">Ikusi txartel birtualaren xehetasunak</translation> <translation id="1697532407822776718">Prest zaude!</translation> <translation id="1699570257714336246">Informazioa falta da</translation> <translation id="1703835215927279855">Letter</translation> @@ -1195,7 +1194,6 @@ <translation id="5314967030527622926">Koadernagailua</translation> <translation id="5316812925700871227">Biratu ezkerretara</translation> <translation id="5317780077021120954">Gorde</translation> -<translation id="5321288445143113935">Maximizatuta</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> partidatik <ph name="MATCH_POSITION" />garrena</translation> <translation id="5324080437450482387">Aukeratu harremanetarako informazioa</translation> <translation id="5327248766486351172">Izena</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 280efa1..695881b 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">ابتدا لبه کوتاه</translation> <translation id="168693727862418163">این مقدار خطمشی در رابطه با طرح آن تأیید نشده است و نادیده گرفته میشود.</translation> <translation id="168841957122794586">گواهینامه سرور دارای یک کلید رمزنگاری ضعیف است.</translation> -<translation id="1696290444144917273">مشاهده جزئیات کارت مجازی</translation> <translation id="1697532407822776718">همه چیز مرتب است.</translation> <translation id="1699570257714336246">اطلاعات از دست میرود</translation> <translation id="1703835215927279855">Letter</translation> @@ -1208,7 +1207,6 @@ <translation id="5314967030527622926">دفترچهساز</translation> <translation id="5316812925700871227">چرخش خلاف جهت عقربههای ساعت</translation> <translation id="5317780077021120954">ذخیره</translation> -<translation id="5321288445143113935">بزرگترین اندازه</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> از <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">انتخاب اطلاعات تماس</translation> <translation id="5327248766486351172">نام</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index c8f79400..199351b 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Lyhyt reuna ensin</translation> <translation id="168693727862418163">Tämän käytännön arvon ei onnistunut vahvistamaan kaavaa ja se ohitetaan.</translation> <translation id="168841957122794586">Palvelinvarmenne sisältää heikon salausavaimen.</translation> -<translation id="1696290444144917273">Näytä virtuaalisen kortin tiedot</translation> <translation id="1697532407822776718">Kaikki on valmista.</translation> <translation id="1699570257714336246">Tietoja puuttuu</translation> <translation id="1703835215927279855">Kirje</translation> @@ -1211,7 +1210,6 @@ <translation id="5314967030527622926">Vihko</translation> <translation id="5316812925700871227">Käännä vastapäivään</translation> <translation id="5317780077021120954">Tallenna</translation> -<translation id="5321288445143113935">Suurennettu</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Valitse yhteystiedot</translation> <translation id="5327248766486351172">Nimi</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 5d4ec69..00c01bc 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Short edge muna</translation> <translation id="168693727862418163">Hindi na-validate ang value ng patakarang ito sa schema nito at babalewalain ito.</translation> <translation id="168841957122794586">Naglalaman ang server certificate ng isang mahinang cryptographic key.</translation> -<translation id="1696290444144917273">Tingnan ang mga detalye ng virtual na card.</translation> <translation id="1697532407822776718">Handa ka na!</translation> <translation id="1699570257714336246">May nawawalang impormasyon</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Booklet maker</translation> <translation id="5316812925700871227">I-rotate pakaliwa</translation> <translation id="5317780077021120954">I-save</translation> -<translation id="5321288445143113935">Na-maximize</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> ng <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Pumili ng Impormasyon sa Pakikipag-ugnayan</translation> <translation id="5327248766486351172">Pangalan</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index c038229..5f54638 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Bord court en premier</translation> <translation id="168693727862418163">La validation de la valeur de cette politique par rapport à son schéma a échoué. La politique sera ignorée.</translation> <translation id="168841957122794586">Le certificat du serveur contient une clé de chiffrement faible.</translation> -<translation id="1696290444144917273">Afficher les renseignements de la carte virtuelle</translation> <translation id="1697532407822776718">Vous êtes prêt!</translation> <translation id="1699570257714336246">Renseignements manquants</translation> <translation id="1703835215927279855">Lettre</translation> @@ -308,6 +307,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour tous les jours.}=1{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour tous les jours.}one{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour chaque {NUM_DAYS} jour.}other{Lorsque cette commande est activée et que son état est défini à actif, Chrome détermine à quel grand groupe de personnes, ou « cohorte », votre activité de navigation récente ressemble le plus. Les annonceurs peuvent sélectionner des annonces pour le groupe, et votre activité de navigation reste privée sur votre appareil. Votre groupe est mis à jour tous les {NUM_DAYS} jours.}}</translation> <translation id="2053553514270667976">Code postal</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 suggestion}one{# suggestion}other{# suggestions}}</translation> +<translation id="2071156619270205202">Cette carte n'est pas compatible avec un numéro de carte virtuelle.</translation> <translation id="2071692954027939183">Les notifications ont été bloquées automatiquement parce que vous ne les autorisez généralement pas</translation> <translation id="2079545284768500474">Annuler</translation> <translation id="20817612488360358">Les paramètres de mandataire du système sont configurés pour être utilisés, mais une configuration de mandataire explicite est également spécifiée.</translation> @@ -436,9 +436,11 @@ <translation id="2521385132275182522">Agrafe en bas à droite</translation> <translation id="2523886232349826891">Carte enregistrée sur cet appareil uniquement</translation> <translation id="2524461107774643265">Ajouter plus de renseignements</translation> +<translation id="2529899080962247600">Ce champ ne peut pas contenir plus de <ph name="MAX_ITEMS_LIMIT" /> entrées. Toutes les entrées supplémentaires seront ignorées.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{et 1 autre}one{et # autre}other{et # autres}}</translation> <translation id="2536110899380797252">Ajouter une adresse</translation> <translation id="2539524384386349900">Détecter</translation> +<translation id="2540701853218677861">Historique de connexion et de déconnexion de l'appareil, y compris les estampilles temporelles et les tentatives infructueuses</translation> <translation id="2541219929084442027">Les pages que vous consultez dans des onglets de navigation privée ne sont pas enregistrées dans l'historique du navigateur, ni dans le dossier des témoins, ni dans l'historique des recherches, une fois que vous avez fermé tous les onglets de navigation privée. Les fichiers téléchargés et vos favoris sont toutefois conservés.</translation> <translation id="2544644783021658368">Document simple</translation> <translation id="254947805923345898">La valeur attribuée à la politique n'est pas valide.</translation> @@ -629,6 +631,7 @@ <translation id="3320021301628644560">Ajouter l'adresse de facturation</translation> <translation id="3324983252691184275">Cramoisi</translation> <translation id="3329013043687509092">Saturation</translation> +<translation id="3333762389743153920">Non admissible pour carte virtuelle</translation> <translation id="3338095232262050444">Sécuritaire</translation> <translation id="3355823806454867987">Modifier les paramètres du mandataire...</translation> <translation id="3360103848165129075">Feuille du module de traitement du paiement</translation> @@ -762,6 +765,7 @@ <translation id="3754210790023674521">Quitter le mode d'incrustation d'image</translation> <translation id="3759461132968374835">Aucune erreur n'a été signalée récemment. Les erreurs n'apparaissent ici que lorsque l'envoi de rapports d'erreur est activé.</translation> <translation id="3760561303380396507">Utiliser Windows Hello au lieu du code CVC?</translation> +<translation id="3761171036307311438">Nom figurant sur la carte :</translation> <translation id="3761718714832595332">Masquer l'état</translation> <translation id="3765032636089507299">La page de navigation sécurisée est en construction.</translation> <translation id="3765588406864124894">Boîte aux lettres 9</translation> @@ -1136,6 +1140,7 @@ <translation id="5125394840236832993">B plus</translation> <translation id="5126510351761255129">Vérifier votre carte</translation> <translation id="5135404736266831032">Gérer les adresses</translation> +<translation id="5138014172396933048">Votre carte virtuelle n'est pas accessible pour le moment, veuillez communiquer avec votre banque</translation> <translation id="5138227688689900538">Afficher moins</translation> <translation id="514010763713772514">Payer plus rapidement la prochaine fois</translation> <translation id="5145883236150621069">Code d'erreur présent dans la réponse de la politique</translation> @@ -1182,6 +1187,7 @@ <translation id="5287240709317226393">Afficher les témoins</translation> <translation id="5287456746628258573">Ce site utilise une configuration de sécurité obsolète qui pourrait exposer vos données personnelles (par exemple, vos mots de passe ou vos numéros de carte de crédit) lorsqu'elles sont envoyées à ce site.</translation> <translation id="5288108484102287882">La validation des valeurs de politique a déclenché des avertissements</translation> +<translation id="5288808348893593856">La connexion du site est sécuritaire, à moins que Chrome vous indique le contraire.</translation> <translation id="5289384342738547352">Gestion de plusieurs documents</translation> <translation id="5299298092464848405">Erreur d'analyse de politique</translation> <translation id="5300589172476337783">Afficher</translation> @@ -1192,7 +1198,6 @@ <translation id="5314967030527622926">Créateur de brochures</translation> <translation id="5316812925700871227">Faire pivoter dans le sens antihoraire</translation> <translation id="5317780077021120954">Enregistrer</translation> -<translation id="5321288445143113935">Affichée en taille maximale</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> sur <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Choisir des coordonnées</translation> <translation id="5327248766486351172">Nom</translation> @@ -1544,9 +1549,11 @@ <translation id="6685834062052613830">Déconnectez-vous et terminez la configuration</translation> <translation id="6687335167692595844">Taille de police demandée</translation> <translation id="6688743156324860098">Mettre à jour…</translation> +<translation id="6688775486821967877">La carte virtuelle n'est pas accessible en ce moment, veuillez réessayer plus tard</translation> <translation id="6689249931105087298">Valeur relative avec compression des points noirs</translation> <translation id="6689271823431384964">Chrome vous propose d'enregistrer vos cartes dans votre compte Google parce que vous y êtes connecté. Vous pouvez modifier ce comportement dans les paramètres. Le nom du détenteur de la carte provient de votre compte.</translation> <translation id="6698381487523150993">Créé :</translation> +<translation id="6699188552522342100">S'agit-il du bon site Web?</translation> <translation id="6702919718839027939">Présentation</translation> <translation id="6710213216561001401">Précédent</translation> <translation id="6710594484020273272"><Entrez un terme de recherche></translation> @@ -2051,6 +2058,7 @@ <ph name="LIST_ITEM" />Les témoins et les données relatives aux sites <ph name="END_LIST" /></translation> <translation id="8574899947864779331">Utiliser Touch ID pour vérifier les cartes plus rapidement</translation> +<translation id="8577348305244205642">Votre carte virtuelle n'est plus valide</translation> <translation id="858637041960032120">Ajouter un numéro de téléphone</translation> <translation id="8589998999637048520">Meilleure qualité</translation> <translation id="8600271352425265729">Uniquement cette fois-ci</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index f73f8fc..44ab719c 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Bord court en premier</translation> <translation id="168693727862418163">La valeur de la règle n'a pas été validée par rapport à son schéma et sera ignorée.</translation> <translation id="168841957122794586">Le certificat du serveur contient une clé de chiffrement faible.</translation> -<translation id="1696290444144917273">Afficher les informations relatives à la carte virtuelle</translation> <translation id="1697532407822776718">Vous êtes prêt !</translation> <translation id="1699570257714336246">Informations manquantes</translation> <translation id="1703835215927279855">Letter</translation> @@ -1208,7 +1207,6 @@ <translation id="5314967030527622926">Créateur de brochures</translation> <translation id="5316812925700871227">Faire pivoter vers la gauche</translation> <translation id="5317780077021120954">Enregistrer</translation> -<translation id="5321288445143113935">Taille maximale</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> sur <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Sélectionner les coordonnées</translation> <translation id="5327248766486351172">Nom</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index f300bfb..99d8e1b 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Co bordo curto primeiro</translation> <translation id="168693727862418163">Non puido cotexarse o valor desta política co seu esquema para levar a cabo a súa validación, así que se ignorará.</translation> <translation id="168841957122794586">O certificado do servidor contén unha clave criptográfica non segura.</translation> -<translation id="1696290444144917273">Ver detalles da tarxeta virtual</translation> <translation id="1697532407822776718">Listo!</translation> <translation id="1699570257714336246">Falta información</translation> <translation id="1703835215927279855">Letter</translation> @@ -311,6 +310,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Cando este control está habilitado e co estado activo, Chrome determina con que grupo grande de persoas ou "cohorte" concorda máis a túa actividade de navegación recente. Os anunciantes poden seleccionar anuncios para o grupo, e a túa actividade de navegación mantense privada no dispositivo. O teu grupo actualízase a diario.}=1{Cando este control está habilitado e co estado activo, Chrome determina con que grupo grande de persoas ou "cohorte" concorda máis a túa actividade de navegación recente. Os anunciantes poden seleccionar anuncios para o grupo, e a túa actividade de navegación mantense privada no dispositivo. O teu grupo actualízase a diario.}other{Cando este control está habilitado e co estado activo, Chrome determina con que grupo grande de persoas ou "cohorte" concorda máis a túa actividade de navegación recente. Os anunciantes poden seleccionar anuncios para o grupo, e a túa actividade de navegación mantense privada no dispositivo. O teu grupo actualízase cada {NUM_DAYS} días.}}</translation> <translation id="2053553514270667976">Código postal</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 suxestión}other{# suxestións}}</translation> +<translation id="2071156619270205202">Esta tarxeta non é apta para asociarlle un número de tarxeta virtual.</translation> <translation id="2071692954027939183">As notificacións bloqueáronse automaticamente porque non adoitas permitilas</translation> <translation id="2079545284768500474">Desfacer</translation> <translation id="20817612488360358">Estableceuse a configuración do proxy do sistema que debe utilizarse, pero tamén se especificou unha configuración de proxy explícita.</translation> @@ -439,9 +439,11 @@ <translation id="2521385132275182522">Grampa na parte inferior dereita</translation> <translation id="2523886232349826891">Gardada só neste dispositivo</translation> <translation id="2524461107774643265">Engadir máis información</translation> +<translation id="2529899080962247600">Este campo non debe ter máis de <ph name="MAX_ITEMS_LIMIT" /> entradas. Unha vez alcanzada esa cantidade, ignoraranse as demais entradas.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{e 1 máis}other{e # máis}}</translation> <translation id="2536110899380797252">Engadir enderezo</translation> <translation id="2539524384386349900">Detectar</translation> +<translation id="2540701853218677861">Historial de inicios e peches de sesión (por exemplo, marcas de tempo e intentos sen éxito)</translation> <translation id="2541219929084442027">As páxinas que ves nas pestanas do modo de incógnito non se conservarán no historial do teu navegador, no almacenamento de cookies nin no historial de busca unha vez pechadas todas as pestanas do modo de incógnito. Conservaranse todos os ficheiros que descargues ou os marcadores que crees.</translation> <translation id="2544644783021658368">Documento individual</translation> <translation id="254947805923345898">O valor da política non é válido.</translation> @@ -632,6 +634,7 @@ <translation id="3320021301628644560">Engade un enderezo de facturación</translation> <translation id="3324983252691184275">Carmesí</translation> <translation id="3329013043687509092">Saturación</translation> +<translation id="3333762389743153920">Non apta para asociarlle unha tarxeta virtual</translation> <translation id="3338095232262050444">Seguro</translation> <translation id="3355823806454867987">Cambiar configuración do proxy...</translation> <translation id="3360103848165129075">Folla do controlador de pagos</translation> @@ -765,6 +768,7 @@ <translation id="3754210790023674521">Saír do modo de pantalla superposta</translation> <translation id="3759461132968374835">Non informaches de ningún erro recentemente. Os erros producidos mentres estaban desactivados os informes de erros non aparecerán aquí.</translation> <translation id="3760561303380396507">Queres usar Windows Hello en lugar do CVC?</translation> +<translation id="3761171036307311438">Nome na tarxeta:</translation> <translation id="3761718714832595332">Ocultar estado</translation> <translation id="3765032636089507299">A páxina de navegación segura está en construción.</translation> <translation id="3765588406864124894">Caixa de correo 9</translation> @@ -1144,6 +1148,7 @@ <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Verificar a túa tarxeta</translation> <translation id="5135404736266831032">Xestiona os enderezos…</translation> +<translation id="5138014172396933048">A tarxeta virtual non está dispoñible neste intres. Ponte en contacto co teu banco</translation> <translation id="5138227688689900538">Mostrar menos</translation> <translation id="514010763713772514">Procesa a compra máis rápido a próxima vez</translation> <translation id="5145883236150621069">Código de erro presente na resposta da política</translation> @@ -1190,6 +1195,7 @@ <translation id="5287240709317226393">Mostrar cookies</translation> <translation id="5287456746628258573">Este sitio utiliza unha configuración de seguranza obsoleta que pode poñer en risco a túa información (por exemplo, contrasinais ou números de tarxetas de crédito) cando se lle envía.</translation> <translation id="5288108484102287882">A validación dos valores da política xerou advertencias</translation> +<translation id="5288808348893593856">A menos que Chrome indique o contrario, a conexión deste sitio é segura.</translation> <translation id="5289384342738547352">Manipulación de varios documentos</translation> <translation id="5299298092464848405">Erro ao analizar a política</translation> <translation id="5300589172476337783">Mostrar</translation> @@ -1200,7 +1206,6 @@ <translation id="5314967030527622926">Creador de folletos</translation> <translation id="5316812925700871227">Xirar á esquerda</translation> <translation id="5317780077021120954">Gardar</translation> -<translation id="5321288445143113935">Aplicación maximizada</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Escoller información de contacto</translation> <translation id="5327248766486351172">Nome</translation> @@ -1552,9 +1557,11 @@ <translation id="6685834062052613830">Pecha sesión e finaliza o proceso de configuración</translation> <translation id="6687335167692595844">Tamaño do tipo de letra solicitado</translation> <translation id="6688743156324860098">Actualizar…</translation> +<translation id="6688775486821967877">A tarxeta virtual non está dispoñible nestes intres. Téntao de novo máis tarde</translation> <translation id="6689249931105087298">Relativo con compresión de puntos negros</translation> <translation id="6689271823431384964">Chrome permíteche gardar as túas tarxetas na túa Conta de Google porque tes a sesión iniciada. Podes cambiar esta opción na configuración cando queiras. O nome do titular da tarxeta procede da túa conta.</translation> <translation id="6698381487523150993">Creada:</translation> +<translation id="6699188552522342100">Este sitio web é exacto?</translation> <translation id="6702919718839027939">Presentar</translation> <translation id="6710213216561001401">Anterior</translation> <translation id="6710594484020273272"><Escribe un termo de busca></translation> @@ -2059,6 +2066,7 @@ <ph name="LIST_ITEM" />As cookies e os datos dos sitios <ph name="END_LIST" /></translation> <translation id="8574899947864779331">Usar Touch ID para confirmar as tarxetas máis rápido</translation> +<translation id="8577348305244205642">A tarxeta virtual non está dispoñible</translation> <translation id="858637041960032120">Engadir número de teléfono</translation> <translation id="8589998999637048520">Calidade máxima</translation> <translation id="8600271352425265729">Só esta vez</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index b45c764..bcea69f 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">પહેલાં ટૂંકી કિનારી</translation> <translation id="168693727862418163">આ પૉલિસીનું મૂલ્ય તેના સ્કીમા સામે માન્ય કરવામાં નિષ્ફળ ગયું છે અને તેને અવગણવામાં આવશે.</translation> <translation id="168841957122794586">સર્વર પ્રમાણપત્ર એક નબળી ક્રિપ્ટોગ્રાફિક કી ધરાવે છે.</translation> -<translation id="1696290444144917273">વર્ચ્યુઅલ કાર્ડની વિગતો જુઓ</translation> <translation id="1697532407822776718">તમારું બધું સેટ છે!</translation> <translation id="1699570257714336246">માહિતી ખૂટે છે</translation> <translation id="1703835215927279855">અક્ષર</translation> @@ -1203,7 +1202,6 @@ <translation id="5314967030527622926">બુકલેટ માર્કર</translation> <translation id="5316812925700871227">ઘડિયાળની વિપરિત દિશામાં ફેરવો</translation> <translation id="5317780077021120954">સાચવો</translation> -<translation id="5321288445143113935">મોટું કર્યું</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> માંથી <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">સંપર્કની માહિતી પસંદ કરો</translation> <translation id="5327248766486351172">નામ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index 9c40f4f..c102e43 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">शॉर्ट एज फ़र्स्ट</translation> <translation id="168693727862418163">इस नीति का मान अपनी स्कीमा के हिसाब से काम नहीं कर सका और इसे अनदेखा किया जाएगा.</translation> <translation id="168841957122794586">सर्वर प्रमाणपत्र में कमज़ोर क्रिप्टोग्राफ़िक कुंजी है.</translation> -<translation id="1696290444144917273">वर्चुअल कार्ड की जानकारी देखें</translation> <translation id="1697532407822776718">आप बिल्कुल तैयार हैं!</translation> <translation id="1699570257714336246">जानकारी मौजूद नहीं है</translation> <translation id="1703835215927279855">लेटर</translation> @@ -1208,7 +1207,6 @@ <translation id="5314967030527622926">बुकलेट मेकर</translation> <translation id="5316812925700871227">घड़ी की विपरीत दिशा में घुमाएं</translation> <translation id="5317780077021120954">सेव करें</translation> -<translation id="5321288445143113935">बड़ा किया गया</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> में से <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">संपर्क जानकारी चुनें</translation> <translation id="5327248766486351172">नाम</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 86d7e00..79e1ab46 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Najprije kratki rub</translation> <translation id="168693727862418163">Ova vrijednost pravila nije uspjela potvrditi valjanost sheme i zanemarit će se.</translation> <translation id="168841957122794586">Certifikat poslužitelja sadrži slab kriptografski ključ!</translation> -<translation id="1696290444144917273">Pregledajte pojedinosti virtualne kartice</translation> <translation id="1697532407822776718">Potpuno ste spremni!</translation> <translation id="1699570257714336246">Nedostaju podaci</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Alat za izradu knjižica</translation> <translation id="5316812925700871227">Zakretanje u suprotnom smjeru od kazaljke na satu</translation> <translation id="5317780077021120954">Spremi</translation> -<translation id="5321288445143113935">Povećano do maksimuma</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> od <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Odaberite podatke za kontakt</translation> <translation id="5327248766486351172">Naziv</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 07f7222..41264c6 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Rövid él először</translation> <translation id="168693727862418163">A házirend értéke nem egyezik a sémájával, ezért a rendszer figyelmen kívül hagyja.</translation> <translation id="168841957122794586">A szervertanúsítvány gyenge titkosítási kulcsot tartalmaz.</translation> -<translation id="1696290444144917273">Virtuális kártya adatainak megtekintése</translation> <translation id="1697532407822776718">Máris elkészült!</translation> <translation id="1699570257714336246">Hiányzó információ</translation> <translation id="1703835215927279855">Letter</translation> @@ -1206,7 +1205,6 @@ <translation id="5314967030527622926">Brosúrakészítő</translation> <translation id="5316812925700871227">Forgatás balra</translation> <translation id="5317780077021120954">Mentés</translation> -<translation id="5321288445143113935">Teljes méretű</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> elemből a következő pozícióban: <ph name="MATCH_POSITION" />.</translation> <translation id="5324080437450482387">Kapcsolatfelvételi adatok kiválasztása</translation> <translation id="5327248766486351172">Név</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 4c2eb50e..ae1bdaa3 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Կարճ եզրից սկսած</translation> <translation id="168693727862418163">Կանոնը կանտեսվի, քանի որ դրա արժեքը չի համապատասխանում սխեմային։</translation> <translation id="168841957122794586">Սերվերի վկայագիրը թույլ գաղտնագրման բանալի ունի:</translation> -<translation id="1696290444144917273">Դիտել վիրտուալ քարտի տվյալները</translation> <translation id="1697532407822776718">Տեղակայումը բարեհաջող ավարտված է:</translation> <translation id="1699570257714336246">Տեղեկություններ չկան</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Բուկլետ պատրաստելու գործիք</translation> <translation id="5316812925700871227">Պտտել ժամացույցի սլաքի հակառակ ուղղությամբ</translation> <translation id="5317780077021120954">Պահել</translation> -<translation id="5321288445143113935">Ծավալված պատուհան</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Ընտրեք կոնտակտային տվյալները</translation> <translation id="5327248766486351172">Անուն</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 195f07e9..a9df3e2 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Tepi pendek lebih dulu</translation> <translation id="168693727862418163">Nilai kebijakan ini gagal memvalidasi skemanya dan akan diabaikan.</translation> <translation id="168841957122794586">Sertifikat server berisi kunci kriptografis yang lemah.</translation> -<translation id="1696290444144917273">Lihat detail kartu virtual</translation> <translation id="1697532407822776718">Anda sudah siap!</translation> <translation id="1699570257714336246">Informasi tidak ada</translation> <translation id="1703835215927279855">Letter</translation> @@ -1200,7 +1199,6 @@ <translation id="5314967030527622926">Pembuat buklet</translation> <translation id="5316812925700871227">Putar berlawanan arah jarum jam</translation> <translation id="5317780077021120954">Simpan</translation> -<translation id="5321288445143113935">Dimaksimalkan</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> dari <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Pilih Info Kontak</translation> <translation id="5327248766486351172">Nama</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 25c1bed..b209aaf5 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -218,7 +218,6 @@ <translation id="1682696192498422849">Skammhlið fyrst</translation> <translation id="168693727862418163">Ekki tókst að staðfesta gildi þessarar reglu gagnvart skema hennar og hún verður hunsuð.</translation> <translation id="168841957122794586">Vottorð netþjónsins inniheldur ótraustan dulmálslykil.</translation> -<translation id="1696290444144917273">Skoða frekari upplýsingar um sýndarkort</translation> <translation id="1697532407822776718">Nú er allt tilbúið!</translation> <translation id="1699570257714336246">Upplýsingar vantar</translation> <translation id="1703835215927279855">Bréf</translation> @@ -1211,7 +1210,6 @@ <translation id="5314967030527622926">Bæklingagerð</translation> <translation id="5316812925700871227">Snúa rangsælis</translation> <translation id="5317780077021120954">Vista</translation> -<translation id="5321288445143113935">Stækkað</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> af <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Velja samskiptaupplýsingar</translation> <translation id="5327248766486351172">Heiti</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 8dbba22..38332e18 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Prima il lato corto</translation> <translation id="168693727862418163">Impossibile convalidare il valore del criterio in base al relativo schema. Il valore verrà ignorato.</translation> <translation id="168841957122794586">Il certificato del server contiene una chiave crittografica debole.</translation> -<translation id="1696290444144917273">Visualizza i dettagli della carta virtuale</translation> <translation id="1697532407822776718">Ecco fatto!</translation> <translation id="1699570257714336246">Mancano informazioni</translation> <translation id="1703835215927279855">Letter</translation> @@ -1207,7 +1206,6 @@ <translation id="5314967030527622926">Fascicola</translation> <translation id="5316812925700871227">Ruota in senso antiorario</translation> <translation id="5317780077021120954">Salva</translation> -<translation id="5321288445143113935">Ingrandita</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> di <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Scegli le informazioni di contatto</translation> <translation id="5327248766486351172">Nome</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 57aecb3..1816e4db 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">הקצה הקצר ראשון</translation> <translation id="168693727862418163">אימות ערך המדיניות הזה נכשל בבדיקה מול הסכימה והמערכת תתעלם ממנו.</translation> <translation id="168841957122794586">אישור השרת מכיל מפתח הצפנה חלש.</translation> -<translation id="1696290444144917273">הצגת הפרטים של הכרטיס הווירטואלי</translation> <translation id="1697532407822776718">הכול מוכן!</translation> <translation id="1699570257714336246">חסר מידע</translation> <translation id="1703835215927279855">Letter</translation> @@ -1212,7 +1211,6 @@ <translation id="5314967030527622926">יצירת חוברת</translation> <translation id="5316812925700871227">סיבוב נגד כיוון השעון</translation> <translation id="5317780077021120954">שמירה</translation> -<translation id="5321288445143113935">גודל מקסימלי</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> מתוך <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">בחירת פרטי איש קשר</translation> <translation id="5327248766486351172">שם</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 2838eb3e..01b28ad 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">短辺から</translation> <translation id="168693727862418163">このポリシーの値は、スキーマの検証でエラーとなったため無視されます。</translation> <translation id="168841957122794586">サーバー証明書に脆弱な暗号鍵が含まれています。</translation> -<translation id="1696290444144917273">仮想カードの詳細を表示します</translation> <translation id="1697532407822776718">設定が完了しました。</translation> <translation id="1699570257714336246">情報が不足しています</translation> <translation id="1703835215927279855">Letter</translation> @@ -1199,7 +1198,6 @@ <translation id="5314967030527622926">ブックレット メーカー</translation> <translation id="5316812925700871227">反時計回りに回転</translation> <translation id="5317780077021120954">保存</translation> -<translation id="5321288445143113935">最大化</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />、<ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">連絡作情報を選択</translation> <translation id="5327248766486351172">名前</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index dd2b859..fac7818 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">ჯერ მოკლე კიდე</translation> <translation id="168693727862418163">წესების ამ მნიშვნელობის სქემის დადასტურება ვერ მოხერხდა, ამიტომ ის უგულებელყოფილი იქნება.</translation> <translation id="168841957122794586">სერვერის სერთიფიკატი შეიცავს სუსტ კრიპტოგრაფიულ გასაღებს.</translation> -<translation id="1696290444144917273">ვირტუალური ბარათის დეტალების ნახვა</translation> <translation id="1697532407822776718">ყველაფერი დაყენებულია!</translation> <translation id="1699570257714336246">აკლია ინფორმაცია</translation> <translation id="1703835215927279855">Letter</translation> @@ -1199,7 +1198,6 @@ <translation id="5314967030527622926">ბუკლეტის შემქმნელი</translation> <translation id="5316812925700871227">საათის ისრის საწინააღმდეგოდ შემოტრიალება</translation> <translation id="5317780077021120954">შენახვა</translation> -<translation id="5321288445143113935">გაშლილი</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> / <ph name="NUM_MATCHES" />-დან</translation> <translation id="5324080437450482387">საკონტაქტო ინფორმაციის არჩევა</translation> <translation id="5327248766486351172">სახელი</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index b4814a7..2fa11271 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Алдымен қысқа беті</translation> <translation id="168693727862418163">Бұл саясат мәні осы схемаға қатысты тексерілмеді және ол еленбейді.</translation> <translation id="168841957122794586">Сервер сертификаты сенімсіз криптографиялық кілтті қамтиды.</translation> -<translation id="1696290444144917273">Виртуалды карта мәліметтерін көру</translation> <translation id="1697532407822776718">Барлығын орнаттыңыз!</translation> <translation id="1699570257714336246">Ақпарат жоқ</translation> <translation id="1703835215927279855">Letter</translation> @@ -312,6 +311,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Бұл басқару элементі қосулы болса, Chrome қызметі соңғы браузерді қолдану мәліметіңіз барынша сай келетін адамдар тобын немесе "когортаны" анықтайды. Жарнама берушілер топ үшін жарнамаларды таңдай алады және браузерді қолдану мәліметі құрылғыда құпия сақталады. Тобыңыз күн сайын жаңартылады.}=1{Бұл басқару элементі қосулы болса, Chrome қызметі соңғы браузерді қолдану мәліметіңіз барынша сай келетін адамдар тобын немесе "когортаны" анықтайды. Жарнама берушілер топ үшін жарнамаларды таңдай алады және браузерді қолдану мәліметі құрылғыда құпия сақталады. Тобыңыз күн сайын жаңартылады.}other{Бұл басқару элементі қосулы болса, Chrome қызметі соңғы браузерді қолдану мәліметіңіз барынша сай келетін адамдар тобын немесе "когортаны" анықтайды. Жарнама берушілер топ үшін жарнамаларды таңдай алады және браузерді қолдану мәліметі құрылғыда құпия сақталады. Тобыңыз әр {NUM_DAYS} күн сайын жаңартылады.}}</translation> <translation id="2053553514270667976">Пошта индексі</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 ұсыныс}other{# ұсыныс}}</translation> +<translation id="2071156619270205202">Бұл нөмір виртуалды карта нөмірі үшін жарамсыз.</translation> <translation id="2071692954027939183">Сіз әдетте хабарландыруларға рұқсат бермейтін болғандықтан, олар автоматты түрде бөгелді.</translation> <translation id="2079545284768500474">Қайтару</translation> <translation id="20817612488360358">Жүйелік прокси параметрлері пайдалану үшін орнатылған, бірақ анық прокси конфигурациясы да көрсетілген.</translation> @@ -440,9 +440,11 @@ <translation id="2521385132275182522">Төменгі оң жағын қапсыру</translation> <translation id="2523886232349826891">Тек осы құрылғыда сақталады</translation> <translation id="2524461107774643265">Қосымша ақпарат енгізу</translation> +<translation id="2529899080962247600">Бұл өрістегі жазбалардың максималды саны: <ph name="MAX_ITEMS_LIMIT" />. Қалған жазбалар еленбейтін болады.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{және тағы 1}other{және тағы #}}</translation> <translation id="2536110899380797252">Мекенжай енгізу</translation> <translation id="2539524384386349900">Анықтау</translation> +<translation id="2540701853218677861">Құрылғыға кіру/шығу тарихы, соның ішінде уақыт белгілері мен сәтсіз әрекеттер</translation> <translation id="2541219929084442027">Барлық инкогнито қойындысын жапқан соң, инкогнито қойындылары арқылы көрген беттер браузерді қолдану тарихында, cookie файлдарында немесе іздеу тарихында сақталмайды. Жүктеп алған файлдарыңыз немесе жасаған бетбелгілеріңіз сақталады.</translation> <translation id="2544644783021658368">Жалғыз құжат</translation> <translation id="254947805923345898">Саясат мәні жарамсыз.</translation> @@ -634,6 +636,7 @@ <translation id="3320021301628644560">Төлем мекенжайын қосу</translation> <translation id="3324983252691184275">Қызыл күрең</translation> <translation id="3329013043687509092">Қанықтық</translation> +<translation id="3333762389743153920">Виртуалды карта үшін жарамсыз</translation> <translation id="3338095232262050444">Қауіпсіз</translation> <translation id="3355823806454867987">Прокси параметрлерін өзгерту…</translation> <translation id="3360103848165129075">Төлем өңдегіш парағы</translation> @@ -767,6 +770,7 @@ <translation id="3754210790023674521">"Суреттегі сурет" режимінен шығу</translation> <translation id="3759461132968374835">Жақында хабарланған жаңылыстар жоқ. Жаңылыс туралы хабарлау өшірілген кезде орын алған жаңылыстар мұнда көрсетілмейді.</translation> <translation id="3760561303380396507">CVC орнына Windows Hello қолданасыз ба?</translation> +<translation id="3761171036307311438">Карта иесінің аты-жөні:</translation> <translation id="3761718714832595332">Күйін жасыру</translation> <translation id="3765032636089507299">Қауіпсіз шолу беті жасақталу үстінде.</translation> <translation id="3765588406864124894">9-шы пошта жәшігі</translation> @@ -1146,6 +1150,7 @@ <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Картаңызды растаңыз</translation> <translation id="5135404736266831032">Мекенжайларды басқару...</translation> +<translation id="5138014172396933048">Қазір виртуалды карта қолжетімсіз. Банкіңізге хабарласыңыз.</translation> <translation id="5138227688689900538">Жию</translation> <translation id="514010763713772514">Келесі жолы жылдамырақ төлеңіз</translation> <translation id="5145883236150621069">Қате коды саясат жауабында көрсетіледі</translation> @@ -1192,6 +1197,7 @@ <translation id="5287240709317226393">Cookie файлдарын көрсету</translation> <translation id="5287456746628258573">Бұл сайттың қауіпсіздік конфигурациясы ескірген. Сайтқа мәліметтер (мысалы, құпия сөздер немесе несиелік карта нөмірлері) жіберілгенде, шабуылдаушылар оларды пайдалануы мүмкін.</translation> <translation id="5288108484102287882">Саясат мәндерін тексеру кезінде бірнеше ескерту жасалды</translation> +<translation id="5288808348893593856">Сайт байланысы қауіпсіз болмаса, Chrome сізге бұл туралы хабарлайды.</translation> <translation id="5289384342738547352">Бірнеше құжатты өңдеу</translation> <translation id="5299298092464848405">Саясатты талдау қатесі</translation> <translation id="5300589172476337783">Көрсету</translation> @@ -1202,7 +1208,6 @@ <translation id="5314967030527622926">Буклет жасағыш</translation> <translation id="5316812925700871227">Сағат тілінің бағытына қарсы бұру</translation> <translation id="5317780077021120954">Сақтау</translation> -<translation id="5321288445143113935">Жайылған терезе</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Байланыс ақпаратын таңдау</translation> <translation id="5327248766486351172">Аты</translation> @@ -1554,9 +1559,11 @@ <translation id="6685834062052613830">Жүйеден шығып, орнатуды аяқтаңыз</translation> <translation id="6687335167692595844">Қаріп өлшемі сұралды</translation> <translation id="6688743156324860098">Жаңарту…</translation> +<translation id="6688775486821967877">Қазір виртуалды карта қолжетімсіз. Кейінірек қайталап көріңіз.</translation> <translation id="6689249931105087298">Қара нүктені сығуға қатысты</translation> <translation id="6689271823431384964">Сіз есептік жазбаға кіргендіктен, Chrome браузері карталарыңызды Google есептік жазбасына сақтауды ұсынып отыр. Мұны "Параметрлер" бөлімінен өзгертуіңізге болады. Карта иесінің аты-жөнін есептік жазбаңыздан алынады.</translation> <translation id="6698381487523150993">Жасалған кезі:</translation> +<translation id="6699188552522342100">Осы веб-сайттағы ақпарат дұрыс па?</translation> <translation id="6702919718839027939">Презентация</translation> <translation id="6710213216561001401">Алдыңғы</translation> <translation id="6710594484020273272"><Іздеу терминін теру></translation> @@ -2061,6 +2068,7 @@ <ph name="LIST_ITEM" />cookie файлдары және сайт деректері. <ph name="END_LIST" /></translation> <translation id="8574899947864779331">Карталарыңызды жылдам растау үшін Touch ID пайдаланыңыз.</translation> +<translation id="8577348305244205642">Виртуалды карта қолжетімсіз</translation> <translation id="858637041960032120">Телефон нөмірін қосу</translation> <translation id="8589998999637048520">Ең жақсы сапа</translation> <translation id="8600271352425265729">Тек осы жолы</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index bc5027c..8f6d781f 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -218,7 +218,6 @@ <translation id="1682696192498422849">គែមខ្លីមុនគេ</translation> <translation id="168693727862418163">តម្លៃគោលការណ៍នេះមិនត្រូវនឹងគំនូសតាងរបស់វាទេ ហើយនឹងមិនត្រូវបានអើពើទេ។</translation> <translation id="168841957122794586">វិញ្ញាបនប័ត្រម៉ាស៊ីនមេផ្ទុកសោគ្រីបខ្សោយ។</translation> -<translation id="1696290444144917273">មើលព័ត៌មានលម្អិតអំពីកាតនិម្មិត</translation> <translation id="1697532407822776718">អ្នកត្រូវបានកំណត់រួចអស់ហើយ!</translation> <translation id="1699570257714336246">បាត់ព័ត៌មាន</translation> <translation id="1703835215927279855">សំបុត្រ</translation> @@ -1214,7 +1213,6 @@ <translation id="5314967030527622926">ឧបករណ៍ធ្វើកូនសៀវភៅ</translation> <translation id="5316812925700871227">បង្វិលបញ្ច្រាសទ្រនិចនាឡិកា</translation> <translation id="5317780077021120954">រក្សាទុក</translation> -<translation id="5321288445143113935">បានពង្រីកអតិបរមា</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> ក្នុងចំណោម <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">ជ្រើសរើសព័ត៌មានទំនាក់ទំនង</translation> <translation id="5327248766486351172">ឈ្មោះ</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 95262624..edffcb5 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -216,7 +216,6 @@ <translation id="1682696192498422849">ಚಿಕ್ಕ ಅಂಚು ಮೊದಲು</translation> <translation id="168693727862418163">ಈ ನೀತಿ ಮೌಲ್ಯವನ್ನು ಅದರ ರೂಪುರೇಷೆ ವಿರುದ್ಧ ಮೌಲ್ಯೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ ಮತ್ತು ಅದನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="168841957122794586">ಸರ್ವರ್ ಪ್ರಮಾಣಪತ್ರವು ದುರ್ಬಲ ಕ್ರಿಪ್ಟೋಗ್ರಾಫಿಕ್ ಕೀಯನ್ನು ಹೊಂದಿದೆ.</translation> -<translation id="1696290444144917273">ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="1697532407822776718">ನೀವು ಎಲ್ಲ ರೀತಿಯಲ್ಲಿಯೂ ಸಿದ್ಧರಾಗಿರುವಿರಿ!</translation> <translation id="1699570257714336246">ಮಾಹಿತಿ ಕಾಣೆಯಾಗಿದೆ</translation> <translation id="1703835215927279855">Letter</translation> @@ -1192,7 +1191,6 @@ <translation id="5314967030527622926">ಬುಕ್ಲೆಟ್ ಮೇಕರ್</translation> <translation id="5316812925700871227">ಅಪ್ರದಕ್ಷಿಣವಾಗಿ ತಿರುಗಿಸು</translation> <translation id="5317780077021120954">ಉಳಿಸು</translation> -<translation id="5321288445143113935">ಗರಿಷ್ಠಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> ಗಳ <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">ಸಂಪರ್ಕ ಮಾಹಿತಿ ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="5327248766486351172">ಹೆಸರು</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 3c15a15c..39ca491 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">짧은 쪽 먼저</translation> <translation id="168693727862418163">이 정책 값은 스키마에 대해 유효성이 확인되지 않았으므로 무시됩니다.</translation> <translation id="168841957122794586">서버 인증서에 안전성이 낮은 암호화 키가 포함되어 있습니다.</translation> -<translation id="1696290444144917273">가상 카드 세부정보 보기</translation> <translation id="1697532407822776718">설정 완료</translation> <translation id="1699570257714336246">정보 누락</translation> <translation id="1703835215927279855">Letter</translation> @@ -1199,7 +1198,6 @@ <translation id="5314967030527622926">소책자 제작기</translation> <translation id="5316812925700871227">반시계 방향으로 회전</translation> <translation id="5317780077021120954">저장</translation> -<translation id="5321288445143113935">최대화</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">연락처 정보 선택</translation> <translation id="5327248766486351172">이름</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index f9346dc..81dfc29b 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Биринчи туурасы боюнча</translation> <translation id="168693727862418163">Бул саясаттын мааниси схемасына дал келбей калды, андыктан этибарга алынбайт.</translation> <translation id="168841957122794586">Сервердин тастыктамасында чабал криптографиялык ачкыч камтылган.</translation> -<translation id="1696290444144917273">Виртуалдык картанын чоо-жайын көрүү</translation> <translation id="1697532407822776718">Баары даяр!</translation> <translation id="1699570257714336246">Маалымат жетишсиз</translation> <translation id="1703835215927279855">Letter</translation> @@ -312,6 +311,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Бул көзөмөлдөө каражаты күйүк жана абалы жигердүү болгондо, Chrome акыркы көргөн вебсайттарыңыз адамдардын кайсы чоң тобуна же "когортасына" эң ылайыктуу экенин аныктайт. Жарнамачылар ал топ үчүн жарнамаларды тандай алат жана көргөн вебсайттарыңыз түзмөгүңүздө купуя сакталат. Тобуңуз күн сайын жаңыртылып турат.}=1{Бул көзөмөлдөө каражаты күйүк жана абалы жигердүү болгондо, Chrome акыркы көргөн вебсайттарыңыз адамдардын кайсы чоң тобуна же "когортасына" эң ылайыктуу экенин аныктайт. Жарнамачылар ал топ үчүн жарнамаларды тандай алат жана көргөн вебсайттарыңыз түзмөгүңүздө купуя сакталат. Тобуңуз күн сайын жаңыртылып турат.}other{Бул көзөмөлдөө каражаты күйүк жана абалы жигердүү болгондо, Chrome акыркы көргөн вебсайттарыңыз адамдардын кайсы чоң тобуна же "когортасына" эң ылайыктуу экенин аныктайт. Жарнамачылар ал топ үчүн жарнамаларды тандай алат жана көргөн вебсайттарыңыз түзмөгүңүздө купуя сакталат. Тобуңуз {NUM_DAYS} күн сайын жаңыртылып турат.}}</translation> <translation id="2053553514270667976">Почта индекси</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 сунуш}other{# сунуш}}</translation> +<translation id="2071156619270205202">Бул карта виртуалдык картанын номери катары жарамдуу эмес.</translation> <translation id="2071692954027939183">Билдирмелер автоматтык түрдө бөгөттөлдү, анткени, адатта, аларга уруксат бербейсиз</translation> <translation id="2079545284768500474">Кайтаруу</translation> <translation id="20817612488360358">Системанын прокси жөндөөлөрү коюлду жана ошону менен катар, айкын прокси конфигурайиясы да белгиленди.</translation> @@ -440,9 +440,11 @@ <translation id="2521385132275182522">Төмөнк оң жагын илмек менен бекитүү</translation> <translation id="2523886232349826891">Ушул түзмөккө гана сакталды</translation> <translation id="2524461107774643265">Көбүрөөк маалымат кошуу</translation> +<translation id="2529899080962247600">Бул талаага киргизилген маанилердин саны <ph name="MAX_ITEMS_LIMIT" /> ашпашы керек. Бардык андан кийинки жазмалар четке кагылат.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{жана дагы 1}other{жана дагы #}}</translation> <translation id="2536110899380797252">Дарегин кошуу</translation> <translation id="2539524384386349900">Аныктоо</translation> +<translation id="2540701853218677861">Түзмөккө кирүү/чыгуу таржымалы, анын ичинде убакыт белгилери жана ишке ашпаган аракеттер</translation> <translation id="2541219929084442027">Бардык жашыруун өтмөктөрүңүз жабылгандан кийин, аларда каралган барактар серепчиңиздин таржымалында, cookie файлдарынын сактагычында же издөө таржымалында калбайт. Бирок жүктөлүп алынган файлдар же түзүлгөн кыстармалар сакталып кала берет.</translation> <translation id="2544644783021658368">Жалгыз документ</translation> <translation id="254947805923345898">Саясаттын мааниси туура эмес көрсөтүлдү.</translation> @@ -635,6 +637,7 @@ <translation id="3320021301628644560">Төлөмдүн дарегин кошуу</translation> <translation id="3324983252691184275">Кочкул кызыл</translation> <translation id="3329013043687509092">Каныктыруу</translation> +<translation id="3333762389743153920">Виртуалдык карта үчүн жарамдуу эмес</translation> <translation id="3338095232262050444">Корголгон</translation> <translation id="3355823806454867987">Прокси жөндөөлөрүн өзгөртүү…</translation> <translation id="3360103848165129075">Төлөм иштетүү барагы</translation> @@ -767,6 +770,7 @@ <translation id="3754210790023674521">Сүрөт ичиндеги сүрөт режиминен чыгуу</translation> <translation id="3759461132968374835">Каталар жөнүндө акыркы кабарлар жок. Каталар жөнүндө кабарлоо мүмкүнчүлүгү өчүрүлгөндө, болуп өткөн каталар бул жерде көрүнбөйт.</translation> <translation id="3760561303380396507">CVC'нин ордуна Windows Hello колдонулсунбу?</translation> +<translation id="3761171036307311438">Картадагы ысым:</translation> <translation id="3761718714832595332">Абалын жашыруу</translation> <translation id="3765032636089507299">Коопсуз серептөө барагы оңдолууда.</translation> <translation id="3765588406864124894">9-электрондук каттар кутусу</translation> @@ -1146,6 +1150,7 @@ <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Картаны ырастаңыз</translation> <translation id="5135404736266831032">Даректерди башкаруу...</translation> +<translation id="5138014172396933048">Виртуалдык карта учурда жеткиликсиз, банк менен байланышыңыз</translation> <translation id="5138227688689900538">Азыраак көрсөтүү</translation> <translation id="514010763713772514">Кийинки жолу тезирээк төлөңүз</translation> <translation id="5145883236150621069">Саясат жообунда ката коду бар</translation> @@ -1192,6 +1197,7 @@ <translation id="5287240709317226393">Кукилерди көрсөтүү</translation> <translation id="5287456746628258573">Бул сайт эскирген коопсуздук конфигурациясын колдонуп жатат. Маалыматыңыз (мисалы, сырсөздөр же насыя карталарынын номерлер) ушул сайтка жөнөтүлгөндө ачык көрүнүп калышы мүмкүн.</translation> <translation id="5288108484102287882">Саясатта коюлган маанилерди ырастоодо эскертүүлөр берилди</translation> +<translation id="5288808348893593856">Сайттын туташуусу коопсуз (Chrome башканы кабарлабаса).</translation> <translation id="5289384342738547352">Бир нече документти тейлөө</translation> <translation id="5299298092464848405">Саясатты талдоо катасы</translation> <translation id="5300589172476337783">Көрсөтүү</translation> @@ -1202,7 +1208,6 @@ <translation id="5314967030527622926">Буклет жасагыч</translation> <translation id="5316812925700871227">Сааттын жебесине каршы айландыруу</translation> <translation id="5317780077021120954">Сактоо</translation> -<translation id="5321288445143113935">Максималдаштырылган</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> ичинен <ph name="MATCH_POSITION" /> дал келүү</translation> <translation id="5324080437450482387">Байланыш маалыматын тандоо</translation> <translation id="5327248766486351172">Аты:</translation> @@ -1554,9 +1559,11 @@ <translation id="6685834062052613830">Каттоо эсебинен чыгып, жөндөөнү аягына чыгарыңыз</translation> <translation id="6687335167692595844">Ариптин өлчөмү суралды</translation> <translation id="6688743156324860098">Жаңыртуу…</translation> +<translation id="6688775486821967877">Виртуалдык карта учурда жеткиликсиз, кийинчерээк кайра аракет кылыңыз</translation> <translation id="6689249931105087298">Кара чекит кысуусуна тийиштүү</translation> <translation id="6689271823431384964">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди жөндөөлөргө өтүп, өзгөртүп койсоңуз болот. Картанын ээси – аккаунттун ээси болуп эсептелет.</translation> <translation id="6698381487523150993">Түзүлгөн:</translation> +<translation id="6699188552522342100">Бул сайттагы маалымат такпы?</translation> <translation id="6702919718839027939">Презентация</translation> <translation id="6710213216561001401">Мурунку</translation> <translation id="6710594484020273272"><Изделүүчү сөздү териңиз></translation> @@ -2061,6 +2068,7 @@ <ph name="LIST_ITEM" />Cookie файлдары жана сайттын маалыматы <ph name="END_LIST" /></translation> <translation id="8574899947864779331">Карталарды тезирээк ырастоо үчүн Touch ID функциясын колдонуу</translation> +<translation id="8577348305244205642">Виртуалдык карта жеткиликсиз</translation> <translation id="858637041960032120">Телефон номерин кошуу</translation> <translation id="8589998999637048520">Мыкты сапат</translation> <translation id="8600271352425265729">Ушул жолу гана</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index a84cb46..5233b57f 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">ດ້ານຂອບສັ້ນກ່ອນ</translation> <translation id="168693727862418163">ກວດຮັບຮອງຄ່ານະໂຍບາຍນີ້ທຽບກັບຮູບແບບຂອງມັນບໍ່ສຳເລັດ ແລະ ຈະຖືກລະເລີຍ.</translation> <translation id="168841957122794586">ໃບຢັ້ງຢືນເຊີບເວີມີລະຫັດ cryptographic ທີ່ອ່ອນ.</translation> -<translation id="1696290444144917273">ເບິ່ງລາຍລະອຽດບັດສະເໝືອນ</translation> <translation id="1697532407822776718">ທ່ານຕັ້ງຮຽບຮ້ອຍໝົດແລ້ວ!</translation> <translation id="1699570257714336246">ຂໍ້ມູນຫາຍໄປ</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">ເຄື່ອງສ້າງປຶ້ມນ້ອຍ</translation> <translation id="5316812925700871227">ໝຸນທວນເຂັມໂມງ</translation> <translation id="5317780077021120954">ບັນທຶກ</translation> -<translation id="5321288445143113935">ຂະຫຍາຍເຕັມແລ້ວ</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> ໃນ <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">ເລືອກຂໍ້ມູນຕິດຕໍ່</translation> <translation id="5327248766486351172">ຊື່</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 742c902ff..b8e87b3a 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Pirmiau trumpasis kraštas</translation> <translation id="168693727862418163">Šios politikos vertės nepavyko patvirtinti pagal schemą ir jos bus nepaisoma.</translation> <translation id="168841957122794586">Serverio sertifikate yra nesudėtingas kriptografinis raktas.</translation> -<translation id="1696290444144917273">Peržiūrėkite išsamią virtualios kortelės informaciją</translation> <translation id="1697532407822776718">Viskas nustatyta!</translation> <translation id="1699570257714336246">Trūksta informacijos</translation> <translation id="1703835215927279855">Laiškas</translation> @@ -1211,7 +1210,6 @@ <translation id="5314967030527622926">Lankstinukų rengyklė</translation> <translation id="5316812925700871227">Pasukti prieš laikrodžio rodyklę</translation> <translation id="5317780077021120954">Išsaugoti</translation> -<translation id="5321288445143113935">Padidintas</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> iš <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Pasirinkti kontaktinę informaciją</translation> <translation id="5327248766486351172">Pavadinimas</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 14a89424..05426953 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Vispirms īsākā mala</translation> <translation id="168693727862418163">Šo politikas vērtību neizdevās apstiprināt, izmantojot tās shēmu, un tā tiks ignorēta.</translation> <translation id="168841957122794586">Servera sertifikāts ietver vāju kriptogrāfisko atslēgu.</translation> -<translation id="1696290444144917273">Skatīt virtuālās kartītes informāciju</translation> <translation id="1697532407822776718">Gatavs!</translation> <translation id="1699570257714336246">Trūkst informācijas</translation> <translation id="1703835215927279855">Letter</translation> @@ -1207,7 +1206,6 @@ <translation id="5314967030527622926">Bukletu veidotājs</translation> <translation id="5316812925700871227">Pagriezt pretēji pulksteņrādītāju kustības virzienam</translation> <translation id="5317780077021120954">Saglabāt</translation> -<translation id="5321288445143113935">Maksimizēta</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />. no <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Izvēlēties kontaktinformāciju</translation> <translation id="5327248766486351172">Nosaukums</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 24c4618c..b7ef299 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Прво краткиот раб</translation> <translation id="168693727862418163">Вредноста на правилото не може да се потврди според неговата шема и ќе биде игнорирана.</translation> <translation id="168841957122794586">Сертификатот на серверот содржи слаб криптографски клуч.</translation> -<translation id="1696290444144917273">Прегледајте ги деталите од виртуелната картичка</translation> <translation id="1697532407822776718">Подготвени сте.</translation> <translation id="1699570257714336246">Недостасува информација</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Производител на брошури</translation> <translation id="5316812925700871227">Ротирај налево</translation> <translation id="5317780077021120954">Зачувај</translation> -<translation id="5321288445143113935">Максимизирана</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> од <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Изберете информации за контакт</translation> <translation id="5327248766486351172">Име</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 56fec15..f0b66673 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">നീളം കുറഞ്ഞ അരിക് ആദ്യം</translation> <translation id="168693727862418163">ഈ നയ മൂല്യം അതിന്റെ സ്കീമയുമായി സാധൂകരിക്കാൻ കഴിയാത്തതിനാൽ അത് അവഗണിക്കപ്പെടും.</translation> <translation id="168841957122794586">സെർവർ സർട്ടിഫിക്കറ്റിൽ ഒരു ദുർബലമായ ഗൂഢഭാഷ കീ ഉൾപ്പെടുന്നു.</translation> -<translation id="1696290444144917273">വെർച്വൽ കാർഡ് വിശദാംശങ്ങൾ കാണുക</translation> <translation id="1697532407822776718">എല്ലാം സജ്ജമായിക്കഴിഞ്ഞു!</translation> <translation id="1699570257714336246">വിവരങ്ങൾ സമ്പൂർണ്ണമല്ല</translation> <translation id="1703835215927279855">ലെറ്റർ</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">ബുക്ക്ലെറ്റ് മേക്കർ</translation> <translation id="5316812925700871227">എതിർ ഘടികാരദിശയിൽ തിരിക്കുക</translation> <translation id="5317780077021120954">സംരക്ഷിക്കുക</translation> -<translation id="5321288445143113935">പരമാവധി വലുതാക്കിയത്</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> / <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">കോണ്ടാക്റ്റ് വിവരം തിരഞ്ഞെടുക്കുക</translation> <translation id="5327248766486351172">പേര്</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 5e02fb6..12a9ac4 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Эхлээд богино зах</translation> <translation id="168693727862418163">Энэ бодлогын утгыг схемтэй нь тулгаж баталж чадаагүй тул үүнийг үл хэрэгсэнэ.</translation> <translation id="168841957122794586">Серверийн гэрчилгээний криптограф түлхүүр нь аюулгүй байдлын хувьд сул байна.</translation> -<translation id="1696290444144917273">Виртуал картын дэлгэрэнгүйг үзэх</translation> <translation id="1697532407822776718">Тохируулга дууссан</translation> <translation id="1699570257714336246">Мэдээлэл дутуу байна</translation> <translation id="1703835215927279855">Захидал</translation> @@ -1211,7 +1210,6 @@ <translation id="5314967030527622926">Товхимол бэлдэгч</translation> <translation id="5316812925700871227">Цагийн зүүний эсрэг эргүүлэх</translation> <translation id="5317780077021120954">Хадгалах</translation> -<translation id="5321288445143113935">Томруулсан</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" />-с <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">Холбоо барих мэдээлэл сонгох</translation> <translation id="5327248766486351172">Нэр</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 885bad6..5f9b06b 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">शॉर्ट एज प्रथम</translation> <translation id="168693727862418163">हे धोरण मूल्य त्याच्या स्कीमासोबत प्रमाणित करता आले नाही आणि त्याच्याकडे दुर्लक्ष केले जाईल.</translation> <translation id="168841957122794586">सर्व्हर सर्टिफिकेटमध्ये एक कमकुवत क्रिप्टोग्राफिक की आहे.</translation> -<translation id="1696290444144917273">व्हर्च्युअल कार्डचे तपशील पहा</translation> <translation id="1697532407822776718">तुम्ही पूर्णपणे तयार आहात!</translation> <translation id="1699570257714336246">माहिती नाही आहे</translation> <translation id="1703835215927279855">Letter</translation> @@ -1203,7 +1202,6 @@ <translation id="5314967030527622926">बुकलेट मेकर</translation> <translation id="5316812925700871227">घड्याळाच्या विरुद्ध दिशेने फिरवा</translation> <translation id="5317780077021120954">सेव्ह करा</translation> -<translation id="5321288445143113935">वाढवलेले</translation> <translation id="5323105697514565458"><ph name="NUM_MATCHES" /> पैकी <ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">संपर्क माहिती निवडा</translation> <translation id="5327248766486351172">नाव</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index d595d9b..b25ebc1 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Sisi pendek dahulu</translation> <translation id="168693727862418163">Nilai dasar ini gagal disahkan dengan skemanya dan akan diabaikan.</translation> <translation id="168841957122794586">Sijil pelayan mengandungi kunci kriptografi yang lemah.</translation> -<translation id="1696290444144917273">Lihat butiran kad maya</translation> <translation id="1697532407822776718">Anda telah bersedia!</translation> <translation id="1699570257714336246">Tiada maklumat</translation> <translation id="1703835215927279855">Surat</translation> @@ -1211,7 +1210,6 @@ <translation id="5314967030527622926">Pembuat buku kecil</translation> <translation id="5316812925700871227">Putar lawan arah jam</translation> <translation id="5317780077021120954">Simpan</translation> -<translation id="5321288445143113935">Dimaksimumkan</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> daripada <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Pilih Maklumat Hubungan</translation> <translation id="5327248766486351172">Nama</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index e3c1fc2..31ac59a5 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -218,7 +218,6 @@ <translation id="1682696192498422849">တိုသည့်အနားနှင့် စတင်ရန်</translation> <translation id="168693727862418163">ဤမူဝါဒသည် ၎င်း၏ စီမံချက်နှင့်တိုက်၍ အချက်အလက်များကို အတည်ပြု၍မရသောကြောင့် လျစ်လျူရှုသွားပါမည်။</translation> <translation id="168841957122794586">ဆာဗာ အသိမှတ်ပြုလက်မှတ်တွင် အားနည်းသည့် ကုဒ်ရေးခြင်းကီး ပါဝင်နေသည်!</translation> -<translation id="1696290444144917273">ပကတိအသွင်ကတ် အသေးစိတ်ကို ကြည့်ရန်</translation> <translation id="1697532407822776718">သင်သည် အားလုံးကို သတ်မှတ်ပြီးသွားပြီ!</translation> <translation id="1699570257714336246">အချက်အလက်များ လိုအပ်နေသည်</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">စာစောင် ပြုလုပ်စနစ်</translation> <translation id="5316812925700871227">လက်ဝဲရစ် လှည့်ရန်</translation> <translation id="5317780077021120954">သိမ်းရန်</translation> -<translation id="5321288445143113935">ချဲ့ထားသည်</translation> <translation id="5323105697514565458"><ph name="NUM_MATCHES" /> အနက်မှ <ph name="FRIENDLY_MATCH_TEXT" />၊ <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">အဆက်အသွယ်အချက်အလက် ရွေးရန်</translation> <translation id="5327248766486351172">အမည်</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index cc1c9e77..6a567b16 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">पहिले छोटो किनारा</translation> <translation id="168693727862418163">यो नीतिको मान यसको स्किमासँग मिलेन। त्यसकारण यसलाई बेवास्ता गरिने छ।</translation> <translation id="168841957122794586">सर्भर प्रमाणपत्रले कमजोर क्रिप्टोग्राफिक कुञ्जी समावेश गर्छ।</translation> -<translation id="1696290444144917273">भर्चुअल कार्डका विवरण हेर्नुहोस्</translation> <translation id="1697532407822776718">तपाईंहरू सबैले सेट हुनभयो!</translation> <translation id="1699570257714336246">जानकारी छुटेको छ</translation> <translation id="1703835215927279855">Letter</translation> @@ -1195,7 +1194,6 @@ <translation id="5314967030527622926">पुस्तिका निर्माता</translation> <translation id="5316812925700871227">घडीको विपरीत दिशामा घुमाउनुहोस्</translation> <translation id="5317780077021120954">बचत गर्नुहोस्</translation> -<translation id="5321288445143113935">ठुलो पारिएको</translation> <translation id="5323105697514565458"><ph name="NUM_MATCHES" /> मध्ये <ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">सम्पर्कसम्बन्धी जानकारी छनौट गर्नुहोस्</translation> <translation id="5327248766486351172">नाम</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index f4b68a6..dfd61db4 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -215,7 +215,6 @@ <translation id="1682696192498422849">Korte zijde eerst</translation> <translation id="168693727862418163">Deze beleidswaarde kan niet worden gevalideerd op basis van het bijbehorende schema en wordt genegeerd.</translation> <translation id="168841957122794586">Het servercertificaat bevat een zwakke cryptografische sleutel.</translation> -<translation id="1696290444144917273">Gegevens van virtuele kaart bekijken</translation> <translation id="1697532407822776718">Je bent nu klaar!</translation> <translation id="1699570257714336246">Ontbrekende informatie</translation> <translation id="1703835215927279855">Letter</translation> @@ -1196,7 +1195,6 @@ <translation id="5314967030527622926">Boekjesmaker</translation> <translation id="5316812925700871227">Linksom draaien</translation> <translation id="5317780077021120954">Opslaan</translation> -<translation id="5321288445143113935">Gemaximaliseerd</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> van <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Contactgegevens kiezen</translation> <translation id="5327248766486351172">Naam</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index e026fe5..29536a4 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Kortsiden først</translation> <translation id="168693727862418163">Denne regelverdien kunne ikke valideres mot oppsettet og blir derfor ignorert.</translation> <translation id="168841957122794586">Tjenersertifikatet inneholder en svak kryptografisk nøkkel.</translation> -<translation id="1696290444144917273">Se virtuelle kortopplysninger</translation> <translation id="1697532407822776718">Da er alt klart!</translation> <translation id="1699570257714336246">Informasjon mangler</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Heftemaker</translation> <translation id="5316812925700871227">Rotér mot klokken</translation> <translation id="5317780077021120954">Lagre</translation> -<translation id="5321288445143113935">Maksimert</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> av <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Velg kontaktinformasjon</translation> <translation id="5327248766486351172">Navn</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 882e9383..548bc15 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">ପ୍ରଥମେ ଛୋଟ ଏଡଜ୍</translation> <translation id="168693727862418163">ଏହି ନୀତିର ମୂଲ୍ୟ ଏହାର ସ୍କିମା ଅନୁଯାୟୀ ବୈଧ ହେବାରେ ବିଫଳ ହୋଇଛି ଏବଂ ଏହାକୁ ଅଣଦେଖା କରାଯିବ।</translation> <translation id="168841957122794586">ସର୍ଭର୍ ସାର୍ଟିଫିକେଟ୍ରେ ଗୋଟିଏ ଦୁର୍ବଳ କ୍ରିପ୍ଟୋଗ୍ରାଫିକ୍ କୀ ଅଛି।</translation> -<translation id="1696290444144917273">ଭର୍ଚୁଆଲ୍ କାର୍ଡ ବିବରଣୀ ଦେଖନ୍ତୁ</translation> <translation id="1697532407822776718">ଆପଣ ପୂରା ପ୍ରସ୍ତୁତ ଅଛନ୍ତି!</translation> <translation id="1699570257714336246">ସୂଚନା ଅନୁପଲବ୍ଧ ଅଛି</translation> <translation id="1703835215927279855">ଲେଟର୍</translation> @@ -1189,7 +1188,6 @@ <translation id="5314967030527622926">ବୁକ୍ଲେଟ୍ ମାର୍କର୍</translation> <translation id="5316812925700871227">ଡାହାଣରୁ ବାମକୁ ଘୂରାନ୍ତୁ</translation> <translation id="5317780077021120954">ସଞ୍ଚୟ</translation> -<translation id="5321288445143113935">ବଡ଼ କରାଯାଇଛି</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> ମଧ୍ୟରେ <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">ଯୋଗାଯୋଗ ସୂଚନା ଚୟନ କରନ୍ତୁ</translation> <translation id="5327248766486351172">ନାମ</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 5f85b7a..e8c1405 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">ਪਹਿਲਾਂ ਛੋਟੇ ਕਿਨਾਰੇ ਵਾਲੇ</translation> <translation id="168693727862418163">ਇਸ ਨੀਤੀ ਮੁੱਲ ਨੂੰ ਇਸਦੀ ਸਕੀਮ ਨਾਲ ਪ੍ਰਮਾਣਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਅਤੇ ਇਸ ਨੂੰ ਅਣਡਿੱਠ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> <translation id="168841957122794586">ਸਰਵਰ ਸਰਟੀਫਿਕੇਟ ਵਿੱਚ ਇੱਕ ਕਮਜ਼ੋਰ ਕ੍ਰਾਈਪਟੋਗ੍ਰਾਫਿਕ ਕੁੰਜੀ ਹੈ।</translation> -<translation id="1696290444144917273">ਆਭਾਸੀ ਕਾਰਡ ਸੰਬੰਧੀ ਵੇਰਵੇ ਦੇਖੋ</translation> <translation id="1697532407822776718">ਤੁਸੀਂ ਸਾਰਾ ਸੈਟ ਕਰ ਲਿਆ ਹੈ!</translation> <translation id="1699570257714336246">ਜਾਣਕਾਰੀ ਅਧੂਰੀ ਹੈ</translation> <translation id="1703835215927279855">ਚਿੱਠੀ</translation> @@ -1190,7 +1189,6 @@ <translation id="5314967030527622926">ਬੁੱਕਲੈੱਟ ਮੇਕਰ</translation> <translation id="5316812925700871227">ਕਾਉਂਟਰਕਲੌਕਵਾਈਜ ਰੋਟੇਟ ਕਰੋ</translation> <translation id="5317780077021120954">ਰੱਖਿਅਤ ਕਰੋ</translation> -<translation id="5321288445143113935">ਵੱਡੀ ਕੀਤੀ ਗਈ</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> ਵਿੱਚੋਂ <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">ਸੰਪਰਕ ਜਾਣਕਾਰੀ ਚੁਣੋ</translation> <translation id="5327248766486351172">ਨਾਮ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index c431682..fde44a7 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Najpierw krótsza krawędź</translation> <translation id="168693727862418163">Nie udało się zweryfikować tej wartości zasady względem jej schematu. Będzie ona ignorowana.</translation> <translation id="168841957122794586">Certyfikat serwera ma słaby klucz kryptograficzny.</translation> -<translation id="1696290444144917273">Zobacz dane karty wirtualnej</translation> <translation id="1697532407822776718">Wszystko gotowe.</translation> <translation id="1699570257714336246">Brak informacji</translation> <translation id="1703835215927279855">Letter</translation> @@ -1201,7 +1200,6 @@ <translation id="5314967030527622926">Tworzenie broszur</translation> <translation id="5316812925700871227">Obróć w lewo</translation> <translation id="5317780077021120954">Zapisz</translation> -<translation id="5321288445143113935">Zmaksymalizowana</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> z <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Wybierz dane kontaktowe</translation> <translation id="5327248766486351172">Nazwa</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index ffa9b77..1df0498 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Borda menor primeiro</translation> <translation id="168693727862418163">Houve uma falha na validação do valor da política em relação ao esquema, e ele será ignorado.</translation> <translation id="168841957122794586">O certificado do servidor contém uma chave de criptografia fraca.</translation> -<translation id="1696290444144917273">Ver detalhes do cartão virtual</translation> <translation id="1697532407822776718">Pronto.</translation> <translation id="1699570257714336246">Faltam algumas informações</translation> <translation id="1703835215927279855">Carta</translation> @@ -1199,7 +1198,6 @@ <translation id="5314967030527622926">Criador de folhetos</translation> <translation id="5316812925700871227">Girar no sentido anti-horário</translation> <translation id="5317780077021120954">Salvar</translation> -<translation id="5321288445143113935">Maximizado</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Escolher informações de contato</translation> <translation id="5327248766486351172">Nome</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index a2a6b27..43962d9f 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Margem estreita primeiro</translation> <translation id="168693727862418163">Ocorreu um erro na validação desta política em relação ao respetivo esquema e a mesma será ignorada.</translation> <translation id="168841957122794586">O certificado do servidor contém uma chave criptográfica fraca.</translation> -<translation id="1696290444144917273">Veja detalhes do cartão virtual</translation> <translation id="1697532407822776718">O processo está concluído!</translation> <translation id="1699570257714336246">Informações em falta</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Criador de folhetos</translation> <translation id="5316812925700871227">Rodar para a esquerda</translation> <translation id="5317780077021120954">Guardar</translation> -<translation id="5321288445143113935">Maximizada</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> de <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Escolher informações de contacto</translation> <translation id="5327248766486351172">Nome</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 4d66c97..711d6f98 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Cu latura scurtă înainte</translation> <translation id="168693727862418163">Valoarea politicii nu s-a validat în raport cu schema și va fi ignorată.</translation> <translation id="168841957122794586">Certificatul de server conține o cheie criptografică slabă.</translation> -<translation id="1696290444144917273">Vezi detaliile cardului virtual</translation> <translation id="1697532407822776718">Ești gata!</translation> <translation id="1699570257714336246">Informații lipsă</translation> <translation id="1703835215927279855">Letter</translation> @@ -1208,7 +1207,6 @@ <translation id="5314967030527622926">Broșator</translation> <translation id="5316812925700871227">Rotește în sens invers acelor de ceasornic</translation> <translation id="5317780077021120954">Salvează</translation> -<translation id="5321288445143113935">Maximizată</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> din <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Alege informațiile de contact</translation> <translation id="5327248766486351172">Nume</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 0e449a3..e3f464fc 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Начиная с короткого края</translation> <translation id="168693727862418163">Такое значение правила не предусмотрено и будет проигнорировано.</translation> <translation id="168841957122794586">Сертификат сервера содержит ненадежный криптографический ключ.</translation> -<translation id="1696290444144917273">Показать реквизиты виртуальной карты</translation> <translation id="1697532407822776718">Готово!</translation> <translation id="1699570257714336246">Данные отсутствуют</translation> <translation id="1703835215927279855">Letter</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">Изготовление буклета</translation> <translation id="5316812925700871227">Повернуть против часовой стрелки</translation> <translation id="5317780077021120954">Сохранить</translation> -<translation id="5321288445143113935">Развернутое окно</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> из <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Выбрать контактные данные</translation> <translation id="5327248766486351172">Имя</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index acd3d7f..c6941edc 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">පළමුව කෙටි දාරය</translation> <translation id="168693727862418163">මෙම ප්රතිපත්ති අගය එහි නිරූපණයට අනුව වලංගු කිරීමට අසමත් වූ බැවින් නොසලකා හරිනු ලැබේ.</translation> <translation id="168841957122794586">සේවාදායක සහතිකයේ දුර්වල ගුප්තලේඛන යතුරක් අඩංගුය!</translation> -<translation id="1696290444144917273">අතථ්ය කාඩ්පත් විස්තර බලන්න</translation> <translation id="1697532407822776718">ඔබ මුළුමනින් සුදානම්ය!</translation> <translation id="1699570257714336246">තොරතුරු මඟ හැරී ඇත</translation> <translation id="1703835215927279855">Letter</translation> @@ -1205,7 +1204,6 @@ <translation id="5314967030527622926">පුස්තිකා සාදන්නා</translation> <translation id="5316812925700871227">දක්ෂිණාවර්තව කරකවන්න</translation> <translation id="5317780077021120954">සුරකින්න</translation> -<translation id="5321288445143113935">විශාල කරන ලදි</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" />න් <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">සම්බන්ධතා තතු තෝරාගන්න</translation> <translation id="5327248766486351172">නම</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 0d72d0d2..c8711d85 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Napred krátkym okrajom</translation> <translation id="168693727862418163">Túto hodnotu pravidla sa nepodarilo v jeho schéme overiť a bude ignorovaná.</translation> <translation id="168841957122794586">Certifikát servera obsahuje slabý kryptografický kľúč.</translation> -<translation id="1696290444144917273">Zobraziť podrobnosti virtuálnej karty</translation> <translation id="1697532407822776718">Všetko je nastavené!</translation> <translation id="1699570257714336246">Chýbajú informácie</translation> <translation id="1703835215927279855">Letter</translation> @@ -1195,7 +1194,6 @@ <translation id="5314967030527622926">Nástroj na vytvorenie bookletu</translation> <translation id="5316812925700871227">Otočiť proti smeru hodinových ručičiek</translation> <translation id="5317780077021120954">Uložiť</translation> -<translation id="5321288445143113935">Maximalizované</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> z <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Vybrať kontaktné informácie</translation> <translation id="5327248766486351172">Názov</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index a20bb0d1..cd5375e 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Najprej kratki rob</translation> <translation id="168693727862418163">Preverjanje vrednosti tega pravilnika v skladu z njegovo shemo ni uspelo in bo prezrta.</translation> <translation id="168841957122794586">Potrdilo strežnika vsebuje šibek šifrirni ključ.</translation> -<translation id="1696290444144917273">Ogled podrobnosti navidezne kartice</translation> <translation id="1697532407822776718">Pripravljeni ste.</translation> <translation id="1699570257714336246">Manjkajo podatki</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Orodje za izdelavo knjižic</translation> <translation id="5316812925700871227">Sukanje v nasprotni smeri urnega kazalca</translation> <translation id="5317780077021120954">Shrani</translation> -<translation id="5321288445143113935">Povečano</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> od <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Izbira podatkov za stik</translation> <translation id="5327248766486351172">Ime</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 8552695..05a32cb8 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Ana e shkurtër në fillim</translation> <translation id="168693727862418163">Vërtetimi i kësaj vlere të politikës kundrejt skemës së saj dështoi dhe do të shpërfillet.</translation> <translation id="168841957122794586">Certifikata e serverit përmban një çelës të dobët kriptografik.</translation> -<translation id="1696290444144917273">Shiko detajet e kartës virtuale</translation> <translation id="1697532407822776718">Je gati!</translation> <translation id="1699570257714336246">Mungon informacion</translation> <translation id="1703835215927279855">Letter</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">Krijuesi i broshurës</translation> <translation id="5316812925700871227">Rrotullo në drejtim të kundërt të akrepave të orës</translation> <translation id="5317780077021120954">Ruaj</translation> -<translation id="5321288445143113935">I maksimizuar</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> nga <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Zgjidh informacionet e kontaktit</translation> <translation id="5327248766486351172">Emri</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 6495836..1381516 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Prvo kratka ivica</translation> <translation id="168693727862418163">Validacija šeme ove vrednosti za smernice nije uspela i zanemariće se.</translation> <translation id="168841957122794586">Sertifikat servera sadrži slab kriptografski ključ.</translation> -<translation id="1696290444144917273">Pogledajte podatke o virtuelnoj kartici</translation> <translation id="1697532407822776718">Spremni ste!</translation> <translation id="1699570257714336246">Nedostaju informacije</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Alat za pravljenje brošure</translation> <translation id="5316812925700871227">Okrenite u smeru suprotnom od kazaljke na satu</translation> <translation id="5317780077021120954">Sačuvaj</translation> -<translation id="5321288445143113935">Maksimalno uvećano</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />. od <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Odaberite kontakt informacije</translation> <translation id="5327248766486351172">Naziv</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index a0bf3c7..3aaf1d8b 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Прво кратка ивица</translation> <translation id="168693727862418163">Валидација шеме ове вредности за смернице није успела и занемариће се.</translation> <translation id="168841957122794586">Сертификат сервера садржи слаб криптографски кључ.</translation> -<translation id="1696290444144917273">Погледајте податке о виртуелној картици</translation> <translation id="1697532407822776718">Спремни сте!</translation> <translation id="1699570257714336246">Недостају информације</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Алат за прављење брошуре</translation> <translation id="5316812925700871227">Окрените у смеру супротном од казаљке на сату</translation> <translation id="5317780077021120954">Сачувај</translation> -<translation id="5321288445143113935">Максимално увећано</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />. од <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Одаберите контакт информације</translation> <translation id="5327248766486351172">Назив</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index 10a10c06..927090a 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Kortsidan först</translation> <translation id="168693727862418163">Principen ignoreras eftersom den inte gick att validera mot schemat.</translation> <translation id="168841957122794586">Servercertifikatet innehåller en svag kryptografisk nyckel.</translation> -<translation id="1696290444144917273">Visa kortuppgifter</translation> <translation id="1697532407822776718">Färdigt!</translation> <translation id="1699570257714336246">Uppgifter saknas</translation> <translation id="1703835215927279855">Letter</translation> @@ -1210,7 +1209,6 @@ <translation id="5314967030527622926">Broschyrenhet</translation> <translation id="5316812925700871227">Rotera moturs</translation> <translation id="5317780077021120954">Spara</translation> -<translation id="5321288445143113935">Maximerat</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> av <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Välj kontaktuppgifter</translation> <translation id="5327248766486351172">Namn</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 82d56625..3b2f6b3 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Pembe fupi kwanza</translation> <translation id="168693727862418163">Thamani ya sera hii imeshindwa kuthibitishwa kwenye taratibu yake na itapuuzwa.</translation> <translation id="168841957122794586">Cheti cha seva kina kitufe dhaifu cha kifichua msimbo.</translation> -<translation id="1696290444144917273">Angalia maelezo ya kadi pepe</translation> <translation id="1697532407822776718">Mko tayari nyote!</translation> <translation id="1699570257714336246">Maelezo hayajakamilika</translation> <translation id="1703835215927279855">Barua</translation> @@ -1209,7 +1208,6 @@ <translation id="5314967030527622926">Kialamishi cha kijitabu</translation> <translation id="5316812925700871227">Zungusha kinyume cha mwendo wa saa</translation> <translation id="5317780077021120954">Hifadhi</translation> -<translation id="5321288445143113935">Iliyopanuliwa</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> kati ya <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Chagua Maelezo ya Mawasiliano</translation> <translation id="5327248766486351172">Jina</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 0aecf21..975a696 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">குறுகிய ஓரம் முதலில்</translation> <translation id="168693727862418163">இந்தக் கொள்கை அதன் திட்டப்பணித் தரவுக்கு எதிராக மதிப்பீடு செய்யப்படாததால் புறக்கணிக்கப்படும்.</translation> <translation id="168841957122794586">சேவையக சான்றிதழில் வலுவற்ற குறியீட்டாக்க விசை இருக்கிறது.</translation> -<translation id="1696290444144917273">விர்ச்சுவல் கார்டு விவரங்களைக் காட்டும்</translation> <translation id="1697532407822776718">எல்லாவற்றையும் அமைத்துவிட்டீர்கள்!</translation> <translation id="1699570257714336246">தகவல் முழுமையாக இல்லை</translation> <translation id="1703835215927279855">Letter</translation> @@ -921,7 +920,7 @@ <translation id="4300675098767811073">மல்டிப்பில் பஞ்ச் ரைட்</translation> <translation id="4302514097724775343">விளையாட டைனோசரைத் தட்டுங்கள்</translation> <translation id="4302965934281694568">Chou3 (என்வலப்)</translation> -<translation id="4305666528087210886">உங்கள் கோப்பினை அணுக முடியவில்லை</translation> +<translation id="4305666528087210886">உங்கள் ஃபைலை அணுக முடியவில்லை</translation> <translation id="4306529830550717874">முகவரியைச் சேமிக்கவா?</translation> <translation id="4312613361423056926">B2</translation> <translation id="4312866146174492540">தடு (இயல்பு)</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">புக்லெட் மேக்கர்</translation> <translation id="5316812925700871227">கடிகார எதிர்த்திசையில் சுழற்று</translation> <translation id="5317780077021120954">சேமி</translation> -<translation id="5321288445143113935">பெரிதாக்கப்பட்டது</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> இல் <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">தொடர்புத் தகவலைத் தேர்வு செய்</translation> <translation id="5327248766486351172">பெயர்</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 76dfbb4..60b5614 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -219,7 +219,6 @@ <translation id="1682696192498422849">పేజీని అడ్డంగా తిప్పి ప్రింట్ చేయి</translation> <translation id="168693727862418163">ఈ పాలసీ విలువ దాని స్కీమాకు వ్యతిరేకంగా వాలిడేట్ చేయడంలో విఫలమైంది, కాబట్టి విస్మరించబడుతుంది.</translation> <translation id="168841957122794586">సర్వర్ ప్రమాణపత్రం బలహీన క్రిప్టోగ్రాఫిక్ కీని కలిగి ఉంది.</translation> -<translation id="1696290444144917273">వర్చువల్ కార్డ్ వివరాలను చూడండి</translation> <translation id="1697532407822776718">మీరు సిద్ధంగా ఉన్నారు!</translation> <translation id="1699570257714336246">సమాచారం సరిగ్గా లేదు</translation> <translation id="1703835215927279855">లెటర్</translation> @@ -1204,7 +1203,6 @@ <translation id="5314967030527622926">బుక్లెట్ తయారీ దారు</translation> <translation id="5316812925700871227">అపసవ్య దిశలో తిప్పు</translation> <translation id="5317780077021120954">సేవ్ చేయి</translation> -<translation id="5321288445143113935">గరిష్ఠీకరించబడింది</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" />లో <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">సంప్రదింపు సమాచారాన్ని ఎంచుకోండి</translation> <translation id="5327248766486351172">పేరు</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index f08e1a9..1c5c67c 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">ด้านขอบสั้นก่อน</translation> <translation id="168693727862418163">ตรวจสอบค่านโยบายนี้กับสคีมาไม่ได้ ระบบจะเพิกเฉยต่อค่านี้</translation> <translation id="168841957122794586">ใบรับรองของเซิร์ฟเวอร์มีคีย์การเข้ารหัสที่ไม่รัดกุม</translation> -<translation id="1696290444144917273">ดูรายละเอียดบัตรเสมือน</translation> <translation id="1697532407822776718">คุณพร้อมแล้ว!</translation> <translation id="1699570257714336246">ข้อมูลไม่ครบ</translation> <translation id="1703835215927279855">Letter</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">เครื่องทำจุลสาร</translation> <translation id="5316812925700871227">หมุนทวนเข็มนาฬิกา</translation> <translation id="5317780077021120954">บันทึก</translation> -<translation id="5321288445143113935">ขยาย</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" /> <ph name="MATCH_POSITION" /> จาก <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">เลือกข้อมูลติดต่อ</translation> <translation id="5327248766486351172">ชื่อ</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 2686e02e..4d009649 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Önce kısa kenar</translation> <translation id="168693727862418163">Bu politika değeri, şemasına göre doğrulanamadı, yok sayılacak.</translation> <translation id="168841957122794586">Sunucu sertifikasında zayıf bir şifreleme anahtarı var.</translation> -<translation id="1696290444144917273">Sanal kart ayrıntılarını görüntüle</translation> <translation id="1697532407822776718">Artık hazırsınız!</translation> <translation id="1699570257714336246">Bilgi eksik</translation> <translation id="1703835215927279855">Letter</translation> @@ -1201,7 +1200,6 @@ <translation id="5314967030527622926">Kitapçık yapıcı</translation> <translation id="5316812925700871227">Saat yönünün tersine döndür</translation> <translation id="5317780077021120954">Kaydet</translation> -<translation id="5321288445143113935">Tam ekran</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="NUM_MATCHES" /> eşleşme arasında <ph name="MATCH_POSITION" />. sırada</translation> <translation id="5324080437450482387">İletişim Bilgisi Seç</translation> <translation id="5327248766486351172">Ad</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index c99101e1..c671297 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Спочатку по ширині</translation> <translation id="168693727862418163">Не вдалося перевірити значення цього правила в схемі, тому воно ігноруватиметься.</translation> <translation id="168841957122794586">Сертифікат сервера містить слабкий криптографічний ключ.</translation> -<translation id="1696290444144917273">Переглянути дані віртуальної картки</translation> <translation id="1697532407822776718">Готово!</translation> <translation id="1699570257714336246">Немає інформації</translation> <translation id="1703835215927279855">Letter</translation> @@ -1208,7 +1207,6 @@ <translation id="5314967030527622926">Виробник буклетів</translation> <translation id="5316812925700871227">Обернути проти годинникової стрілки</translation> <translation id="5317780077021120954">Зберегти</translation> -<translation id="5321288445143113935">Розгорнуто</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> з <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Вибрати контактну інформацію</translation> <translation id="5327248766486351172">Ім’я</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 29685024d..e63c55d 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -218,7 +218,6 @@ <translation id="1682696192498422849">چھوٹا کنارہ پہلے</translation> <translation id="168693727862418163">اس پالیسی کی قدر اس کے سکیما کو توثیق کرنے میں ناکام ہو گئی اور اسے نظر انداز کر دیا جائے گا۔</translation> <translation id="168841957122794586">سرور سرٹیفکیٹ میں ایک ہفتے کی کرپٹوگرافک کلید شامل ہے۔</translation> -<translation id="1696290444144917273">ورچوئل کارڈ کی تفصیلات دیکھیں</translation> <translation id="1697532407822776718">آپ بالکل ٹھیک ہیں!</translation> <translation id="1699570257714336246">معلومات موجود نہیں ہے</translation> <translation id="1703835215927279855">Letter</translation> @@ -1206,7 +1205,6 @@ <translation id="5314967030527622926">کتابچہ بنانے والا</translation> <translation id="5316812925700871227">گھڑی کی مخالف سمت میں گھمائیں</translation> <translation id="5317780077021120954">محفوظ کریں</translation> -<translation id="5321288445143113935">بڑا کر دیا گیا</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />، <ph name="MATCH_POSITION" /> از <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">رابطے کی معلومات منتخب کریں</translation> <translation id="5327248766486351172">نام</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index f48174c..f2378d3 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -216,7 +216,6 @@ <translation id="1682696192498422849">Avval eniga</translation> <translation id="168693727862418163">Bu parametr oʻz andozasiga mos tushmagani uchun inkor etiladi.</translation> <translation id="168841957122794586">Server sertifikati ishonchsiz kriptografik kalitga ega.</translation> -<translation id="1696290444144917273">Virtual karta tafsilotlarini ochish</translation> <translation id="1697532407822776718">Tayyor!</translation> <translation id="1699570257714336246">Axborot butunlay kiritilmadi</translation> <translation id="1703835215927279855">Letter</translation> @@ -1205,7 +1204,6 @@ <translation id="5314967030527622926">Buklet yasash vositasi</translation> <translation id="5316812925700871227">Soat miliga teskari yo‘nalishda burish</translation> <translation id="5317780077021120954">Saqlash</translation> -<translation id="5321288445143113935">Kattalashtirilgan</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Aloqa axborotini tanlang</translation> <translation id="5327248766486351172">Nomi</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 7d0ac41..ad9e33e 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Cạnh ngắn trước</translation> <translation id="168693727862418163">Giá trị chính sách này không xác thực được dựa vào giản đồ và sẽ bị bỏ qua.</translation> <translation id="168841957122794586">Chứng chỉ máy chủ chứa khóa mật mã yếu.</translation> -<translation id="1696290444144917273">Xem thông tin chi tiết về thẻ ảo</translation> <translation id="1697532407822776718">Bạn đã hoàn tất!</translation> <translation id="1699570257714336246">Thiếu thông tin</translation> <translation id="1703835215927279855">Letter</translation> @@ -312,6 +311,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{Khi chế độ điều khiển này bật và trạng thái là đang hoạt động, Chrome sẽ xác định xem hoạt động duyệt web gần đây của bạn giống với nhóm đông người hoặc "nhóm thuần tập" nào nhất. Các nhà quảng cáo có thể chọn quảng cáo cho nhóm này và hoạt động duyệt web sẽ được lưu giữ riêng tư trên thiết bị của bạn. Nhóm của bạn được cập nhật hằng ngày.}=1{Khi chế độ điều khiển này bật và trạng thái là đang hoạt động, Chrome sẽ xác định xem hoạt động duyệt web gần đây của bạn giống với nhóm đông người hoặc "nhóm thuần tập" nào nhất. Các nhà quảng cáo có thể chọn quảng cáo cho nhóm này và hoạt động duyệt web sẽ được lưu giữ riêng tư trên thiết bị của bạn. Nhóm của bạn được cập nhật hằng ngày.}other{Khi chế độ điều khiển này bật và trạng thái là đang hoạt động, Chrome sẽ xác định xem hoạt động duyệt web gần đây của bạn giống với nhóm đông người hoặc "nhóm thuần tập" nào nhất. Các nhà quảng cáo có thể chọn quảng cáo cho nhóm này và hoạt động duyệt web sẽ được lưu giữ riêng tư trên thiết bị của bạn. Nhóm của bạn được cập nhật {NUM_DAYS} ngày một lần.}}</translation> <translation id="2053553514270667976">Mã zip</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 đề xuất}other{# đề xuất}}</translation> +<translation id="2071156619270205202">Thẻ này không đáp ứng điều kiện để tạo số thẻ ảo.</translation> <translation id="2071692954027939183">Các thông báo tự động bị chặn do bạn thường xuyên không cho phép các thông báo đó</translation> <translation id="2079545284768500474">Hoàn tác</translation> <translation id="20817612488360358">Cài đặt proxy hệ thống được đặt để sử dụng nhưng cấu hình proxy rõ ràng cũng được chỉ định.</translation> @@ -440,9 +440,11 @@ <translation id="2521385132275182522">Dập ghim dưới cùng bên phải</translation> <translation id="2523886232349826891">Chỉ lưu trên thiết bị này</translation> <translation id="2524461107774643265">Thêm thông tin khác</translation> +<translation id="2529899080962247600">Trường này không được chứa nhiều hơn <ph name="MAX_ITEMS_LIMIT" /> mục. Tất cả mục thừa sẽ bị bỏ qua.</translation> <translation id="2535659140340599600">{COUNT,plural, =1{và 1 miền khác}other{và # miền khác}}</translation> <translation id="2536110899380797252">Thêm địa chỉ</translation> <translation id="2539524384386349900">Phát hiện</translation> +<translation id="2540701853218677861">Danh sách các lần đăng nhập/đăng xuất trên thiết bị, bao gồm dấu thời gian và các lần thử không thành công</translation> <translation id="2541219929084442027">Những trang mà bạn xem trong các thẻ Ẩn danh sẽ không bị lưu lại trong nhật ký của trình duyệt, kho cookie hoặc nhật ký tìm kiếm sau khi bạn đóng tất cả các thẻ Ẩn danh. Mọi tệp bạn tải xuống hoặc dấu trang mà bạn tạo sẽ được giữ nguyên.</translation> <translation id="2544644783021658368">Một tài liệu</translation> <translation id="254947805923345898">Giá trị của chính sách là không hợp lệ.</translation> @@ -635,6 +637,7 @@ <translation id="3320021301628644560">Thêm địa chỉ thanh toán</translation> <translation id="3324983252691184275">Đỏ thẫm</translation> <translation id="3329013043687509092">Độ bão hòa</translation> +<translation id="3333762389743153920">Không đáp ứng điều kiện để tạo thẻ ảo</translation> <translation id="3338095232262050444">Bảo mật</translation> <translation id="3355823806454867987">Thay đổi cài đặt proxy...</translation> <translation id="3360103848165129075">Trang tính trình xử lý thanh toán</translation> @@ -1148,6 +1151,7 @@ <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">Xác minh thẻ của bạn</translation> <translation id="5135404736266831032">Quản lý địa chỉ...</translation> +<translation id="5138014172396933048">Thẻ ảo hiện chưa dùng được, vui lòng liên hệ với ngân hàng của bạn</translation> <translation id="5138227688689900538">Ẩn bớt</translation> <translation id="514010763713772514">Thanh toán nhanh hơn vào lần tới</translation> <translation id="5145883236150621069">Mã lỗi có trong phản hồi chính sách</translation> @@ -1194,6 +1198,7 @@ <translation id="5287240709317226393">Hiển thị cookie</translation> <translation id="5287456746628258573">Trang web này dùng cấu hình bảo mật lỗi thời nên có thể làm lộ thông tin của bạn (chẳng hạn như mật khẩu hoặc số thẻ tín dụng) trong quá trình gửi các thông tin này đến trang web.</translation> <translation id="5288108484102287882">Xuất hiện cảnh báo khi xác thực các giá trị của chính sách</translation> +<translation id="5288808348893593856">Trang web có kết nối an toàn, trừ phi Chrome thông báo cho bạn thông tin khác.</translation> <translation id="5289384342738547352">Xử lý nhiều tài liệu</translation> <translation id="5299298092464848405">Lỗi phân tích cú pháp chính sách</translation> <translation id="5300589172476337783">Hiển thị</translation> @@ -1204,7 +1209,6 @@ <translation id="5314967030527622926">Máy tạo cuốn sách nhỏ</translation> <translation id="5316812925700871227">Xoay ngược chiều kim đồng hồ</translation> <translation id="5317780077021120954">Lưu</translation> -<translation id="5321288445143113935">Phóng to</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> / <ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Chọn thông tin liên hệ</translation> <translation id="5327248766486351172">Tên</translation> @@ -1556,9 +1560,11 @@ <translation id="6685834062052613830">Đăng xuất và hoàn thành quá trình thiết lập</translation> <translation id="6687335167692595844">Kích thước phông chữ đã yêu cầu</translation> <translation id="6688743156324860098">Cập nhật…</translation> +<translation id="6688775486821967877">Thẻ ảo hiện chưa dùng được, vui lòng thử lại sau</translation> <translation id="6689249931105087298">Tương đối có nén điểm đen</translation> <translation id="6689271823431384964">Chrome đang đề xuất lưu thẻ của bạn vào Tài khoản Google vì bạn đã đăng nhập. Bạn có thể thay đổi hoạt động này trong phần cài đặt. Tên chủ thẻ được lấy từ tài khoản của bạn.</translation> <translation id="6698381487523150993">Tạo:</translation> +<translation id="6699188552522342100">Trang web này có chính xác không?</translation> <translation id="6702919718839027939">Thuyết trình</translation> <translation id="6710213216561001401">Trước</translation> <translation id="6710594484020273272"><Nhập cụm từ tìm kiếm></translation> @@ -2063,6 +2069,7 @@ <ph name="LIST_ITEM" />Cookie và dữ liệu trang web <ph name="END_LIST" /></translation> <translation id="8574899947864779331">Dùng Touch ID để xác nhận các thẻ nhanh hơn</translation> +<translation id="8577348305244205642">Không thể sử dụng thẻ ảo</translation> <translation id="858637041960032120">Thêm số đ.thoại </translation> <translation id="8589998999637048520">Chất lượng tốt nhất</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 15fa7edc..c917d74 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">短边先入</translation> <translation id="168693727862418163">此政策值未能根据其架构进行验证,因此会被忽略。</translation> <translation id="168841957122794586">服务器证书包含弱加密密钥。</translation> -<translation id="1696290444144917273">查看虚拟卡详细信息</translation> <translation id="1697532407822776718">搞定了!</translation> <translation id="1699570257714336246">缺少信息</translation> <translation id="1703835215927279855">Letter</translation> @@ -1195,7 +1194,6 @@ <translation id="5314967030527622926">手册制作工具</translation> <translation id="5316812925700871227">逆时针旋转</translation> <translation id="5317780077021120954">保存</translation> -<translation id="5321288445143113935">最大化</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />,第 <ph name="MATCH_POSITION" /> 个(共 <ph name="NUM_MATCHES" /> 个)</translation> <translation id="5324080437450482387">选择联系信息</translation> <translation id="5327248766486351172">名称</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 35823c5..0361b4e7 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">先從短邊開始</translation> <translation id="168693727862418163">此政策的值無法通過其綱要 (schema) 的驗證,因此會被忽略。</translation> <translation id="168841957122794586">伺服器憑證含有防護力薄弱的加密編譯金鑰。</translation> -<translation id="1696290444144917273">查看虛擬付款卡資料</translation> <translation id="1697532407822776718">大功告成!</translation> <translation id="1699570257714336246">缺少資料</translation> <translation id="1703835215927279855">Letter</translation> @@ -308,7 +307,7 @@ <translation id="2053373601901562871">{NUM_DAYS,plural, =0{如果此功能已啟用且處於有效狀態,Chrome 就會判斷您最近的瀏覽活動與哪個大型使用者群組 (又稱「組別」) 最為相似。廣告客戶可以選擇要向該群組顯示的廣告,而您的瀏覽活動會保留在裝置上,絕不會外洩。系統會每日更新您所屬的群組。}=1{如果此功能已啟用且處於有效狀態,Chrome 就會判斷您最近的瀏覽活動與哪個大型使用者群組 (又稱「組別」) 最為相似。廣告客戶可以選擇要向該群組顯示的廣告,而您的瀏覽活動會保留在裝置上,絕不會外洩。系統會每日更新您所屬的群組。}other{如果此功能已啟用且處於有效狀態,Chrome 就會判斷您最近的瀏覽活動與哪個大型使用者群組 (又稱「組別」) 最為相似。廣告客戶可以選擇要向該群組顯示的廣告,而您的瀏覽活動會保留在裝置上,絕不會外洩。系統會每隔 {NUM_DAYS} 日更新您所屬的群組。}}</translation> <translation id="2053553514270667976">郵遞區號</translation> <translation id="2064691555167957331">{COUNT,plural, =1{1 個建議}other{# 個建議}}</translation> -<translation id="2071156619270205202">這張卡片不能建立虛擬卡號。</translation> +<translation id="2071156619270205202">此卡不能建立虛擬卡號。</translation> <translation id="2071692954027939183">由於您通常不允許通知,因此系統已自動封鎖通知</translation> <translation id="2079545284768500474">復原</translation> <translation id="20817612488360358">雖然系統 Proxy 設定已設為使用,不過也指定了明確的 Proxy 設定。</translation> @@ -437,7 +436,7 @@ <translation id="2521385132275182522">釘裝 (右下方)</translation> <translation id="2523886232349826891">只會儲存至此裝置</translation> <translation id="2524461107774643265">新增更多資料</translation> -<translation id="2529899080962247600">這個欄位最多只能包含 <ph name="MAX_ITEMS_LIMIT" /> 個項目,超過的項目會遭到忽略。</translation> +<translation id="2529899080962247600">此欄位只能包含 <ph name="MAX_ITEMS_LIMIT" /> 個項目,超過的項目會被忽略。</translation> <translation id="2535659140340599600">{COUNT,plural, =1{和另外 1 個網域}other{和另外 # 個網域}}</translation> <translation id="2536110899380797252">新增地址</translation> <translation id="2539524384386349900">偵測</translation> @@ -632,7 +631,7 @@ <translation id="3320021301628644560">新增帳單地址</translation> <translation id="3324983252691184275">棕紅色</translation> <translation id="3329013043687509092">飽和度</translation> -<translation id="3333762389743153920">不符合虛擬卡片設定資格</translation> +<translation id="3333762389743153920">不符合虛擬卡設定資格</translation> <translation id="3338095232262050444">安全</translation> <translation id="3355823806454867987">變更 Proxy 設定…</translation> <translation id="3360103848165129075">付款處理常式工作表</translation> @@ -1140,7 +1139,7 @@ <translation id="5125394840236832993">B-Plus</translation> <translation id="5126510351761255129">驗證信用卡</translation> <translation id="5135404736266831032">管理地址…</translation> -<translation id="5138014172396933048">目前無法使用虛擬卡片,請洽詢你的銀行</translation> +<translation id="5138014172396933048">目前無法使用虛擬卡,請聯絡您的銀行</translation> <translation id="5138227688689900538">顯示較少</translation> <translation id="514010763713772514">想加快日後的結帳速度嗎?</translation> <translation id="5145883236150621069">政策回應中存在錯誤代碼</translation> @@ -1198,7 +1197,6 @@ <translation id="5314967030527622926">手冊製作工具</translation> <translation id="5316812925700871227">逆時針方向旋轉</translation> <translation id="5317780077021120954">儲存</translation> -<translation id="5321288445143113935">最大化</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />,<ph name="NUM_MATCHES" /> 個入面嘅第 <ph name="MATCH_POSITION" /> 個</translation> <translation id="5324080437450482387">選擇聯絡人資料</translation> <translation id="5327248766486351172">名稱</translation> @@ -1550,11 +1548,11 @@ <translation id="6685834062052613830">請登出並完成設定程序</translation> <translation id="6687335167692595844">要求的字型大小</translation> <translation id="6688743156324860098">更新…</translation> -<translation id="6688775486821967877">目前無法使用虛擬卡片,請稍後再試</translation> +<translation id="6688775486821967877">目前無法使用虛擬卡,請稍後再試</translation> <translation id="6689249931105087298">與黑點壓縮相對</translation> <translation id="6689271823431384964">由於您已登入,因此 Chrome 提議將您的付款卡儲存至 Google 帳戶。您可在設定中變更此行為。持卡人姓名來自您的帳戶。</translation> <translation id="6698381487523150993">已建立:</translation> -<translation id="6699188552522342100">這個網站的資訊正確嗎?</translation> +<translation id="6699188552522342100">此網站的內容正確嗎?</translation> <translation id="6702919718839027939">簡報</translation> <translation id="6710213216561001401">上一個</translation> <translation id="6710594484020273272"><輸入搜尋字詞></translation> @@ -2059,7 +2057,7 @@ <ph name="LIST_ITEM" />Cookie 和網站資料 <ph name="END_LIST" /></translation> <translation id="8574899947864779331">使用 Touch ID 即可加快確認您的付款卡</translation> -<translation id="8577348305244205642">虛擬卡片無法使用</translation> +<translation id="8577348305244205642">虛擬卡無法使用</translation> <translation id="858637041960032120">新增電話號碼</translation> <translation id="8589998999637048520">最佳品質</translation> <translation id="8600271352425265729">僅限這次</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 40da45ad..9f5a4eb 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">先從短邊開始</translation> <translation id="168693727862418163">這項政策的值未通過其結構定義的驗證,因此會遭到忽略。</translation> <translation id="168841957122794586">伺服器憑證含有防護力薄弱的加密編譯金鑰。</translation> -<translation id="1696290444144917273">查看虛擬卡片資料</translation> <translation id="1697532407822776718">大功告成!</translation> <translation id="1699570257714336246">缺少資訊</translation> <translation id="1703835215927279855">Letter</translation> @@ -1199,7 +1198,6 @@ <translation id="5314967030527622926">手冊製作工具</translation> <translation id="5316812925700871227">逆時針旋轉</translation> <translation id="5317780077021120954">儲存</translation> -<translation id="5321288445143113935">最大化</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />,<ph name="NUM_MATCHES" /> 之 <ph name="MATCH_POSITION" /></translation> <translation id="5324080437450482387">選擇聯絡資訊</translation> <translation id="5327248766486351172">名稱</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index acb0582..bc78973d 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -217,7 +217,6 @@ <translation id="1682696192498422849">Umkhawulo omfushane kuqala</translation> <translation id="168693727862418163">Ukubaluleka kwale nqubomgomo kuhlulekile ukuqinisekisa ngokumelene ne-schema sayo futhi ngeke inakwe.</translation> <translation id="168841957122794586">Isitifiketi seseva siqukethe ukhiye we-cryptographic obuthaka.</translation> -<translation id="1696290444144917273">Buka imininingwane yekhadi elibonakalayo</translation> <translation id="1697532407822776718">Senisethiwe nonke!</translation> <translation id="1699570257714336246">Ulwazi alukho</translation> <translation id="1703835215927279855">Incwadi</translation> @@ -1207,7 +1206,6 @@ <translation id="5314967030527622926">Umaka wencwajana</translation> <translation id="5316812925700871227">Zungezisa ngokuphambana newashi</translation> <translation id="5317780077021120954">Londoloza</translation> -<translation id="5321288445143113935">Kukhulisiwe</translation> <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" /> kokungu-<ph name="NUM_MATCHES" /></translation> <translation id="5324080437450482387">Khetha ulwazi lokuxhumana</translation> <translation id="5327248766486351172">Igama</translation>
diff --git a/components/sync/protocol/vault.proto b/components/sync/protocol/vault.proto index fd258590..7e48d87 100644 --- a/components/sync/protocol/vault.proto +++ b/components/sync/protocol/vault.proto
@@ -59,4 +59,5 @@ SecurityDomain security_domain = 1; SecurityDomainMember security_domain_member = 2; SharedMemberKey shared_member_key = 3; + int32 member_type_hint = 4; }
diff --git a/components/sync/trusted_vault/fake_security_domains_server.cc b/components/sync/trusted_vault/fake_security_domains_server.cc index 75b62ac5..9b193db 100644 --- a/components/sync/trusted_vault/fake_security_domains_server.cc +++ b/components/sync/trusted_vault/fake_security_domains_server.cc
@@ -142,6 +142,9 @@ http_request.GetURL().spec(), server_url_.spec() + kSecurityDomainMemberNamePrefix)) { response = HandleGetSecurityDomainMemberRequest(http_request); + } else if (http_request.GetURL() == + GetFullGetSecurityDomainURLForTesting(server_url_)) { + response = HandleGetSecurityDomainRequest(http_request); } else { base::AutoLock autolock(lock_); DVLOG(1) << "Unknown request url: " << http_request.GetURL().spec(); @@ -190,6 +193,11 @@ return new_trusted_vault_key; } +void FakeSecurityDomainsServer::SetRecoverabilityDegraded() { + base::AutoLock autolock(lock_); + state_.is_recoverability_degraded = true; +} + int FakeSecurityDomainsServer::GetMemberCount() const { base::AutoLock autolock(lock_); return state_.public_key_to_shared_keys.size(); @@ -223,6 +231,11 @@ return true; } +int FakeSecurityDomainsServer::GetCurrentEpoch() const { + base::AutoLock autolock(lock_); + return state_.current_epoch; +} + bool FakeSecurityDomainsServer::ReceivedInvalidRequest() const { base::AutoLock autolock(lock_); return state_.received_invalid_request; @@ -275,6 +288,13 @@ state_.public_key_to_shared_keys[member.public_key()] = {shared_key}; auto response = std::make_unique<net::test_server::BasicHttpResponse>(); response->set_code(net::HTTP_OK); + + // TODO(crbug.com/1201659): This logic should be smarter. + if (member.member_type() == + sync_pb::SecurityDomainMember::MEMBER_TYPE_UNSPECIFIED) { + state_.is_recoverability_degraded = false; + } + return response; } @@ -353,4 +373,20 @@ return response; } +std::unique_ptr<net::test_server::HttpResponse> +FakeSecurityDomainsServer::HandleGetSecurityDomainRequest( + const net::test_server::HttpRequest& http_request) { + base::AutoLock autolock(lock_); + + sync_pb::SecurityDomain security_domain; + security_domain.mutable_security_domain_details() + ->mutable_sync_details() + ->set_degraded_recoverability(state_.is_recoverability_degraded); + + auto response = std::make_unique<net::test_server::BasicHttpResponse>(); + response->set_code(net::HTTP_OK); + response->set_content(security_domain.SerializeAsString()); + return response; +} + } // namespace syncer
diff --git a/components/sync/trusted_vault/fake_security_domains_server.h b/components/sync/trusted_vault/fake_security_domains_server.h index e8008cd..c37c7d1 100644 --- a/components/sync/trusted_vault/fake_security_domains_server.h +++ b/components/sync/trusted_vault/fake_security_domains_server.h
@@ -56,8 +56,12 @@ std::vector<uint8_t> RotateTrustedVaultKey( const std::vector<uint8_t>& last_trusted_vault_key); + // Causes the security domain to enter the degraded recoverability state. + void SetRecoverabilityDegraded(); + int GetMemberCount() const; bool AllMembersHaveKey(const std::vector<uint8_t>& trusted_vault_key) const; + int GetCurrentEpoch() const; // Returns true if there was a request that violates supported protocol. bool ReceivedInvalidRequest() const; @@ -71,6 +75,10 @@ HandleGetSecurityDomainMemberRequest( const net::test_server::HttpRequest& http_request); + std::unique_ptr<net::test_server::HttpResponse> + HandleGetSecurityDomainRequest( + const net::test_server::HttpRequest& http_request); + class State { public: State(); @@ -93,6 +101,8 @@ // |constant_key_allowed_| set to true. int current_epoch = 0; bool constant_key_allowed = true; + + bool is_recoverability_degraded = false; }; // This class is used on main thread and on EmbeddedTestServer IO thread, data
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc index 8d5235d..533add4a 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc
@@ -62,6 +62,12 @@ return absl::nullopt; } +void RetrieveIsRecoverabilityDegradedCompleted( + base::OnceCallback<void(bool)> cb, + TrustedVaultRecoverabilityStatus status) { + std::move(cb).Run(status == TrustedVaultRecoverabilityStatus::kDegraded); +} + } // namespace StandaloneTrustedVaultBackend::PendingTrustedRecoveryMethod:: @@ -183,7 +189,8 @@ base::DeleteFile(file_path_); data_.Clear(); AbandonConnectionRequest(); - ongoing_degraded_recoverability_request_.reset(); + ongoing_get_recoverability_request_.reset(); + ongoing_add_recovery_method_request_.reset(); } void StandaloneTrustedVaultBackend::SetPrimaryAccount( @@ -193,7 +200,8 @@ } primary_account_ = primary_account; AbandonConnectionRequest(); - ongoing_degraded_recoverability_request_.reset(); + ongoing_get_recoverability_request_.reset(); + ongoing_add_recovery_method_request_.reset(); if (!primary_account_.has_value()) { DCHECK(!pending_trusted_recovery_method_.has_value()); return; @@ -236,9 +244,13 @@ void StandaloneTrustedVaultBackend::GetIsRecoverabilityDegraded( const CoreAccountInfo& account_info, base::OnceCallback<void(bool)> cb) { - // TODO(crbug.com/1201659): Implement logic. - NOTIMPLEMENTED(); - std::move(cb).Run(is_recoverability_degraded_for_testing_); + // TODO(crbug.com/1201659): Improve this logic properly and add test coverage, + // including throttling and periodic polling. + ongoing_get_recoverability_request_ = + connection_->RetrieveIsRecoverabilityDegraded( + account_info, + base::BindOnce(&RetrieveIsRecoverabilityDegradedCompleted, + std::move(cb))); } void StandaloneTrustedVaultBackend::AddTrustedRecoveryMethod( @@ -292,13 +304,13 @@ } // |this| outlives |connection_| and - // |ongoing_degraded_recoverability_request_|, so it's safe to use + // |ongoing_add_recovery_method_request_|, so it's safe to use // base::Unretained() here. - ongoing_degraded_recoverability_request_ = + ongoing_add_recovery_method_request_ = connection_->RegisterAuthenticationFactor( *primary_account_, last_trusted_vault_key_and_version, SecureBoxKeyPair::GenerateRandom()->public_key(), - AuthenticationFactorType::kUnspecified, + AuthenticationFactorType::kUnspecified, method_type_hint, base::BindOnce( &StandaloneTrustedVaultBackend::OnTrustedRecoveryMethodAdded, base::Unretained(this), std::move(cb))); @@ -319,11 +331,6 @@ return per_user_vault->local_device_registration_info(); } -void StandaloneTrustedVaultBackend::SetRecoverabilityDegradedForTesting() { - is_recoverability_degraded_for_testing_ = true; - delegate_->NotifyRecoverabilityDegradedChanged(); -} - std::vector<uint8_t> StandaloneTrustedVaultBackend::GetLastAddedRecoveryMethodPublicKeyForTesting() const { @@ -406,6 +413,7 @@ ongoing_connection_request_ = connection_->RegisterAuthenticationFactor( *primary_account_, last_trusted_vault_key_and_version, key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, + /*authentication_factor_type_hint=*/absl::nullopt, base::BindOnce(&StandaloneTrustedVaultBackend::OnDeviceRegistered, base::Unretained(this), gaia_id)); DCHECK(ongoing_connection_request_); @@ -491,9 +499,8 @@ void StandaloneTrustedVaultBackend::OnTrustedRecoveryMethodAdded( base::OnceClosure cb, TrustedVaultRegistrationStatus status) { - DCHECK(ongoing_degraded_recoverability_request_); - ongoing_degraded_recoverability_request_ = nullptr; - is_recoverability_degraded_for_testing_ = false; + DCHECK(ongoing_add_recovery_method_request_); + ongoing_add_recovery_method_request_ = nullptr; std::move(cb).Run(); delegate_->NotifyRecoverabilityDegradedChanged();
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.h b/components/sync/trusted_vault/standalone_trusted_vault_backend.h index 5e9904f..02a214e 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend.h +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.h
@@ -105,8 +105,6 @@ sync_pb::LocalDeviceRegistrationInfo GetDeviceRegistrationInfoForTesting( const std::string& gaia_id); - void SetRecoverabilityDegradedForTesting(); - std::vector<uint8_t> GetLastAddedRecoveryMethodPublicKeyForTesting() const; void SetClockForTesting(base::Clock* clock); @@ -199,13 +197,14 @@ // Same as above, but specifically used for recoverability-related requests. // TODO(crbug.com/1201659): Move elsewhere. std::unique_ptr<TrustedVaultConnection::Request> - ongoing_degraded_recoverability_request_; + ongoing_get_recoverability_request_; + std::unique_ptr<TrustedVaultConnection::Request> + ongoing_add_recovery_method_request_; // Used to determine current time, set to base::DefaultClock in prod and can // be overridden in tests. base::Clock* clock_; - bool is_recoverability_degraded_for_testing_ = false; std::vector<uint8_t> last_added_recovery_method_public_key_for_testing_; };
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc index b19352fd..42eecfe 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_backend_unittest.cc
@@ -82,6 +82,7 @@ last_trusted_vault_key_and_version, const SecureBoxPublicKey& authentication_factor_public_key, AuthenticationFactorType authentication_factor_type, + absl::optional<int> authentication_factor_type_hint, RegisterAuthenticationFactorCallback callback), (override)); MOCK_METHOD(std::unique_ptr<Request>, @@ -120,7 +121,7 @@ // To avoid DCHECK failures in tests that exercise SetPrimaryAccount(), // return non-null for RegisterAuthenticationFactor(). This registration // operation will never complete, though. - ON_CALL(*connection_, RegisterAuthenticationFactor(_, _, _, _, _)) + ON_CALL(*connection_, RegisterAuthenticationFactor(_, _, _, _, _, _)) .WillByDefault(testing::InvokeWithoutArgs([&]() { return std::make_unique<TrustedVaultConnection::Request>(); })); @@ -156,12 +157,13 @@ Eq(account_info), OptionalTrustedVaultKeyAndVersionEq(vault_keys.back(), last_vault_key_version), - _, AuthenticationFactorType::kPhysicalDevice, _)) + _, AuthenticationFactorType::kPhysicalDevice, + /*authentication_factor_type_hint=*/Eq(absl::nullopt), _)) .WillOnce( [&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey& device_public_key, - AuthenticationFactorType, + AuthenticationFactorType, absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { device_registration_callback = std::move(callback); @@ -338,11 +340,12 @@ RegisterAuthenticationFactor( Eq(account_info), OptionalTrustedVaultKeyAndVersionEq(kVaultKey, kLastKeyVersion), _, - AuthenticationFactorType::kPhysicalDevice, _)) + AuthenticationFactorType::kPhysicalDevice, + /*authentication_factor_type_hint=*/Eq(absl::nullopt), _)) .WillOnce([&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey& device_public_key, - AuthenticationFactorType, + AuthenticationFactorType, absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { serialized_public_device_key = device_public_key.ExportToBytes(); @@ -380,11 +383,12 @@ backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); TrustedVaultConnection::RegisterAuthenticationFactorCallback device_registration_callback; - ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)) + ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)) .WillByDefault( [&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey&, AuthenticationFactorType, + absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { device_registration_callback = std::move(callback); @@ -393,7 +397,7 @@ clock()->SetNow(base::Time::Now()); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)); // Setting the primary account will trigger device registration. backend()->SetPrimaryAccount(account_info); ASSERT_FALSE(device_registration_callback.is_null()); @@ -406,7 +410,7 @@ // Following request should be throttled. device_registration_callback = TrustedVaultConnection::RegisterAuthenticationFactorCallback(); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)) + EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)) .Times(0); // Reset and set primary account to trigger device registration attempt. backend()->SetPrimaryAccount(absl::nullopt); @@ -417,7 +421,7 @@ // Advance time to pass the throttling duration and trigger another attempt. clock()->Advance(switches::kTrustedVaultServiceThrottlingDuration.Get()); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)); // Reset and set primary account to trigger device registration attempt. backend()->SetPrimaryAccount(absl::nullopt); backend()->SetPrimaryAccount(account_info); @@ -435,11 +439,12 @@ backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion); TrustedVaultConnection::RegisterAuthenticationFactorCallback device_registration_callback; - ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)) + ON_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)) .WillByDefault( [&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey&, AuthenticationFactorType, + absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { device_registration_callback = std::move(callback); @@ -448,7 +453,7 @@ clock()->SetNow(base::Time::Now()); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)); // Setting the primary account will trigger device registration. backend()->SetPrimaryAccount(account_info); ASSERT_FALSE(device_registration_callback.is_null()); @@ -463,7 +468,7 @@ device_registration_callback = TrustedVaultConnection::RegisterAuthenticationFactorCallback(); - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)); + EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)); // Reset and set primary account to trigger device registration attempt. backend()->SetPrimaryAccount(absl::nullopt); backend()->SetPrimaryAccount(account_info); @@ -606,11 +611,11 @@ *connection(), RegisterAuthenticationFactor( account_info, - /*last_trusted_vault_key_and_version=*/Eq(absl::nullopt), _, _, _)) + /*last_trusted_vault_key_and_version=*/Eq(absl::nullopt), _, _, _, _)) .WillOnce([&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey& device_public_key, - AuthenticationFactorType, + AuthenticationFactorType, absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { device_registration_callback = std::move(callback); @@ -667,7 +672,7 @@ const int kLastKeyVersion = 0; const std::vector<uint8_t> kPublicKey = {1, 2, 3, 4}; const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); - const int kUnusedMethodTypeHint = 7; + const int kMethodTypeHint = 7; backend()->SetPrimaryAccount(account_info); backend()->StoreKeys(account_info.gaia, kVaultKeys, kLastKeyVersion); @@ -678,11 +683,12 @@ Eq(account_info), OptionalTrustedVaultKeyAndVersionEq( kVaultKeys.back(), kLastKeyVersion), - _, AuthenticationFactorType::kUnspecified, _)) + _, AuthenticationFactorType::kUnspecified, + Eq(kMethodTypeHint), _)) .WillOnce([&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey& device_public_key, - AuthenticationFactorType, + AuthenticationFactorType, absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { registration_callback = std::move(callback); @@ -691,7 +697,7 @@ base::MockCallback<base::OnceClosure> completion_callback; backend()->AddTrustedRecoveryMethod(account_info.gaia, kPublicKey, - kUnusedMethodTypeHint, + kMethodTypeHint, completion_callback.Get()); // The operation should be in flight. @@ -709,16 +715,16 @@ const int kLastKeyVersion = 0; const std::vector<uint8_t> kPublicKey = {1, 2, 3, 4}; const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user"); - const int kUnusedMethodTypeHint = 7; + const int kMethodTypeHint = 7; backend()->StoreKeys(account_info.gaia, kVaultKeys, kLastKeyVersion); // No request should be issued while there is no primary account. base::MockCallback<base::OnceClosure> completion_callback; - EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _)) + EXPECT_CALL(*connection(), RegisterAuthenticationFactor(_, _, _, _, _, _)) .Times(0); backend()->AddTrustedRecoveryMethod(account_info.gaia, kPublicKey, - kUnusedMethodTypeHint, + kMethodTypeHint, completion_callback.Get()); // Upon setting a primary account, RegisterAuthenticationFactor() should be @@ -728,16 +734,17 @@ registration_callback; EXPECT_CALL(*connection(), RegisterAuthenticationFactor( - _, _, _, AuthenticationFactorType::kPhysicalDevice, _)); + _, _, _, AuthenticationFactorType::kPhysicalDevice, _, _)); EXPECT_CALL(*connection(), RegisterAuthenticationFactor( Eq(account_info), OptionalTrustedVaultKeyAndVersionEq( kVaultKeys.back(), kLastKeyVersion), - _, AuthenticationFactorType::kUnspecified, _)) + _, AuthenticationFactorType::kUnspecified, + Eq(kMethodTypeHint), _)) .WillOnce([&](const CoreAccountInfo&, const absl::optional<TrustedVaultKeyAndVersion>&, const SecureBoxPublicKey& device_public_key, - AuthenticationFactorType, + AuthenticationFactorType, absl::optional<int>, TrustedVaultConnection::RegisterAuthenticationFactorCallback callback) { registration_callback = std::move(callback);
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_client.cc b/components/sync/trusted_vault/standalone_trusted_vault_client.cc index 6cb4886..8e761ba 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_client.cc +++ b/components/sync/trusted_vault/standalone_trusted_vault_client.cc
@@ -283,16 +283,6 @@ std::move(cb)); } -void StandaloneTrustedVaultClient::SetRecoverabilityDegradedForTesting() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(backend_); - backend_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &StandaloneTrustedVaultBackend::SetRecoverabilityDegradedForTesting, - backend_)); -} - void StandaloneTrustedVaultClient:: GetLastAddedRecoveryMethodPublicKeyForTesting( base::OnceCallback<void(const std::vector<uint8_t>&)> callback) {
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_client.h b/components/sync/trusted_vault/standalone_trusted_vault_client.h index a9525b6..1f0ccd3 100644 --- a/components/sync/trusted_vault/standalone_trusted_vault_client.h +++ b/components/sync/trusted_vault/standalone_trusted_vault_client.h
@@ -74,7 +74,6 @@ void FetchBackendPrimaryAccountForTesting( base::OnceCallback<void(const absl::optional<CoreAccountInfo>&)> callback) const; - void SetRecoverabilityDegradedForTesting(); void GetLastAddedRecoveryMethodPublicKeyForTesting( base::OnceCallback<void(const std::vector<uint8_t>&)> callback);
diff --git a/components/sync/trusted_vault/trusted_vault_connection.h b/components/sync/trusted_vault/trusted_vault_connection.h index efaa93c..364985c 100644 --- a/components/sync/trusted_vault/trusted_vault_connection.h +++ b/components/sync/trusted_vault/trusted_vault_connection.h
@@ -103,6 +103,7 @@ last_trusted_vault_key_and_version, const SecureBoxPublicKey& authentication_factor_public_key, AuthenticationFactorType authentication_factor_type, + absl::optional<int> authentication_factor_type_hint, RegisterAuthenticationFactorCallback callback) WARN_UNUSED_RESULT = 0; // Asynchronously attempts to download new vault keys (e.g. keys with version @@ -119,6 +120,7 @@ // Asynchronously attempts to retrieve degraded recoverability status from the // trusted vault server. Caller should hold returned request object until // |callback| call or until request needs to be cancelled. + // TODO(crbug.com/1081649): Avoid term 'retrieve' in this name. virtual std::unique_ptr<Request> RetrieveIsRecoverabilityDegraded( const CoreAccountInfo& account_info, IsRecoverabilityDegradedCallback callback) WARN_UNUSED_RESULT = 0;
diff --git a/components/sync/trusted_vault/trusted_vault_connection_impl.cc b/components/sync/trusted_vault/trusted_vault_connection_impl.cc index 687c9d8..27d850e 100644 --- a/components/sync/trusted_vault/trusted_vault_connection_impl.cc +++ b/components/sync/trusted_vault/trusted_vault_connection_impl.cc
@@ -80,13 +80,17 @@ const absl::optional<TrustedVaultKeyAndVersion>& last_trusted_vault_key_and_version, const SecureBoxPublicKey& public_key, - AuthenticationFactorType authentication_factor_type) { + AuthenticationFactorType authentication_factor_type, + absl::optional<int> authentication_factor_type_hint) { sync_pb::JoinSecurityDomainsRequest request; request.mutable_security_domain()->set_name(kSyncSecurityDomainName); *request.mutable_security_domain_member() = CreateSecurityDomainMember(public_key, authentication_factor_type); *request.mutable_shared_member_key() = CreateSharedMemberKey(last_trusted_vault_key_and_version, public_key); + if (authentication_factor_type_hint.has_value()) { + request.set_member_type_hint(authentication_factor_type_hint.value()); + } return request; } @@ -176,13 +180,15 @@ last_trusted_vault_key_and_version, const SecureBoxPublicKey& public_key, AuthenticationFactorType authentication_factor_type, + absl::optional<int> authentication_factor_type_hint, RegisterAuthenticationFactorCallback callback) { auto request = std::make_unique<TrustedVaultRequest>( TrustedVaultRequest::HttpMethod::kPost, GURL(trusted_vault_service_url_.spec() + kJoinSecurityDomainsURLPath), /*serialized_request_proto=*/ CreateJoinSecurityDomainsRequest(last_trusted_vault_key_and_version, - public_key, authentication_factor_type) + public_key, authentication_factor_type, + authentication_factor_type_hint) .SerializeAsString()); request->FetchAccessTokenAndSendRequest(
diff --git a/components/sync/trusted_vault/trusted_vault_connection_impl.h b/components/sync/trusted_vault/trusted_vault_connection_impl.h index 626b0352..66657326 100644 --- a/components/sync/trusted_vault/trusted_vault_connection_impl.h +++ b/components/sync/trusted_vault/trusted_vault_connection_impl.h
@@ -41,6 +41,7 @@ last_trusted_vault_key_and_version, const SecureBoxPublicKey& authentication_factor_public_key, AuthenticationFactorType authentication_factor_type, + absl::optional<int> authentication_factor_type_hint, RegisterAuthenticationFactorCallback callback) override; std::unique_ptr<Request> DownloadNewKeys(
diff --git a/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc b/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc index fb8690a..95bb4736 100644 --- a/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc +++ b/components/sync/trusted_vault/trusted_vault_connection_impl_unittest.cc
@@ -4,6 +4,7 @@ #include "components/sync/trusted_vault/trusted_vault_connection_impl.h" +#include <string> #include <utility> #include "base/base64url.h" @@ -168,6 +169,7 @@ connection()->RegisterAuthenticationFactor( /*account_info=*/CoreAccountInfo(), kTrustedVaultKeyAndVersion, key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, + /*authentication_factor_type_hint=*/absl::nullopt, TrustedVaultConnection::RegisterAuthenticationFactorCallback()); EXPECT_THAT(request, NotNull()); @@ -225,6 +227,7 @@ /*account_info=*/CoreAccountInfo(), /*last_trusted_vault_key_and_version=*/absl::nullopt, key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, + /*authentication_factor_type_hint=*/absl::nullopt, TrustedVaultConnection::RegisterAuthenticationFactorCallback()); EXPECT_THAT(request, NotNull()); @@ -241,6 +244,7 @@ network::GetUploadData(resource_request))); EXPECT_THAT(deserialized_body.security_domain().name(), Eq(kSyncSecurityDomainName)); + EXPECT_THAT(deserialized_body.member_type_hint(), Eq(0)); std::string public_key_string; AssignBytesToProtoString(key_pair->public_key().ExportToBytes(), @@ -273,6 +277,36 @@ } TEST_F(TrustedVaultConnectionImplTest, + ShouldSendJoinSecurityDomainsRequestTypeHint) { + const int kTypeHint = 19; + const TrustedVaultKeyAndVersion kTrustedVaultKeyAndVersion(kTrustedVaultKey, + /*version=*/1234); + std::unique_ptr<SecureBoxKeyPair> key_pair = MakeTestKeyPair(); + ASSERT_THAT(key_pair, NotNull()); + + std::unique_ptr<TrustedVaultConnection::Request> request = + connection()->RegisterAuthenticationFactor( + /*account_info=*/CoreAccountInfo(), kTrustedVaultKeyAndVersion, + key_pair->public_key(), AuthenticationFactorType::kUnspecified, + /*authentication_factor_type_hint=*/kTypeHint, + TrustedVaultConnection::RegisterAuthenticationFactorCallback()); + EXPECT_THAT(request, NotNull()); + + const network::TestURLLoaderFactory::PendingRequest* pending_request = + GetPendingHTTPRequest(); + ASSERT_THAT(pending_request, NotNull()); + const network::ResourceRequest& resource_request = pending_request->request; + EXPECT_THAT(resource_request.method, Eq("POST")); + EXPECT_THAT(resource_request.url, + Eq(GetFullJoinSecurityDomainsURLForTesting(kTestURL))); + + sync_pb::JoinSecurityDomainsRequest deserialized_body; + ASSERT_TRUE(deserialized_body.ParseFromString( + network::GetUploadData(resource_request))); + EXPECT_THAT(deserialized_body.member_type_hint(), Eq(kTypeHint)); +} + +TEST_F(TrustedVaultConnectionImplTest, ShouldHandleSuccessfulJoinSecurityDomainsRequest) { std::unique_ptr<SecureBoxKeyPair> key_pair = MakeTestKeyPair(); ASSERT_THAT(key_pair, NotNull()); @@ -286,7 +320,7 @@ /*account_info=*/CoreAccountInfo(), TrustedVaultKeyAndVersion(kTrustedVaultKey, /*version=*/1), key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, - callback.Get()); + /*authentication_factor_type_hint=*/absl::nullopt, callback.Get()); ASSERT_THAT(request, NotNull()); EXPECT_CALL(callback, Run(Eq(TrustedVaultRegistrationStatus::kSuccess))); @@ -307,7 +341,7 @@ /*account_info=*/CoreAccountInfo(), TrustedVaultKeyAndVersion(kTrustedVaultKey, /*version=*/1), key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, - callback.Get()); + /*authentication_factor_type_hint=*/absl::nullopt, callback.Get()); ASSERT_THAT(request, NotNull()); EXPECT_CALL(callback, Run(Eq(TrustedVaultRegistrationStatus::kOtherError))); @@ -329,7 +363,7 @@ /*account_info=*/CoreAccountInfo(), TrustedVaultKeyAndVersion(kTrustedVaultKey, /*version=*/1), key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, - callback.Get()); + /*authentication_factor_type_hint=*/absl::nullopt, callback.Get()); ASSERT_THAT(request, NotNull()); // In particular, HTTP_NOT_FOUND indicates that security domain was removed. @@ -353,7 +387,7 @@ /*account_info=*/CoreAccountInfo(), TrustedVaultKeyAndVersion(kTrustedVaultKey, /*version=*/1), key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, - callback.Get()); + /*authentication_factor_type_hint=*/absl::nullopt, callback.Get()); ASSERT_THAT(request, NotNull()); // In particular, HTTP_PRECONDITION_FAILED indicates that @@ -387,7 +421,7 @@ /*account_info=*/CoreAccountInfo(), TrustedVaultKeyAndVersion(kTrustedVaultKey, /*version=*/1), key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, - callback.Get()); + /*authentication_factor_type_hint=*/absl::nullopt, callback.Get()); ASSERT_THAT(request, NotNull()); // No requests should be sent to the network. @@ -407,7 +441,7 @@ /*account_info=*/CoreAccountInfo(), TrustedVaultKeyAndVersion(kTrustedVaultKey, /*version=*/1), key_pair->public_key(), AuthenticationFactorType::kPhysicalDevice, - callback.Get()); + /*authentication_factor_type_hint=*/absl::nullopt, callback.Get()); ASSERT_THAT(request, NotNull()); EXPECT_CALL(callback, Run).Times(0);
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc index 30611ab6..bad220fb 100644 --- a/components/variations/service/variations_field_trial_creator.cc +++ b/components/variations/service/variations_field_trial_creator.cc
@@ -9,15 +9,14 @@ #include <stdio.h> #include <stdlib.h> -#include <memory> #include <set> #include <utility> -#include <vector> #include "base/base_switches.h" #include "base/bind.h" #include "base/build_time.h" #include "base/command_line.h" +#include "base/memory/scoped_refptr.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/pattern.h" @@ -25,7 +24,6 @@ #include "base/system/sys_info.h" #include "base/trace_event/trace_event.h" #include "base/version.h" -#include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/language/core/browser/locale_util.h" #include "components/metrics/metrics_state_manager.h" @@ -186,6 +184,10 @@ PlatformFieldTrials* platform_field_trials, SafeSeedManager* safe_seed_manager, absl::optional<int> low_entropy_source_value) { +#if !defined(OS_ANDROID) && !defined(OS_IOS) + MaybeExtendVariationsSafeMode(metrics_state_manager); +#endif + const base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kEnableBenchmarking) || @@ -582,4 +584,39 @@ return ClientFilterableState::GetCurrentPlatform(); } +#if !defined(OS_ANDROID) && !defined(OS_IOS) +void VariationsFieldTrialCreator::MaybeExtendVariationsSafeMode( + metrics::MetricsStateManager* metrics_state_manager) const { + version_info::Channel channel = client_->GetChannelForVariations(); + if (channel != version_info::Channel::CANARY && + channel != version_info::Channel::DEV) { + return; + } + + int default_group; + scoped_refptr<base::FieldTrial> trial( + base::FieldTrialList::FactoryGetFieldTrial( + "ExtendedVariationsSafeMode", 100, "Default", + base::FieldTrial::ONE_TIME_RANDOMIZED, &default_group)); + + const int control_group = trial->AppendGroup("Control", 33); + trial->AppendGroup("WritePrefs", 33); + const int signal_early_and_write_prefs_group = + trial->AppendGroup("SignalEarlyAndWritePrefs", 33); + const int assigned_group = trial->group(); + + if (assigned_group == default_group || assigned_group == control_group) + return; + + if (assigned_group == signal_early_and_write_prefs_group) + metrics_state_manager->LogHasSessionShutdownCleanly(false); + + // Time the write for two experiment groups: the group which only writes prefs + // and the group which updates and writes prefs. + SCOPED_UMA_HISTOGRAM_SHORT_TIMER( + "Variations.ExtendedSafeMode.WritePrefsTime"); + seed_store_->local_state()->CommitPendingWriteSynchronously(); +} +#endif // !defined(OS_ANDROID) && !defined(OS_IOS) + } // namespace variations
diff --git a/components/variations/service/variations_field_trial_creator.h b/components/variations/service/variations_field_trial_creator.h index 093a5d0..a77def4 100644 --- a/components/variations/service/variations_field_trial_creator.h +++ b/components/variations/service/variations_field_trial_creator.h
@@ -13,6 +13,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/metrics/field_trial.h" +#include "build/build_config.h" #include "components/variations/client_filterable_state.h" #include "components/variations/proto/study.pb.h" #include "components/variations/seed_response.h" @@ -174,6 +175,14 @@ // Get the platform we're running on, respecting OverrideVariationsPlatform(). Study::Platform GetPlatform(); +#if !defined(OS_ANDROID) && !defined(OS_IOS) + // On channels that support the ExtendedVariationsSafeMode experiment, (a) + // assigns the client to an experiment group and (b) applies group-specific + // behavior. Does nothing if the channel does not support the experiment. + void MaybeExtendVariationsSafeMode( + metrics::MetricsStateManager* metrics_state_manager) const; +#endif + PrefService* local_state() { return seed_store_->local_state(); } const PrefService* local_state() const { return seed_store_->local_state(); }
diff --git a/components/variations/service/variations_field_trial_creator_unittest.cc b/components/variations/service/variations_field_trial_creator_unittest.cc index 445d2ff8..9ea0d26a4 100644 --- a/components/variations/service/variations_field_trial_creator_unittest.cc +++ b/components/variations/service/variations_field_trial_creator_unittest.cc
@@ -10,15 +10,24 @@ #include "base/callback.h" #include "base/callback_helpers.h" +#include "base/containers/contains.h" #include "base/feature_list.h" +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" #include "base/macros.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/mock_entropy_provider.h" +#include "base/test/scoped_field_trial_list_resetter.h" +#include "base/test/task_environment.h" #include "base/version.h" #include "build/build_config.h" #include "components/metrics/clean_exit_beacon.h" #include "components/metrics/client_info.h" +#include "components/metrics/metrics_service.h" #include "components/metrics/metrics_state_manager.h" #include "components/metrics/test/test_enabled_state_provider.h" +#include "components/prefs/json_pref_store.h" +#include "components/prefs/pref_service_factory.h" #include "components/prefs/testing_pref_service.h" #include "components/variations/platform_field_trials.h" #include "components/variations/pref_names.h" @@ -39,6 +48,7 @@ using testing::_; using testing::Ge; +using ::testing::NiceMock; using testing::Return; namespace variations { @@ -55,6 +65,21 @@ const char kTestSeedData[] = "a serialized seed, 100% realistic"; const char kTestSeedSignature[] = "a totally valid signature, I swear!"; +#if !defined(OS_ANDROID) && !defined(OS_IOS) +// Trial and group names for the extended variations safe mode experiment. +const char kExtendedSafeMode[] = "ExtendedVariationsSafeMode"; +const char kDefaultGroup[] = "Default"; +const char kControlGroup[] = "Control"; +const char kWritePrefsGroup[] = "WritePrefs"; +const char kSignalEarlyAndWritePrefsGroup[] = "SignalEarlyAndWritePrefs"; + +// The content of an empty prefs file. +const char kEmptyPrefsFile[] = "{}"; + +// The suffix of the |kStabilityExitedCleanly| pref. +const char kExitedCleanly[] = "exited_cleanly"; +#endif // !defined(OS_ANDROID) && !defined(OS_IOS) + // No-op functions used to create a MetricsStateManager. void NoOpStoreClientInfoBackup(const metrics::ClientInfo&) {} std::unique_ptr<metrics::ClientInfo> NoOpLoadClientInfoBackup() { @@ -198,6 +223,11 @@ DISALLOW_COPY_AND_ASSIGN(TestVariationsServiceClient); }; +class MockVariationsServiceClient : public TestVariationsServiceClient { + public: + MOCK_METHOD(version_info::Channel, GetChannel, (), (override)); +}; + class TestVariationsSeedStore : public VariationsSeedStore { public: explicit TestVariationsSeedStore(PrefService* local_state) @@ -288,8 +318,7 @@ class FieldTrialCreatorTest : public ::testing::Test { protected: FieldTrialCreatorTest() { - metrics::CleanExitBeacon::RegisterPrefs(prefs_.registry()); - metrics::MetricsStateManager::RegisterPrefs(prefs_.registry()); + metrics::MetricsService::RegisterPrefs(prefs_.registry()); VariationsService::RegisterPrefs(prefs_.registry()); global_feature_list_ = base::FeatureList::ClearInstanceForTesting(); } @@ -321,7 +350,7 @@ // seed state. const base::Time now = base::Time::Now(); const base::Time recent_time = now - base::TimeDelta::FromMinutes(17); - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) .WillByDefault(Return(false)); EXPECT_CALL( @@ -355,7 +384,7 @@ // With a valid seed on first run, the safe seed manager should be informed of // the active seed state. The last fetch time in this case is expected to be // inferred to be recent. - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) .WillByDefault(Return(false)); const base::Time start_time = base::Time::Now(); @@ -390,7 +419,7 @@ // With an expired seed, there should be no field trials created, and hence no // active state should be passed to the safe seed manager. - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) .WillByDefault(Return(false)); EXPECT_CALL(safe_seed_manager, DoSetActiveSeedState(_, _, _, _)).Times(0); @@ -422,7 +451,7 @@ // With a valid safe seed, the safe seed manager should *not* be informed of // the active seed state. This is an optimization to avoid saving a safe seed // when already running in safe mode. - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()).WillByDefault(Return(true)); EXPECT_CALL(safe_seed_manager, DoSetActiveSeedState(_, _, _, _)).Times(0); @@ -457,7 +486,7 @@ // active seed state. const base::Time now = base::Time::Now(); const base::Time recent_time = now - base::TimeDelta::FromMinutes(17); - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()).WillByDefault(Return(true)); EXPECT_CALL( safe_seed_manager, @@ -503,7 +532,7 @@ TestVariationsServiceClient variations_service_client; TestPlatformFieldTrials platform_field_trials; - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) .WillByDefault(Return(false)); @@ -539,7 +568,7 @@ // Tests that the hardware class is set on Android. TEST_F(FieldTrialCreatorTest, ClientFilterableState_HardwareClass) { - ::testing::NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); + NiceMock<MockSafeSeedManager> safe_seed_manager(&prefs_); ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) .WillByDefault(Return(false)); @@ -556,4 +585,244 @@ } #endif // OS_ANDROID +#if !defined(OS_ANDROID) && !defined(OS_IOS) +class FieldTrialCreatorSafeModeExperimentTest : public FieldTrialCreatorTest { + public: + FieldTrialCreatorSafeModeExperimentTest() + : field_trial_list_(std::make_unique<base::MockEntropyProvider>(0.1)) {} + ~FieldTrialCreatorSafeModeExperimentTest() override = default; + + void SetUp() override { + DisableTestingConfig(); + + // Create a temp prefs file with no prefs. + ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); + prefs_file_ = temp_dir_.GetPath().AppendASCII("write.json"); + ASSERT_LT(0, base::WriteFile(prefs_file_, kEmptyPrefsFile)); + ASSERT_TRUE(PathExists(prefs_file_)); + } + + void TearDown() override { ASSERT_TRUE(base::DeleteFile(prefs_file_)); } + + // Creates and returns a PrefService that uses a real JsonPrefStore rather + // than a TestingPrefStore. + std::unique_ptr<PrefService> CreatePrefService() { + auto pref_registry = base::MakeRefCounted<PrefRegistrySimple>(); + metrics::MetricsService::RegisterPrefs(pref_registry.get()); + VariationsService::RegisterPrefs(pref_registry.get()); + + auto pref_store = base::MakeRefCounted<JsonPrefStore>(prefs_file_); + PrefServiceFactory pref_service_factory; + pref_service_factory.set_user_prefs(pref_store); + return pref_service_factory.Create(pref_registry); + } + + // Sets up the extended safe mode experiment such that |group_name| is the + // active group. Returns the numeric value that denotes the active group. + int SetUpExtendedSafeModeExperiment(const std::string& group_name) { + int default_group; + scoped_refptr<base::FieldTrial> trial( + base::FieldTrialList::FactoryGetFieldTrial( + kExtendedSafeMode, 100, kDefaultGroup, + base::FieldTrial::ONE_TIME_RANDOMIZED, &default_group)); + + int active_group = group_name == kDefaultGroup + ? default_group + : trial->AppendGroup(group_name, 100); + trial->SetForced(); + return active_group; + } + + const base::FilePath file_path() const { return prefs_file_; } + + private: + base::test::TaskEnvironment task_environment_; + base::ScopedTempDir temp_dir_; + base::FilePath prefs_file_; + base::test::ScopedFieldTrialListResetter trial_list_resetter_; + base::FieldTrialList field_trial_list_; +}; + +// TODO(b/184937096): Update this test if and when the extended variations safe +// mode experiment is rolled out to beta or stable. +TEST_F(FieldTrialCreatorSafeModeExperimentTest, DisableExperiment) { + std::unique_ptr<PrefService> pref_service(CreatePrefService()); + + // Ensure that variations safe mode is not triggered. + NiceMock<MockSafeSeedManager> safe_seed_manager(pref_service.get()); + ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) + .WillByDefault(Return(false)); + + std::vector<version_info::Channel> channels = { + version_info::Channel::BETA, version_info::Channel::STABLE, + version_info::Channel::UNKNOWN}; + for (const version_info::Channel channel : channels) { + NiceMock<MockVariationsServiceClient> variations_service_client; + ON_CALL(variations_service_client, GetChannel()) + .WillByDefault(Return(channel)); + + TestVariationsFieldTrialCreator field_trial_creator( + pref_service.get(), &variations_service_client, &safe_seed_manager); + + base::HistogramTester histogram_tester; + ASSERT_TRUE(field_trial_creator.SetupFieldTrials()); + + // Verify that the experiment is not active. + EXPECT_FALSE(base::FieldTrialList::IsTrialActive(kExtendedSafeMode)); + + // Check that no prefs were written and that the WritePrefsTime metric was + // not recorded. + std::string pref_file_contents; + ASSERT_TRUE(base::ReadFileToString(file_path(), &pref_file_contents)); + EXPECT_EQ(kEmptyPrefsFile, pref_file_contents); + histogram_tester.ExpectTotalCount( + "Variations.ExtendedSafeMode.WritePrefsTime", 0); + + base::FeatureList::ClearInstanceForTesting(); + } +} + +TEST_F(FieldTrialCreatorSafeModeExperimentTest, + EnableExperimentOnCanary_DefaultGroup) { + std::unique_ptr<PrefService> pref_service(CreatePrefService()); + + NiceMock<MockVariationsServiceClient> variations_service_client; + ON_CALL(variations_service_client, GetChannel()) + .WillByDefault(Return(version_info::Channel::CANARY)); + + // Ensure that variations safe mode is not triggered. + NiceMock<MockSafeSeedManager> safe_seed_manager(pref_service.get()); + ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) + .WillByDefault(Return(false)); + + TestVariationsFieldTrialCreator field_trial_creator( + pref_service.get(), &variations_service_client, &safe_seed_manager); + + int active_group = SetUpExtendedSafeModeExperiment(kDefaultGroup); + + base::HistogramTester histogram_tester; + ASSERT_TRUE(field_trial_creator.SetupFieldTrials()); + + // Verify that the field trial is active and that the client is in the + // default group. + EXPECT_TRUE(base::FieldTrialList::IsTrialActive(kExtendedSafeMode)); + EXPECT_EQ(active_group, base::FieldTrialList::FindValue(kExtendedSafeMode)); + + // Check that no prefs were written and that the WritePrefsTime metric was + // not recorded. + std::string pref_file_contents; + ASSERT_TRUE(base::ReadFileToString(file_path(), &pref_file_contents)); + EXPECT_EQ(kEmptyPrefsFile, pref_file_contents); + histogram_tester.ExpectTotalCount( + "Variations.ExtendedSafeMode.WritePrefsTime", 0); +} + +TEST_F(FieldTrialCreatorSafeModeExperimentTest, + EnableExperimentOnCanary_ControlGroup) { + std::unique_ptr<PrefService> pref_service(CreatePrefService()); + + NiceMock<MockVariationsServiceClient> variations_service_client; + ON_CALL(variations_service_client, GetChannel()) + .WillByDefault(Return(version_info::Channel::CANARY)); + + // Ensure that variations safe mode is not triggered. + NiceMock<MockSafeSeedManager> safe_seed_manager(pref_service.get()); + ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) + .WillByDefault(Return(false)); + + TestVariationsFieldTrialCreator field_trial_creator( + pref_service.get(), &variations_service_client, &safe_seed_manager); + + int active_group = SetUpExtendedSafeModeExperiment(kControlGroup); + + base::HistogramTester histogram_tester; + ASSERT_TRUE(field_trial_creator.SetupFieldTrials()); + + // Verify that the field trial is active and that the client is in the + // control group. + EXPECT_TRUE(base::FieldTrialList::IsTrialActive(kExtendedSafeMode)); + EXPECT_EQ(active_group, base::FieldTrialList::FindValue(kExtendedSafeMode)); + + // Check that no prefs were written and that the WritePrefsTime metric was + // not recorded. + std::string pref_file_contents; + ASSERT_TRUE(base::ReadFileToString(file_path(), &pref_file_contents)); + EXPECT_EQ(kEmptyPrefsFile, pref_file_contents); + histogram_tester.ExpectTotalCount( + "Variations.ExtendedSafeMode.WritePrefsTime", 0); +} + +TEST_F(FieldTrialCreatorSafeModeExperimentTest, + EnableExperimentOnDev_WritePrefsGroup) { + std::unique_ptr<PrefService> pref_service(CreatePrefService()); + + NiceMock<MockVariationsServiceClient> variations_service_client; + ON_CALL(variations_service_client, GetChannel()) + .WillByDefault(Return(version_info::Channel::DEV)); + + // Ensure that variations safe mode is not triggered. + NiceMock<MockSafeSeedManager> safe_seed_manager(pref_service.get()); + ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) + .WillByDefault(Return(false)); + + TestVariationsFieldTrialCreator field_trial_creator( + pref_service.get(), &variations_service_client, &safe_seed_manager); + + int active_group = SetUpExtendedSafeModeExperiment(kWritePrefsGroup); + + base::HistogramTester histogram_tester; + ASSERT_TRUE(field_trial_creator.SetupFieldTrials()); + + // Verify that the field trial is active and that the client is in the + // WritePrefs group. + EXPECT_TRUE(base::FieldTrialList::IsTrialActive(kExtendedSafeMode)); + EXPECT_EQ(active_group, base::FieldTrialList::FindValue(kExtendedSafeMode)); + + // Check that prefs were written and do not contain |kStabilityExitedCleanly|. + // Also, check that the WritePrefsTime metric was recorded. + std::string pref_file_contents; + ASSERT_TRUE(base::ReadFileToString(file_path(), &pref_file_contents)); + EXPECT_NE(kEmptyPrefsFile, pref_file_contents); + EXPECT_FALSE(base::Contains(pref_file_contents, kExitedCleanly)); + histogram_tester.ExpectTotalCount( + "Variations.ExtendedSafeMode.WritePrefsTime", 1); +} + +TEST_F(FieldTrialCreatorSafeModeExperimentTest, + EnableExperimentOnDev_SignalEarlyAndWritePrefsGroup) { + std::unique_ptr<PrefService> pref_service(CreatePrefService()); + + NiceMock<MockVariationsServiceClient> variations_service_client; + ON_CALL(variations_service_client, GetChannel()) + .WillByDefault(Return(version_info::Channel::DEV)); + + // Ensure that variations safe mode is not triggered. + NiceMock<MockSafeSeedManager> safe_seed_manager(pref_service.get()); + ON_CALL(safe_seed_manager, ShouldRunInSafeMode()) + .WillByDefault(Return(false)); + + TestVariationsFieldTrialCreator field_trial_creator( + pref_service.get(), &variations_service_client, &safe_seed_manager); + + int active_group = + SetUpExtendedSafeModeExperiment(kSignalEarlyAndWritePrefsGroup); + + base::HistogramTester histogram_tester; + ASSERT_TRUE(field_trial_creator.SetupFieldTrials()); + + // Verify that the field trial is active and that the client is in the + // SignalEarlyAndWritePrefs group. + EXPECT_TRUE(base::FieldTrialList::IsTrialActive(kExtendedSafeMode)); + EXPECT_EQ(active_group, base::FieldTrialList::FindValue(kExtendedSafeMode)); + + // Check that prefs were written and contain |kStabilityExitedCleanly|. Also, + // check that the WritePrefsTime metric was recorded. + std::string pref_file_contents; + ASSERT_TRUE(base::ReadFileToString(file_path(), &pref_file_contents)); + EXPECT_TRUE(base::Contains(pref_file_contents, kExitedCleanly)); + histogram_tester.ExpectTotalCount( + "Variations.ExtendedSafeMode.WritePrefsTime", 1); +} +#endif // !defined(OS_ANDROID) && !defined(OS_IOS) + } // namespace variations
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc index c338231..e2bff3003 100644 --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc
@@ -35,6 +35,9 @@ #endif }; +const base::Feature kDelegatedCompositing{"DelegatedCompositing", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kSimpleFrameRateThrottling{ "SimpleFrameRateThrottling", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -147,6 +150,10 @@ return base::FeatureList::IsEnabled(kEnableOverlayPrioritization); } +bool IsDelegatedCompositingEnabled() { + return base::FeatureList::IsEnabled(kDelegatedCompositing); +} + // If a synchronous IPC should used when destroying windows. This exists to test // the impact of removing the sync IPC. bool IsSyncWindowDestructionEnabled() {
diff --git a/components/viz/common/features.h b/components/viz/common/features.h index eb1548f..c4811aa 100644 --- a/components/viz/common/features.h +++ b/components/viz/common/features.h
@@ -48,6 +48,7 @@ VIZ_COMMON_EXPORT bool IsDynamicColorGamutEnabled(); #endif VIZ_COMMON_EXPORT bool IsOverlayPrioritizationEnabled(); +VIZ_COMMON_EXPORT bool IsDelegatedCompositingEnabled(); VIZ_COMMON_EXPORT bool IsSyncWindowDestructionEnabled(); VIZ_COMMON_EXPORT bool IsUsingFastPathForSolidColorQuad(); VIZ_COMMON_EXPORT bool IsUsingSkiaRenderer();
diff --git a/components/viz/common/quads/render_pass_io_unittest.cc b/components/viz/common/quads/render_pass_io_unittest.cc index 390434a..d4e1c75 100644 --- a/components/viz/common/quads/render_pass_io_unittest.cc +++ b/components/viz/common/quads/render_pass_io_unittest.cc
@@ -363,15 +363,15 @@ } TEST(RenderPassIOTest, CompositorFrameData) { - // Validate recorded multi-surface compositor frame data from - // https://www.youtube.com/ + // Validate recorded multi-surface compositor frame data from a tab with + // https://www.youtube.com/ focused, and 4 other tabs in the background. base::FilePath test_data_dir; ASSERT_TRUE(base::PathService::Get(Paths::DIR_TEST_DATA, &test_data_dir)); base::FilePath json_path = test_data_dir.Append(FILE_PATH_LITERAL("render_pass_data")) .Append(FILE_PATH_LITERAL("multi_surface_test")) - .Append(FILE_PATH_LITERAL("youtube")) - .Append(FILE_PATH_LITERAL("0358.json")); + .Append(FILE_PATH_LITERAL("youtube_tab_focused")) + .Append(FILE_PATH_LITERAL("1641.json")); ASSERT_TRUE(base::PathExists(json_path)); std::string json_text; ASSERT_TRUE(base::ReadFileToString(json_path, &json_text));
diff --git a/components/viz/demo/demo_main.cc b/components/viz/demo/demo_main.cc index 372adf0..758f3d9 100644 --- a/components/viz/demo/demo_main.cc +++ b/components/viz/demo/demo_main.cc
@@ -182,7 +182,8 @@ void DispatchEvent(ui::Event* event) override {} void OnCloseRequest() override {} void OnClosed() override {} - void OnWindowStateChanged(ui::PlatformWindowState new_state) override {} + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override {} void OnLostCapture() override {} void OnWillDestroyAcceleratedWidget() override {} void OnAcceleratedWidgetDestroyed() override {}
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index 7692a2a..e534202 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -327,6 +327,8 @@ if (use_ozone) { sources += [ + "display/overlay_processor_delegated.cc", + "display/overlay_processor_delegated.h", "display/overlay_processor_ozone.cc", "display/overlay_processor_ozone.h", "display_embedder/software_output_device_ozone.cc",
diff --git a/components/viz/service/debugger/viz_debugger.cc b/components/viz/service/debugger/viz_debugger.cc index 601a0cb..c86cef4 100644 --- a/components/viz/service/debugger/viz_debugger.cc +++ b/components/viz/service/debugger/viz_debugger.cc
@@ -18,6 +18,10 @@ namespace viz { +// Version the protocol in case we ever want or need backwards compatibility +// support. +static const int kVizDebuggerVersion = 1; + std::atomic<bool> VizDebugger::enabled_; VizDebugger* VizDebugger::GetInstance() { @@ -79,6 +83,7 @@ submission_count_ = 0; base::DictionaryValue global_dict; + global_dict.SetInteger("version", kVizDebuggerVersion); global_dict.SetString("frame", base::NumberToString(counter)); global_dict.SetInteger("windowx", window_pix.width()); global_dict.SetInteger("windowy", window_pix.height()); @@ -230,6 +235,14 @@ obj_size, pos); } +void VizDebugger::DrawText(const gfx::PointF& pos, + const std::string& text, + const VizDebugger::StaticSource* dcs, + VizDebugger::DrawOption option) { + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); + DrawText(gfx::Vector2dF(pos.OffsetFromOrigin()), text, dcs, option); +} + void VizDebugger::DrawText(const gfx::Point& pos, const std::string& text, const VizDebugger::StaticSource* dcs,
diff --git a/components/viz/service/debugger/viz_debugger.h b/components/viz/service/debugger/viz_debugger.h index b5fb992..6b945e53 100644 --- a/components/viz/service/debugger/viz_debugger.h +++ b/components/viz/service/debugger/viz_debugger.h
@@ -21,6 +21,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/viz/privileged/mojom/viz_main.mojom.h" +#include "ui/gfx/geometry/point_f.h" #include "ui/gfx/geometry/vector2d_f.h" // The visual debugger can be completely disabled/enabled at compile time via @@ -86,6 +87,10 @@ const std::string& text, const StaticSource* dcs, DrawOption option); + void DrawText(const gfx::PointF& pos, + const std::string& text, + const StaticSource* dcs, + DrawOption option); void Draw(const gfx::Size& obj_size, const gfx::Vector2dF& pos, const StaticSource* dcs, @@ -202,24 +207,20 @@ } // namespace viz -#define DBG_OPT_RED \ - (viz::VizDebugger::DrawOption) { 255, 0, 0, 0 } -#define DBG_OPT_GREEN \ - (viz::VizDebugger::DrawOption) { 0, 255, 0, 0 } -#define DBG_OPT_BLUE \ - (viz::VizDebugger::DrawOption) { 0, 0, 255, 0 } -#define DBG_OPT_BLACK \ - (viz::VizDebugger::DrawOption) { 0, 0, 0, 0 } +#define DBG_OPT_RED viz::VizDebugger::DrawOption({255, 0, 0, 0}) +#define DBG_OPT_GREEN viz::VizDebugger::DrawOption({0, 255, 0, 0}) +#define DBG_OPT_BLUE viz::VizDebugger::DrawOption({0, 0, 255, 0}) +#define DBG_OPT_BLACK viz::VizDebugger::DrawOption({0, 0, 0, 0}) -#define DBG_DRAW_RECTANGLE_OPT(anno, option, pos, size) \ - do { \ - if (viz::VizDebugger::IsEnabled()) { \ - static VizDebugger::StaticSource dcs(anno, __FILE__, __LINE__, \ - __func__); \ - if (dcs.IsActive()) { \ - viz::VizDebugger::GetInstance()->Draw(size, pos, &dcs, option); \ - } \ - } \ +#define DBG_DRAW_RECTANGLE_OPT(anno, option, pos, size) \ + do { \ + if (viz::VizDebugger::IsEnabled()) { \ + static viz::VizDebugger::StaticSource dcs(anno, __FILE__, __LINE__, \ + __func__); \ + if (dcs.IsActive()) { \ + viz::VizDebugger::GetInstance()->Draw(size, pos, &dcs, option); \ + } \ + } \ } while (0) #define DBG_DRAW_RECTANGLE(anno, pos, size) \ @@ -228,8 +229,8 @@ #define DBG_DRAW_TEXT_OPT(anno, option, pos, text) \ do { \ if (viz::VizDebugger::IsEnabled()) { \ - static VizDebugger::StaticSource dcs(anno, __FILE__, __LINE__, \ - __func__); \ + static viz::VizDebugger::StaticSource dcs(anno, __FILE__, __LINE__, \ + __func__); \ if (dcs.IsActive()) { \ viz::VizDebugger::GetInstance()->DrawText(pos, text, &dcs, option); \ } \ @@ -239,24 +240,25 @@ #define DBG_DRAW_TEXT(anno, pos, text) \ DBG_DRAW_TEXT_OPT(anno, DBG_OPT_BLACK, pos, text) -#define DBG_LOG_OPT(anno, option, format, ...) \ - do { \ - if (VizDebugger::IsEnabled()) { \ - static VizDebugger::StaticSource dcs(anno, __FILE__, __LINE__, \ - __func__); \ - if (dcs.IsActive()) { \ - VizDebugger::GetInstance()->AddLogMessage( \ - base::StringPrintf(format, __VA_ARGS__), &dcs, option); \ - } \ - } \ +#define DBG_LOG_OPT(anno, option, format, ...) \ + do { \ + if (viz::VizDebugger::IsEnabled()) { \ + static viz::VizDebugger::StaticSource dcs(anno, __FILE__, __LINE__, \ + __func__); \ + if (dcs.IsActive()) { \ + viz::VizDebugger::GetInstance()->AddLogMessage( \ + base::StringPrintf(format, __VA_ARGS__), &dcs, option); \ + } \ + } \ } while (0) #define DBG_LOG(anno, format, ...) \ DBG_LOG_OPT(anno, DBG_OPT_BLACK, format, __VA_ARGS__) -#define DBG_DRAW_RECT_OPT(anno, option, rect) \ - DBG_DRAW_RECTANGLE( \ - anno, gfx::Vector2dF(rect.origin().x(), rect.origin().y()), rect.size()) +#define DBG_DRAW_RECT_OPT(anno, option, rect) \ + DBG_DRAW_RECTANGLE_OPT(anno, option, \ + gfx::Vector2dF(rect.origin().x(), rect.origin().y()), \ + rect.size()) #define DBG_DRAW_RECT(anno, rect) DBG_DRAW_RECT_OPT(anno, DBG_OPT_BLACK, rect)
diff --git a/components/viz/service/debugger/viz_debugger_unittest.cc b/components/viz/service/debugger/viz_debugger_unittest.cc index d7c2eb56..0b2b39e2a 100644 --- a/components/viz/service/debugger/viz_debugger_unittest.cc +++ b/components/viz/service/debugger/viz_debugger_unittest.cc
@@ -124,6 +124,11 @@ global_dict->FindKey("frame")->GetAsString(&str); base::StringToUint64(str.c_str(), &counter_); static const int kNoVal = -1; + int expected_version = + global_dict->FindKey("version")->GetIfInt().value_or(kNoVal); + // Check to update these unit tests if a backwards compatible change has + // been made. + EXPECT_EQ(1, expected_version); window_x_ = global_dict->FindKey("windowx")->GetIfInt().value_or(kNoVal); window_y_ = global_dict->FindKey("windowy")->GetIfInt().value_or(kNoVal);
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc index 75d4dfb..6bc92ef 100644 --- a/components/viz/service/display/display.cc +++ b/components/viz/service/display/display.cc
@@ -12,6 +12,7 @@ #include "base/containers/contains.h" #include "base/debug/dump_without_crashing.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/string_number_conversions.h" #include "base/timer/elapsed_timer.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" @@ -608,11 +609,18 @@ return; auto& root_render_pass = *frame.render_pass_list.back(); + DBG_LOG_OPT("frame.root.numquads", DBG_OPT_BLUE, "Num root quads=%d", + static_cast<int>(root_render_pass.quad_list.size())); + DBG_DRAW_RECT_OPT("frame.root.damage", DBG_OPT_RED, + root_render_pass.damage_rect); + for (auto* quad : root_render_pass.quad_list) { auto& transform = quad->shared_quad_state->quad_to_target_transform; auto display_rect = gfx::RectF(quad->rect); transform.TransformRect(&display_rect); - + DBG_DRAW_TEXT_OPT("frame.root.material", DBG_OPT_GREEN, + display_rect.origin(), + base::NumberToString(static_cast<int>(quad->material))); DBG_DRAW_RECT("frame.root.quad", display_rect); } }
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc index 31b42663..2fec8021 100644 --- a/components/viz/service/display/display_resource_provider.cc +++ b/components/viz/service/display/display_resource_provider.cc
@@ -15,6 +15,7 @@ #include "base/trace_event/trace_event.h" #include "components/viz/common/resources/resource_sizes.h" #include "gpu/command_buffer/common/shared_image_trace_utils.h" +#include "ui/gfx/geometry/size.h" #include "ui/gl/trace_util.h" namespace viz { @@ -150,6 +151,10 @@ return GetResource(id)->transferable.is_software; } +const gfx::Size DisplayResourceProvider::GetResourceBackedSize(ResourceId id) { + return GetResource(id)->transferable.size; +} + gfx::BufferFormat DisplayResourceProvider::GetBufferFormat(ResourceId id) { return BufferFormat(GetResourceFormat(id)); }
diff --git a/components/viz/service/display/display_resource_provider.h b/components/viz/service/display/display_resource_provider.h index c9cea0d..36b173f3 100644 --- a/components/viz/service/display/display_resource_provider.h +++ b/components/viz/service/display/display_resource_provider.h
@@ -79,6 +79,9 @@ bool DoesResourceWantPromotionHint(ResourceId id); #endif + // Returns the size in pixels of the underlying gpu mailbox/software bitmap. + const gfx::Size GetResourceBackedSize(ResourceId id); + bool IsResourceSoftwareBacked(ResourceId id); // Return the format of the underlying buffer that can be used for scanout. gfx::BufferFormat GetBufferFormat(ResourceId id);
diff --git a/components/viz/service/display/overlay_candidate.cc b/components/viz/service/display/overlay_candidate.cc index cb980331..b76d0ec 100644 --- a/components/viz/service/display/overlay_candidate.cc +++ b/components/viz/service/display/overlay_candidate.cc
@@ -18,10 +18,12 @@ #include "components/viz/common/quads/tile_draw_quad.h" #include "components/viz/common/quads/video_hole_draw_quad.h" #include "components/viz/common/quads/yuv_video_draw_quad.h" +#include "components/viz/service/debugger/viz_debugger.h" #include "components/viz/service/display/display_resource_provider.h" #include "components/viz/service/display/overlay_processor_interface.h" #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/geometry/rect_conversions.h" +#include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/vector3d_f.h" #include "ui/gfx/video_types.h" @@ -133,7 +135,8 @@ const SkMatrix44& output_color_matrix, const DrawQuad* quad, const gfx::RectF& primary_rect, - OverlayCandidate* candidate) { + OverlayCandidate* candidate, + bool allow_delegated_quads) { // It is currently not possible to set a color conversion matrix on an HW // overlay plane. // TODO(https://crbug.com/792757): Remove this check once the bug is resolved. @@ -169,6 +172,12 @@ return FromStreamVideoQuad(resource_provider, surface_damage_rect_list, StreamVideoDrawQuad::MaterialCast(quad), candidate); + case DrawQuad::Material::kTiledContent: + if (!allow_delegated_quads) + return false; + return candidate->FromTileQuad( + resource_provider, surface_damage_rect_list, + TileDrawQuad::MaterialCast(quad), primary_rect, candidate); default: break; } @@ -355,6 +364,36 @@ return true; } +bool OverlayCandidate::FromTileQuad( + DisplayResourceProvider* resource_provider, + SurfaceDamageRectList* surface_damage_rect_list, + const TileDrawQuad* quad, + const gfx::RectF& primary_rect, + OverlayCandidate* candidate) { + if (quad->nearest_neighbor) + return false; + + if (!FromDrawQuadResource(resource_provider, surface_damage_rect_list, quad, + quad->resource_id(), false, candidate)) { + return false; + } + + candidate->resource_size_in_pixels = + resource_provider->GetResourceBackedSize(quad->resource_id()); + + float x = quad->tex_coord_rect.origin().x() / + candidate->resource_size_in_pixels.width(); + float xw = quad->tex_coord_rect.size().width() / + candidate->resource_size_in_pixels.width(); + float y = quad->tex_coord_rect.origin().y() / + candidate->resource_size_in_pixels.height(); + float yh = quad->tex_coord_rect.size().height() / + candidate->resource_size_in_pixels.height(); + candidate->uv_rect = gfx::RectF(x, y, xw, yh); + + return true; +} + // static bool OverlayCandidate::FromTextureQuad( DisplayResourceProvider* resource_provider,
diff --git a/components/viz/service/display/overlay_candidate.h b/components/viz/service/display/overlay_candidate.h index 4649d4d..d2a8bcb 100644 --- a/components/viz/service/display/overlay_candidate.h +++ b/components/viz/service/display/overlay_candidate.h
@@ -11,6 +11,7 @@ #include "base/containers/flat_map.h" #include "build/build_config.h" #include "components/viz/common/quads/aggregated_render_pass.h" +#include "components/viz/common/quads/tile_draw_quad.h" #include "components/viz/common/resources/resource_id.h" #include "components/viz/service/display/aggregated_frame.h" #include "components/viz/service/viz_service_export.h" @@ -43,7 +44,8 @@ const SkMatrix44& output_color_matrix, const DrawQuad* quad, const gfx::RectF& primary_rect, - OverlayCandidate* candidate); + OverlayCandidate* candidate, + bool allow_delegated_quads = false); // Returns true if |quad| will not block quads underneath from becoming // an overlay. static bool IsInvisibleQuad(const DrawQuad* quad); @@ -154,6 +156,12 @@ const TextureDrawQuad* quad, const gfx::RectF& primary_rect, OverlayCandidate* candidate); + + static bool FromTileQuad(DisplayResourceProvider* resource_provider, + SurfaceDamageRectList* surface_damage_rect_list, + const TileDrawQuad* quad, + const gfx::RectF& primary_rect, + OverlayCandidate* candidate); static bool FromStreamVideoQuad( DisplayResourceProvider* resource_provider, SurfaceDamageRectList* surface_damage_rect_list,
diff --git a/components/viz/service/display/overlay_processor_delegated.cc b/components/viz/service/display/overlay_processor_delegated.cc new file mode 100644 index 0000000..5ff4d35 --- /dev/null +++ b/components/viz/service/display/overlay_processor_delegated.cc
@@ -0,0 +1,185 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/viz/service/display/overlay_processor_delegated.h" + +#include <algorithm> +#include <memory> +#include <set> +#include <utility> +#include <vector> + +#include "base/feature_list.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/metrics/histogram_macros.h" +#include "base/strings/stringprintf.h" +#include "base/trace_event/trace_event.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "components/viz/common/features.h" +#include "components/viz/common/quads/solid_color_draw_quad.h" +#include "components/viz/service/debugger/viz_debugger.h" +#include "components/viz/service/display/display_resource_provider.h" +#include "components/viz/service/display/output_surface.h" +#include "components/viz/service/display/overlay_candidate.h" +#include "components/viz/service/display/overlay_processor_interface.h" +#include "components/viz/service/display/overlay_strategy_fullscreen.h" +#include "components/viz/service/display/overlay_strategy_single_on_top.h" +#include "components/viz/service/display/overlay_strategy_underlay.h" +#include "components/viz/service/display/overlay_strategy_underlay_cast.h" +#include "gpu/command_buffer/client/shared_image_interface.h" +#include "gpu/command_buffer/service/shared_image_manager.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rect_conversions.h" +#include "ui/gfx/geometry/vector2d_f.h" +#include "ui/gfx/transform.h" + +#include "components/viz/common/quads/texture_draw_quad.h" + +namespace viz { + +OverlayProcessorDelegated::OverlayProcessorDelegated( + std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates, + std::vector<OverlayStrategy> available_strategies, + gpu::SharedImageInterface* shared_image_interface) + : OverlayProcessorOzone(std::move(overlay_candidates), + available_strategies, + shared_image_interface) {} + +OverlayProcessorDelegated::~OverlayProcessorDelegated() = default; + +bool OverlayProcessorDelegated::AttemptWithStrategies( + const SkMatrix44& output_color_matrix, + const OverlayProcessorInterface::FilterOperationsMap& + render_pass_backdrop_filters, + DisplayResourceProvider* resource_provider, + AggregatedRenderPassList* render_pass_list, + SurfaceDamageRectList* surface_damage_rect_list, + OverlayProcessorInterface::OutputSurfaceOverlayPlane* primary_plane, + OverlayCandidateList* candidates, + std::vector<gfx::Rect>* content_bounds) { + DCHECK(candidates->empty()); + + auto* render_pass = render_pass_list->back().get(); + QuadList* quad_list = &render_pass->quad_list; + const bool allow_delegated_quads = true; + + // Wayland overlay forwarding mechanism does not support putting the same + // buffer on multiple surfaces. We use this |candidate_ids| for best effort + // service and simply skip duplicate resource id quads. + std::set<ResourceId> candidate_ids; + std::vector<QuadList::Iterator> candidate_quads; + for (auto it = quad_list->begin(); it != quad_list->end(); ++it) { + OverlayCandidate candidate; + auto& transform = it->shared_quad_state->quad_to_target_transform; + auto display_rect = gfx::RectF(it->rect); + transform.TransformRect(&display_rect); + DBG_DRAW_TEXT( + "delegated.overlay.type", + gfx::Vector2dF(display_rect.origin().x(), display_rect.origin().y()), + base::StringPrintf("m=%d rid=%d", static_cast<int>(it->material), + it->resources.begin()->value())); + if (OverlayCandidate::FromDrawQuad( + resource_provider, surface_damage_rect_list, output_color_matrix, + *it, GetPrimaryPlaneDisplayRect(primary_plane), &candidate, + allow_delegated_quads)) { + // Setting the |uv_rect| will eventually result in setting the + // |crop_rect_| in wayland. If this results in an empty pixel scale the + // wayland connection will be terminated. See: wayland_surface.cc + // 'UpdateBufferDamageRegion' + auto viewport_src = gfx::ToEnclosedRect(gfx::ScaleRect( + candidate.uv_rect, candidate.resource_size_in_pixels.width(), + candidate.resource_size_in_pixels.height())); + // Because of the device scale factor (2) we check against a rounded empty + // rect. + // TODO(https://crbug.com/1218678) : Move and generalize this fix in + // wayland host. + if (viewport_src.width() <= 2 || viewport_src.height() <= 2) { + DBG_DRAW_RECT("delegated.overlay.subpixelskip", candidate.display_rect); + continue; + } + + if (candidate_ids.find(candidate.resource_id) == candidate_ids.end()) { + candidate_ids.insert(candidate.resource_id); + DBG_DRAW_RECT("delegated.overlay.candidate", candidate.display_rect); + candidates->push_back(candidate); + candidate_quads.push_back(it); + } else { + DBG_DRAW_RECT("delegated.overlay.dupskip", candidate.display_rect); + } + + } else { + DBG_DRAW_RECT("delegated.overlay.failed", display_rect); + } + } + + if (candidates->empty()) + return false; + + int curr_plane_order = candidates->size(); + for (auto&& each : *candidates) { + each.plane_z_order = curr_plane_order--; + } + // Check for support. + this->CheckOverlaySupport(primary_plane, candidates); + + // Reverse iterate to avoid iterator invalidation of future elements. + auto quad_to_iter = candidate_quads.rbegin(); + for (auto candidate = candidates->rbegin(); candidate != candidates->rend(); + candidate++, quad_to_iter++) { + if (candidate->overlay_handled) { + quad_list->EraseAndInvalidateAllPointers(*quad_to_iter); + } + } + + return true; +} + +gfx::RectF OverlayProcessorDelegated::GetPrimaryPlaneDisplayRect( + const OverlayProcessorInterface::OutputSurfaceOverlayPlane* primary_plane) { + return primary_plane ? primary_plane->display_rect : gfx::RectF(); +} + +void OverlayProcessorDelegated::ProcessForOverlays( + DisplayResourceProvider* resource_provider, + AggregatedRenderPassList* render_passes, + const SkMatrix44& output_color_matrix, + const OverlayProcessorInterface::FilterOperationsMap& render_pass_filters, + const OverlayProcessorInterface::FilterOperationsMap& + render_pass_backdrop_filters, + SurfaceDamageRectList surface_damage_rect_list, + OutputSurfaceOverlayPlane* output_surface_plane, + CandidateList* candidates, + gfx::Rect* damage_rect, + std::vector<gfx::Rect>* content_bounds) { + DCHECK(candidates->empty()); + auto* render_pass = render_passes->back().get(); + bool success = false; + + DBG_DRAW_RECT("delegated.incoming.damage", (*damage_rect)); + for (auto&& each : surface_damage_rect_list) { + DBG_DRAW_RECT("delegated.surface.damage", each); + } + + // If we have any copy requests, we can't remove any quads for overlays or + // CALayers because the framebuffer would be missing the removed quads' + // contents. + if (render_pass->copy_requests.empty()) { + success = AttemptWithStrategies( + output_color_matrix, render_pass_backdrop_filters, resource_provider, + render_passes, &surface_damage_rect_list, output_surface_plane, + candidates, content_bounds); + } + + DCHECK(candidates->empty() || success); + // TODO(petermcneeley) : Actually modify the damage here. When all damaged + // quads are forwarded the damage here will be empty. + DBG_DRAW_RECT("delegated.outgoing.damage", (*damage_rect)); + + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("viz.debug.overlay_planes"), + "Scheduled overlay planes", candidates->size()); +} + +} // namespace viz
diff --git a/components/viz/service/display/overlay_processor_delegated.h b/components/viz/service/display/overlay_processor_delegated.h new file mode 100644 index 0000000..28eeff4c --- /dev/null +++ b/components/viz/service/display/overlay_processor_delegated.h
@@ -0,0 +1,88 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_DELEGATED_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_DELEGATED_H_ + +#include <memory> +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/macros.h" +#include "build/build_config.h" +#include "components/viz/common/display/overlay_strategy.h" +#include "components/viz/common/quads/aggregated_render_pass.h" +#include "components/viz/service/display/output_surface.h" +#include "components/viz/service/display/overlay_candidate.h" +#include "components/viz/service/display/overlay_candidate_temporal_tracker.h" +#include "components/viz/service/display/overlay_processor_ozone.h" +#include "components/viz/service/viz_service_export.h" +#include "gpu/ipc/common/surface_handle.h" + +#include "ui/gfx/native_widget_types.h" +#include "ui/ozone/public/overlay_candidates_ozone.h" + +namespace viz { + +// OverlayProcessor subclass that attempts to promote to overlay all the draw +// quads of the root render pass. This is currently only used by LaCros. +// TODO(petermcneeley): This class and its Apple equivalent(s) will eventually +// be refactored in merged together into a unified delegation processor. +// Delegation will just become an extended feature of ozone and we avoid/push +// down platform specific defines and files where possible. +class VIZ_SERVICE_EXPORT OverlayProcessorDelegated + : public OverlayProcessorOzone { + public: + OverlayProcessorDelegated( + std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates, + std::vector<OverlayStrategy> available_strategies, + gpu::SharedImageInterface* shared_image_interface); + ~OverlayProcessorDelegated() override; + + void ProcessForOverlays( + DisplayResourceProvider* resource_provider, + AggregatedRenderPassList* render_passes, + const SkMatrix44& output_color_matrix, + const FilterOperationsMap& render_pass_filters, + const FilterOperationsMap& render_pass_backdrop_filters, + SurfaceDamageRectList surface_damage_rect_list, + OutputSurfaceOverlayPlane* output_surface_plane, + CandidateList* overlay_candidates, + gfx::Rect* damage_rect, + std::vector<gfx::Rect>* content_bounds) final; + + // This function takes a pointer to the absl::optional instance so the + // instance can be reset. When the overlay strategy covers the entire output + // surface, we no longer need the output surface as a separate overlay. This + // is also used by SurfaceControl to adjust rotation. + // TODO(weiliangc): Internalize the |output_surface_plane| inside the overlay + // processor. + void AdjustOutputSurfaceOverlay(absl::optional<OutputSurfaceOverlayPlane>* + output_surface_plane) override {} + + private: + gfx::RectF GetPrimaryPlaneDisplayRect( + const OverlayProcessorInterface::OutputSurfaceOverlayPlane* + primary_plane); + // Iterate through a list of strategies and attempt to overlay with each. + // Returns true if one of the attempts is successful. Has to be called after + // InitializeStrategies(). A |primary_plane| represents the output surface's + // buffer that comes from |BufferQueue|. It is passed in here so it could be + // pass through to hardware through CheckOverlaySupport. It is not passed + // through as a const member because the underlay strategy changes the + // |primary_plane|'s blending setting. + bool AttemptWithStrategies( + const SkMatrix44& output_color_matrix, + const OverlayProcessorInterface::FilterOperationsMap& + render_pass_backdrop_filters, + DisplayResourceProvider* resource_provider, + AggregatedRenderPassList* render_pass_list, + SurfaceDamageRectList* surface_damage_rect_list, + OverlayProcessorInterface::OutputSurfaceOverlayPlane* primary_plane, + OverlayCandidateList* candidates, + std::vector<gfx::Rect>* content_bounds); +}; +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_DELEGATED_H_
diff --git a/components/viz/service/display/overlay_processor_interface.cc b/components/viz/service/display/overlay_processor_interface.cc index ca783e2..8fae14bc 100644 --- a/components/viz/service/display/overlay_processor_interface.cc +++ b/components/viz/service/display/overlay_processor_interface.cc
@@ -23,6 +23,7 @@ #include "components/viz/service/display/overlay_processor_android.h" #include "components/viz/service/display/overlay_processor_surface_control.h" #elif defined(USE_OZONE) +#include "components/viz/service/display/overlay_processor_delegated.h" #include "components/viz/service/display/overlay_processor_ozone.h" #include "ui/base/ui_base_features.h" #include "ui/ozone/public/overlay_manager_ozone.h" @@ -133,6 +134,14 @@ CHECK(shared_image_interface); } +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (features::IsDelegatedCompositingEnabled()) { + return std::make_unique<OverlayProcessorDelegated>( + std::move(overlay_candidates), + std::move(renderer_settings.overlay_strategies), sii); + } +#endif + return std::make_unique<OverlayProcessorOzone>( std::move(overlay_candidates), std::move(renderer_settings.overlay_strategies), sii);
diff --git a/components/viz/service/display/overlay_processor_using_strategy.h b/components/viz/service/display/overlay_processor_using_strategy.h index 242d31b0..0470b3c 100644 --- a/components/viz/service/display/overlay_processor_using_strategy.h +++ b/components/viz/service/display/overlay_processor_using_strategy.h
@@ -142,7 +142,11 @@ OutputSurfaceOverlayPlane* output_surface_plane, CandidateList* overlay_candidates, gfx::Rect* damage_rect, - std::vector<gfx::Rect>* content_bounds) final; + std::vector<gfx::Rect>* content_bounds) + // TODO(petermcneeley) : Restore to "final" once + // |OverlayProcessorDelegated| has been reintegrated into + // |OverlayProcessorOzone|. + override; // This function takes a pointer to the absl::optional instance so the // instance can be reset. When overlay strategy covers the entire output
diff --git a/components/viz/service/display/surface_aggregator_perftest.cc b/components/viz/service/display/surface_aggregator_perftest.cc index 87882aa..9ea4eb0c 100644 --- a/components/viz/service/display/surface_aggregator_perftest.cc +++ b/components/viz/service/display/surface_aggregator_perftest.cc
@@ -2,7 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <unordered_map> +#include <map> +#include <memory> +#include <string> +#include <vector> #include "cc/test/fake_output_surface_client.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" @@ -199,20 +202,28 @@ void SetUpRenderPassListResources( FrameSinkId frame_sink_id, + uint64_t frame_index, CompositorRenderPassList* render_pass_list) { - std::set<ResourceId> created_resources; + std::set<ResourceId> resources_added; for (auto& render_pass : *render_pass_list) { for (auto* quad : render_pass->quad_list) { for (ResourceId resource_id : quad->resources) { - // Don't create multiple resources for the same ResourceId. - if (created_resources.find(resource_id) != created_resources.end()) { + // Only add resources to the resource list once. + if (resources_added.find(resource_id) != resources_added.end()) { continue; } - resource_list_map_[frame_sink_id].push_back( - TransferableResource::MakeSoftware(SharedBitmap::GenerateId(), - quad->rect.size(), RGBA_8888)); - resource_list_map_[frame_sink_id].back().id = resource_id; - created_resources.insert(resource_id); + auto& created_resources = + resource_data_map_[frame_sink_id].created_resources; + // Create the resource if we haven't yet. + if (created_resources.find(resource_id) == created_resources.end()) { + created_resources[resource_id] = TransferableResource::MakeSoftware( + SharedBitmap::GenerateId(), quad->rect.size(), RGBA_8888); + created_resources[resource_id].id = resource_id; + } + resource_data_map_[frame_sink_id] + .resource_lists[frame_index] + .push_back(created_resources[resource_id]); + resources_added.insert(resource_id); } } } @@ -220,19 +231,23 @@ void SubmitCompositorFrame(CompositorFrameSinkSupport* frame_sink, SurfaceId surface_id, + uint64_t frame_index, const CompositorRenderPassList& render_pass_list, - std::vector<SurfaceRange> referenced_surfaces) { + std::vector<SurfaceRange> referenced_surfaces, + bool set_full_damage) { CompositorRenderPassList local_list; CompositorRenderPass::CopyAllForTest(render_pass_list, &local_list); - // Ensure damage encompasses the entire output_rect so everything is - // aggregated. - auto& last_render_pass = *local_list.back(); - last_render_pass.damage_rect = last_render_pass.output_rect; + if (set_full_damage) { + // Ensure damage encompasses the entire output_rect so everything is + // aggregated. + auto& last_render_pass = *local_list.back(); + last_render_pass.damage_rect = last_render_pass.output_rect; + } CompositorFrameBuilder frame_builder; frame_builder.SetRenderPassList(std::move(local_list)) - .SetTransferableResources( - resource_list_map_[surface_id.frame_sink_id()]) + .SetTransferableResources(resource_data_map_[surface_id.frame_sink_id()] + .resource_lists[frame_index]) .SetReferencedSurfaces(std::move(referenced_surfaces)); frame_sink->SubmitCompositorFrame(surface_id.local_surface_id(), frame_builder.Build()); @@ -249,7 +264,8 @@ constexpr FrameSinkId root_frame_sink_id(1, 1); TestSurfaceIdAllocator root_surface_id(root_frame_sink_id); - this->SetUpRenderPassListResources(root_frame_sink_id, &render_pass_list); + this->SetUpRenderPassListResources(root_frame_sink_id, /*frame_index=*/1, + &render_pass_list); aggregator_ = std::make_unique<SurfaceAggregator>( manager_.surface_manager(), resource_provider_.get(), true, true); @@ -263,8 +279,9 @@ timer_.Reset(); do { SubmitCompositorFrame(root_support.get(), root_surface_id, - render_pass_list, - /*referenced_surfaces=*/{}); + /*frame_index=*/1, render_pass_list, + /*referenced_surfaces=*/{}, + /*set_full_damage=*/true); auto aggregated = aggregator_->Aggregate( root_surface_id, next_fake_display_time, gfx::OVERLAY_TRANSFORM_NONE); @@ -272,41 +289,80 @@ timer_.NextLap(); } while (!timer_.HasTimeLimitExpired()); - auto reporter = SetUpSurfaceAggregatorReporter(site + "_json"); + auto reporter = + SetUpSurfaceAggregatorReporter(site + "_single_surface_json"); reporter.AddResult(kMetricSpeedRunsPerS, timer_.LapsPerSecond()); } - void RunMultiSurfacePerfTestFromJson(const std::string& name, size_t index) { - std::vector<FrameData> frame_data_list; - ASSERT_TRUE( - FrameDataFromJson("multi_surface_test", name, index, &frame_data_list)); - ASSERT_FALSE(frame_data_list.empty()); + // Loads FrameData arrays from JSON file(s), submits CompositorFrames, and + // aggregates the result repeatedly for a specified duration. The number of + // laps completed in that time is a proxy for SurfaceAggregator's performance. + // + // For multi-frame tests: + // - Frame sinks are created for all surfaces listed in *any* of the JSON + // files before the timer starts. + // - Every CompositorFrame listed in each frame's JSON file will be + // submitted, in order, for that frame before calling Aggregate. + // - One lap is completed when every frame in the sequence is aggregated. + // - Full damage is set for every CompositorFrame in the first frame of the + // sequence, each lap. + // For single-frame tests (frame_start = frame_end): + // - Non-root surfaces have their CompositorFrames submitted once before the + // timer starts. + // - One loop is complete when the root surface's CompositorFrame is + // submitted and aggregated. + // - Full damage is set for every CompositorFrame submitted. + void RunMultiSurfacePerfTestFromJson(const std::string& name, + size_t frame_start, + size_t frame_end) { + DCHECK_LE(frame_start, frame_end); + bool single_frame = frame_start == frame_end; - const int num_surfaces = frame_data_list.size(); - std::vector<std::unique_ptr<CompositorFrameSinkSupport>> frame_sinks( - num_surfaces); - for (int i = 0; i < num_surfaces; i++) { - auto frame_sink_id = frame_data_list[i].surface_id.frame_sink_id(); - // The first surface represents the root frame sink. - frame_sinks[i] = std::make_unique<CompositorFrameSinkSupport>( - nullptr, &manager_, frame_sink_id, - /*is_root=*/i == 0); - auto& render_pass_list = - frame_data_list[i].compositor_frame.render_pass_list; - this->SetUpRenderPassListResources(frame_sink_id, &render_pass_list); + std::vector<std::vector<FrameData>> frames; + for (size_t i = frame_start; i <= frame_end; ++i) { + std::vector<FrameData> frame; + ASSERT_TRUE(FrameDataFromJson("multi_surface_test", name, i, &frame)); + ASSERT_FALSE(frame.empty()); + frames.push_back(std::move(frame)); } - // We only need to submit the non-root surfaces (i = [1, N-1]) once, but - // we'll submit the root surface every lap. - // Loop in reverse order so surfaces are always submitted before their - // parents are. - for (int i = frame_data_list.size() - 1; i >= 1; --i) { - auto surface_id = frame_data_list[i].surface_id; - auto& render_pass_list = - frame_data_list[i].compositor_frame.render_pass_list; - auto& referenced_surfaces = - frame_data_list[i].compositor_frame.metadata.referenced_surfaces; - SubmitCompositorFrame(frame_sinks[i].get(), surface_id, render_pass_list, - referenced_surfaces); + + // Setup all of the frame sinks. + std::map<FrameSinkId, std::unique_ptr<CompositorFrameSinkSupport>> + frame_sinks; + for (auto& frame : frames) { + for (auto& frame_data : frame) { + auto frame_sink_id = frame_data.surface_id.frame_sink_id(); + if (frame_sinks.find(frame_sink_id) == frame_sinks.end()) { + // The first surface in the first frame is the root surface. + frame_sinks[frame_sink_id] = + std::make_unique<CompositorFrameSinkSupport>( + nullptr, &manager_, frame_sink_id, + /*is_root=*/frame_sinks.empty()); + } + + this->SetUpRenderPassListResources( + frame_sink_id, frame_data.frame_index, + &frame_data.compositor_frame.render_pass_list); + } + } + + if (single_frame) { + // We only need to submit the non-root surfaces (i = [1, N-1]) once, but + // we'll submit the root surface every lap. + // Loop in reverse order so surfaces are always submitted before their + // parents are. + auto& frame = frames[0]; + for (int i = frame.size() - 1; i >= 1; --i) { + auto& surface_id = frame[i].surface_id; + auto frame_index = frame[i].frame_index; + auto& render_pass_list = frame[i].compositor_frame.render_pass_list; + auto& referenced_surfaces = + frame[i].compositor_frame.metadata.referenced_surfaces; + SubmitCompositorFrame(frame_sinks[surface_id.frame_sink_id()].get(), + surface_id, frame_index, render_pass_list, + referenced_surfaces, + /*set_full_damage=*/true); + } } aggregator_ = std::make_unique<SurfaceAggregator>( @@ -316,20 +372,35 @@ base::TimeTicks() + base::TimeDelta::FromSeconds(1); timer_.Reset(); do { - // For a single frame test we only need to submit a CompositorFrame for - // the root surface. - const auto& root_surface_data = frame_data_list[0]; - auto surface_id = root_surface_data.surface_id; - auto& render_pass_list = - root_surface_data.compositor_frame.render_pass_list; - auto& referenced_surfaces = - root_surface_data.compositor_frame.metadata.referenced_surfaces; - SubmitCompositorFrame(frame_sinks[0].get(), surface_id, render_pass_list, - referenced_surfaces); + int frame_num = 0; + for (auto& frame : frames) { + size_t surface_index = 0; + for (auto& frame_data : frame) { + // For single-frame tests, only submit the root surface's + // CompositorFrame. + if (single_frame && surface_index != 0) { + continue; + } + auto& surface_id = frame_data.surface_id; + auto frame_index = frame_data.frame_index; + auto& render_pass_list = frame_data.compositor_frame.render_pass_list; + auto& referenced_surfaces = + frame_data.compositor_frame.metadata.referenced_surfaces; + // For multi-frame tests, only set the full damage for the first frame + // in the sequence. + bool set_full_damage = single_frame || frame_num == 0; - auto aggregated = aggregator_->Aggregate(root_surface_data.surface_id, - next_fake_display_time, - gfx::OVERLAY_TRANSFORM_NONE); + SubmitCompositorFrame(frame_sinks[surface_id.frame_sink_id()].get(), + surface_id, frame_index, render_pass_list, + referenced_surfaces, set_full_damage); + surface_index++; + } + // Always aggregate the root surface. + auto aggregated = aggregator_->Aggregate(frames[0][0].surface_id, + next_fake_display_time, + gfx::OVERLAY_TRANSFORM_NONE); + frame_num++; + } next_fake_display_time += BeginFrameArgs::DefaultInterval(); timer_.NextLap(); @@ -341,12 +412,17 @@ } protected: + struct ResourceData { + // Resource list for each frame_index. + std::map<uint64_t, std::vector<TransferableResource>> resource_lists; + std::map<ResourceId, TransferableResource> created_resources; + }; + ServerSharedBitmapManager shared_bitmap_manager_; FrameSinkManagerImpl manager_; std::unique_ptr<DisplayResourceProvider> resource_provider_; std::unique_ptr<SurfaceAggregator> aggregator_; - // List of resources for each client_id. - std::map<FrameSinkId, std::vector<TransferableResource>> resource_list_map_; + std::map<FrameSinkId, ResourceData> resource_data_map_; }; TEST_F(SurfaceAggregatorPerfTest, ManySurfacesOpaque) { @@ -404,7 +480,7 @@ } #define TOP_REAL_WORLD_DESKTOP_RENDERER_PERF_TEST(SITE, FRAME) \ - TEST_F(SurfaceAggregatorPerfTest, SITE##_JsonTest) { \ + TEST_F(SurfaceAggregatorPerfTest, SITE##_SingleSurfaceTest) { \ this->RunSingleSurfaceRenderPassListFromJson( \ /*tag=*/"top_real_world_desktop", /*site=*/#SITE, /*year=*/2018, \ /*frame_index=*/FRAME); \ @@ -431,15 +507,16 @@ TOP_REAL_WORLD_DESKTOP_RENDERER_PERF_TEST(yahoo_answers, 74) TOP_REAL_WORLD_DESKTOP_RENDERER_PERF_TEST(yahoo_sports, 269) -#define MULTI_SURFACE_PERF_TEST(NAME, FRAME) \ - TEST_F(SurfaceAggregatorPerfTest, NAME##_MultiSurfaceTest) { \ - this->RunMultiSurfacePerfTestFromJson(/*name=*/#NAME, \ - /*frame_index=*/FRAME); \ +#define MULTI_SURFACE_PERF_TEST(TESTNAME, NAME, FRAME_START, FRAME_END) \ + TEST_F(SurfaceAggregatorPerfTest, TESTNAME##_MultiSurfaceTest) { \ + this->RunMultiSurfacePerfTestFromJson(#NAME, FRAME_START, FRAME_END); \ } -MULTI_SURFACE_PERF_TEST(youtube, 358) +MULTI_SURFACE_PERF_TEST(youtube_single_frame, youtube_tab_focused, 1641, 1641) +MULTI_SURFACE_PERF_TEST(youtube_5_frames, youtube_tab_focused, 1641, 1645) #undef TOP_REAL_WORLD_DESKTOP_RENDERER_PERF_TEST +#undef MULTI_SURFACE_PERF_TEST } // namespace } // namespace viz
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 4579f81..3b8db60 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -90,6 +90,64 @@ SkiaOutputSurfaceImpl::ScopedPaint::~ScopedPaint() = default; +SkiaOutputSurfaceImpl::FrameBufferDamageTracker::FrameBufferDamageTracker( + size_t number_of_buffers) + : number_of_buffers_(number_of_buffers) {} + +SkiaOutputSurfaceImpl::FrameBufferDamageTracker::~FrameBufferDamageTracker() = + default; + +void SkiaOutputSurfaceImpl::FrameBufferDamageTracker::ReallocatedFrameBuffers( + const gfx::Size& frame_buffer_size) { + frame_buffer_size_ = frame_buffer_size; + damage_between_frames_.clear(); + cached_current_damage_.reset(); +} + +void SkiaOutputSurfaceImpl::FrameBufferDamageTracker::SwappedWithDamage( + const gfx::Rect& damage) { + damage_between_frames_.push_back(damage); + // Keep at most `number_of_buffers_` frames. + if (damage_between_frames_.size() >= number_of_buffers_) { + damage_between_frames_.pop_front(); + } + cached_current_damage_.reset(); +} + +void SkiaOutputSurfaceImpl::FrameBufferDamageTracker::SkippedSwapWithDamage( + const gfx::Rect& damage) { + if (!damage_between_frames_.empty()) { + damage_between_frames_.back().Union(damage); + cached_current_damage_.reset(); + } else { + // First frame after `ReallocatedFrameBuffers already has full damage. + // So no need to keep track of it with another entry, which would violate + // the condition the deque size is at most `number_of_buffers_ - 1`. + } +} + +gfx::Rect +SkiaOutputSurfaceImpl::FrameBufferDamageTracker::GetCurrentFrameBufferDamage() + const { + if (!cached_current_damage_) + cached_current_damage_ = ComputeCurrentFrameBufferDamage(); + return *cached_current_damage_; +} + +gfx::Rect SkiaOutputSurfaceImpl::FrameBufferDamageTracker:: + ComputeCurrentFrameBufferDamage() const { + // First few frames after `ReallocatedFrameBuffers`. + if (damage_between_frames_.size() < number_of_buffers_ - 1) { + return gfx::Rect(frame_buffer_size_); + } + + gfx::Rect result; + for (auto& damage : damage_between_frames_) { + result.Union(damage); + } + return result; +} + // static std::unique_ptr<SkiaOutputSurface> SkiaOutputSurfaceImpl::Create( DisplayCompositorMemoryAndTaskController* display_controller, @@ -224,11 +282,8 @@ if (use_damage_area_from_skia_output_device_) { damage_of_current_buffer_ = gfx::Rect(size); - } else { - // Reshape will damage all buffers. - current_buffer_ = 0u; - for (auto& damage : accumulated_buffer_damage_) - damage = gfx::Rect(size); + } else if (frame_buffer_damage_tracker_) { + frame_buffer_damage_tracker_->ReallocatedFrameBuffers(size); } // impl_on_gpu_ is released on the GPU thread by a posted task from @@ -427,20 +482,10 @@ // If current_buffer_modified_ is false, it means SkiaRenderer doesn't draw // anything for current frame. So this SwapBuffer() must be a empty swap, so // the previous buffer will be used for this frame. - if (!accumulated_buffer_damage_.empty() && current_buffer_modified_) { + if (frame_buffer_damage_tracker_ && current_buffer_modified_) { gfx::Rect damage_rect = frame.sub_buffer_rect ? *frame.sub_buffer_rect : gfx::Rect(size_); - // Calculate damage area for every buffer. - for (size_t i = 0u; i < accumulated_buffer_damage_.size(); ++i) { - if (i == current_buffer_) { - accumulated_buffer_damage_[i] = gfx::Rect(); - } else { - accumulated_buffer_damage_[i].Union(damage_rect); - } - } - // change the current buffer index to the next buffer in the queue. - if (++current_buffer_ == accumulated_buffer_damage_.size()) - current_buffer_ = 0u; + frame_buffer_damage_tracker_->SwappedWithDamage(damage_rect); } current_buffer_modified_ = false; @@ -461,14 +506,12 @@ void SkiaOutputSurfaceImpl::SwapBuffersSkipped( const gfx::Rect root_pass_damage_rect) { - if (current_buffer_modified_ && !accumulated_buffer_damage_.empty()) { + if (current_buffer_modified_ && frame_buffer_damage_tracker_) { // If |current_buffer_modified_| is true but we skipped swap there is still // damage to the current framebuffer to account for. Unlike SwapBuffers() // don't reset current buffers rect, since that damage still need to be // taken into account when the buffer is swapped later. - for (auto& frame_buffer_damage_rect : accumulated_buffer_damage_) { - frame_buffer_damage_rect.Union(root_pass_damage_rect); - } + frame_buffer_damage_tracker_->SkippedSwapWithDamage(root_pass_damage_rect); } current_buffer_modified_ = false; @@ -765,14 +808,14 @@ capabilities_.supports_post_sub_buffer) { capabilities_.only_invalidates_damage_rect = false; // If there is only one pending frame, then we can use damage area hint from - // SkiaOutputDevice, otherwise we have to track damage area in - // SkiaOutputSurfaceImpl. + // SkiaOutputDevice, otherwise we have to track damage area with + // FrameBufferDamageTracker. if (capabilities_.max_frames_pending == 1 && capabilities_.damage_area_from_skia_output_device) { use_damage_area_from_skia_output_device_ = true; damage_of_current_buffer_ = gfx::Rect(); } else { - accumulated_buffer_damage_.resize(capabilities_.number_of_buffers); + frame_buffer_damage_tracker_.emplace(capabilities_.number_of_buffers); } } return result; @@ -890,12 +933,11 @@ DCHECK(client_); last_swapped_mailbox_ = params.primary_plane_mailbox; - // Reset |accumulated_buffer_damage_|, if buffers are new created. if (params.swap_response.result == gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS) { client_->SetNeedsRedrawRect(gfx::Rect(size_)); - for (auto& damage : accumulated_buffer_damage_) - damage = gfx::Rect(size_); + if (frame_buffer_damage_tracker_) + frame_buffer_damage_tracker_->ReallocatedFrameBuffers(size_); } if (use_damage_area_from_skia_output_device_) { @@ -1148,12 +1190,10 @@ DCHECK(damage_of_current_buffer_); return *damage_of_current_buffer_; } - - if (accumulated_buffer_damage_.empty()) + if (!frame_buffer_damage_tracker_) { return gfx::Rect(); - - DCHECK_LT(current_buffer_, accumulated_buffer_damage_.size()); - return accumulated_buffer_damage_[current_buffer_]; + } + return frame_buffer_damage_tracker_->GetCurrentFrameBufferDamage(); } void SkiaOutputSurfaceImpl::SetNeedsMeasureNextDrawLatency() {
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.h b/components/viz/service/display_embedder/skia_output_surface_impl.h index dea6f741..66c53217 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl.h +++ b/components/viz/service/display_embedder/skia_output_surface_impl.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/callback_helpers.h" +#include "base/containers/circular_deque.h" #include "base/macros.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" @@ -250,6 +251,34 @@ const AggregatedRenderPassId render_pass_id_; }; + // Tracks damage across at most `number_of_buffers`. Note this implementation + // only assumes buffers are used in a circular order, and does not require a + // fixed number of frame buffers to be allocated. + class FrameBufferDamageTracker { + public: + explicit FrameBufferDamageTracker(size_t number_of_buffers); + ~FrameBufferDamageTracker(); + + void ReallocatedFrameBuffers(const gfx::Size& frame_buffer_size); + void SwappedWithDamage(const gfx::Rect& damage); + void SkippedSwapWithDamage(const gfx::Rect& damage); + gfx::Rect GetCurrentFrameBufferDamage() const; + + private: + gfx::Rect ComputeCurrentFrameBufferDamage() const; + + const size_t number_of_buffers_; + gfx::Size frame_buffer_size_; + // This deque should contains the incremental damage of the last N swapped + // frames where N is at most `capabilities_.number_of_buffers - 1`. Each + // rect represents from the incremental damage from the previous frame; note + // if there is no previous frame (eg first swap after a `Reshape`), the + // damage should be the full frame buffer. + base::circular_deque<gfx::Rect> damage_between_frames_; + // Result of `GetCurrentFramebufferDamage` to optimize consecutive calls. + mutable absl::optional<gfx::Rect> cached_current_damage_; + }; + // This holds current paint info absl::optional<ScopedPaint> current_paint_; @@ -321,11 +350,11 @@ bool use_damage_area_from_skia_output_device_ = false; // Damage area of the current buffer. Differ to the last submit buffer. absl::optional<gfx::Rect> damage_of_current_buffer_; - // Current buffer index. - size_t current_buffer_ = 0; - // Accumulates framebuffer damage since last drawing to a particular buffer. - // There is one gfx::Rect per framebuffer. - std::vector<gfx::Rect> accumulated_buffer_damage_; + + // Used when `use_damage_area_from_skia_output_device_` is false and keeps + // track of across multiple frame buffers. Can be nullptr. + absl::optional<FrameBufferDamageTracker> frame_buffer_damage_tracker_; + // Track if the current buffer content is changed. bool current_buffer_modified_ = false;
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc index 47a9fbe..b910b7521 100644 --- a/components/viz/service/gl/gpu_service_impl.cc +++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -17,6 +17,7 @@ #include "base/task/thread_pool.h" #include "base/task_runner_util.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/unguessable_token.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "components/viz/common/features.h" @@ -979,8 +980,10 @@ return; } + auto channel_token = base::UnguessableToken::Create(); gpu::GpuChannel* gpu_channel = gpu_channel_manager_->EstablishChannel( - client_id, client_tracing_id, is_gpu_host, cache_shaders_on_disk); + channel_token, client_id, client_tracing_id, is_gpu_host, + cache_shaders_on_disk); if (!gpu_channel) { // This returns a null handle, which is treated by the client as a failure @@ -992,7 +995,7 @@ mojo::MessagePipe pipe; gpu_channel->Init(pipe.handle0.release(), shutdown_event_); - media_gpu_channel_manager_->AddChannel(client_id); + media_gpu_channel_manager_->AddChannel(client_id, channel_token); std::move(callback).Run(std::move(pipe.handle1), gpu_info_, gpu_feature_info_);
diff --git a/components/viz/test/data/render_pass_data/multi_surface_test/youtube/0358.json b/components/viz/test/data/render_pass_data/multi_surface_test/youtube/0358.json deleted file mode 100644 index e4928488..0000000 --- a/components/viz/test/data/render_pass_data/multi_surface_test/youtube/0358.json +++ /dev/null
@@ -1,2547 +0,0 @@ -[ { - "compositor_frame": { - "metadata": { - "referenced_surfaces": [ { - "end": { - "child_seq": 1, - "client_id": 20, - "embed_token": "40EF4BADBEA6D438ECDA5BCAAD99E819", - "parent_seq": 3, - "sink_id": 2 - }, - "start": { - "child_seq": 1, - "client_id": 20, - "embed_token": "40EF4BADBEA6D438ECDA5BCAAD99E819", - "parent_seq": 3, - "sink_id": 2 - } - } ] - }, - "render_pass_list": { - "metadata": [ { - "quad_count": 1, - "render_pass_id": "152", - "shared_quad_state_count": 1 - }, { - "quad_count": 2, - "render_pass_id": "143", - "shared_quad_state_count": 2 - }, { - "quad_count": 23, - "render_pass_id": "3", - "shared_quad_state_count": 7 - } ], - "render_pass_count": 3, - "render_pass_list": [ { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": false, - "has_transparent_background": true, - "id": "152", - "output_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "quad_list": [ { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "resources": [ 472 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 24.0, - "width": 32.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 970.0, 49.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": false, - "has_transparent_background": true, - "id": "143", - "output_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "quad_list": [ { - "backdrop_filter_quality": 1.0, - "filters_origin": { - "x": 0.0, - "y": 0.0 - }, - "filters_scale": { - "x": 1.0, - "y": 1.0 - }, - "force_anti_aliasing_off": true, - "intersects_damage_under": false, - "mask_texture_size": { - "height": 0, - "width": 0 - }, - "mask_uv_rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "material": "kCompositorRenderPass", - "needs_blending": true, - "rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "render_pass_id": "152", - "resources": [ ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 24.0, - "width": 32.0, - "x": 0.0, - "y": 0.0 - }, - "visible_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - }, { - "color": -16777216, - "force_anti_aliasing_off": true, - "material": "kSolidColor", - "needs_blending": false, - "rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "resources": [ ], - "shared_quad_state_index": 1, - "visible_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kDstIn", - "clip_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 0.10000000149011612, - "quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 970.0, 49.0, 0.0, 1.0 ] - }, { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 22, - "width": 312, - "x": 3, - "y": 1167 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": false, - "id": "3", - "output_rect": { - "height": 1192, - "width": 1148, - "x": 0, - "y": 0 - }, - "quad_list": [ { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 22, - "width": 312, - "x": 0, - "y": 0 - }, - "resources": [ 483 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 22.0, - "width": 312.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 512 - }, - "visible_rect": { - "height": 22, - "width": 312, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 78, - "width": 353, - "x": 0, - "y": 0 - }, - "resources": [ 476 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 78.0, - "width": 353.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 128, - "width": 384 - }, - "visible_rect": { - "height": 78, - "width": 353, - "x": 0, - "y": 0 - } - }, { - "allow_merge": true, - "default_background_color": -394759, - "is_reflection": false, - "material": "kSurfaceContent", - "needs_blending": true, - "rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - }, - "resources": [ ], - "shared_quad_state_index": 2, - "stretch_content": false, - "surface_range": { - "end": { - "child_seq": 1, - "client_id": 20, - "embed_token": "40EF4BADBEA6D438ECDA5BCAAD99E819", - "parent_seq": 3, - "sink_id": 2 - }, - "start": { - "child_seq": 1, - "client_id": 20, - "embed_token": "40EF4BADBEA6D438ECDA5BCAAD99E819", - "parent_seq": 3, - "sink_id": 2 - } - }, - "visible_rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 24, - "width": 16, - "x": 0, - "y": 0 - }, - "resources": [ 469 ], - "shared_quad_state_index": 3, - "tex_coord_rect": { - "height": 24.0, - "width": 16.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 24, - "width": 16, - "x": 0, - "y": 0 - } - }, { - "backdrop_filter_quality": 1.0, - "filters_origin": { - "x": 0.0, - "y": 0.0 - }, - "filters_scale": { - "x": 1.0, - "y": 1.0 - }, - "force_anti_aliasing_off": true, - "intersects_damage_under": false, - "mask_texture_size": { - "height": 0, - "width": 0 - }, - "mask_uv_rect": { - "height": 0.0, - "width": 0.0, - "x": 0.0, - "y": 0.0 - }, - "material": "kCompositorRenderPass", - "needs_blending": true, - "rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "render_pass_id": "143", - "resources": [ ], - "shared_quad_state_index": 4, - "tex_coord_rect": { - "height": 24.0, - "width": 32.0, - "x": 0.0, - "y": 0.0 - }, - "visible_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 28, - "width": 511, - "x": 0, - "y": 0 - }, - "resources": [ 482 ], - "shared_quad_state_index": 5, - "tex_coord_rect": { - "height": 28.0, - "width": 511.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 512 - }, - "visible_rect": { - "height": 28, - "width": 511, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 28, - "width": 413, - "x": 511, - "y": 0 - }, - "resources": [ 473 ], - "shared_quad_state_index": 5, - "tex_coord_rect": { - "height": 28.0, - "width": 413.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 512 - }, - "visible_rect": { - "height": 28, - "width": 413, - "x": 511, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 255, - "width": 255, - "x": 0, - "y": 0 - }, - "resources": [ 471 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 255.0, - "width": 255.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 255, - "width": 255, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 255, - "width": 254, - "x": 255, - "y": 0 - }, - "resources": [ 474 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 255.0, - "width": 254.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 81, - "width": 254, - "x": 255, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 255, - "width": 254, - "x": 509, - "y": 0 - }, - "resources": [ 159 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 255.0, - "width": 254.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 81, - "width": 254, - "x": 509, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 255, - "width": 254, - "x": 763, - "y": 0 - }, - "resources": [ 160 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 255.0, - "width": 254.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 81, - "width": 254, - "x": 763, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 255, - "width": 131, - "x": 1017, - "y": 0 - }, - "resources": [ 475 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 255.0, - "width": 131.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 255, - "width": 131, - "x": 1017, - "y": 0 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 254, - "width": 255, - "x": 0, - "y": 255 - }, - "resources": [ 162 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 254.0, - "width": 255.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 254, - "width": 4, - "x": 0, - "y": 255 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 254, - "width": 131, - "x": 1017, - "y": 255 - }, - "resources": [ 163 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 254.0, - "width": 131.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 254, - "width": 4, - "x": 1144, - "y": 255 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 254, - "width": 255, - "x": 0, - "y": 509 - }, - "resources": [ 164 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 254.0, - "width": 255.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 254, - "width": 4, - "x": 0, - "y": 509 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 254, - "width": 131, - "x": 1017, - "y": 509 - }, - "resources": [ 165 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 254.0, - "width": 131.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 254, - "width": 4, - "x": 1144, - "y": 509 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 254, - "width": 255, - "x": 0, - "y": 763 - }, - "resources": [ 166 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 254.0, - "width": 255.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 254, - "width": 4, - "x": 0, - "y": 763 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 254, - "width": 131, - "x": 1017, - "y": 763 - }, - "resources": [ 167 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 254.0, - "width": 131.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 254, - "width": 4, - "x": 1144, - "y": 763 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 175, - "width": 255, - "x": 0, - "y": 1017 - }, - "resources": [ 168 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 175.0, - "width": 255.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 175, - "width": 255, - "x": 0, - "y": 1017 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 175, - "width": 254, - "x": 255, - "y": 1017 - }, - "resources": [ 169 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 175.0, - "width": 254.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 4, - "width": 254, - "x": 255, - "y": 1188 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 175, - "width": 254, - "x": 509, - "y": 1017 - }, - "resources": [ 170 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 175.0, - "width": 254.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 4, - "width": 254, - "x": 509, - "y": 1188 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 175, - "width": 254, - "x": 763, - "y": 1017 - }, - "resources": [ 171 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 175.0, - "width": 254.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 4, - "width": 254, - "x": 763, - "y": 1188 - } - }, { - "force_anti_aliasing_off": true, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 175, - "width": 131, - "x": 1017, - "y": 1017 - }, - "resources": [ 172 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 175.0, - "width": 131.0, - "x": 1.0, - "y": 1.0 - }, - "texture_size": { - "height": 256, - "width": 256 - }, - "visible_rect": { - "height": 175, - "width": 131, - "x": 1017, - "y": 1017 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 22, - "width": 312, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.0, 1167.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 22, - "width": 312, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 78, - "width": 353, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 655.0, 69.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 78, - "width": 353, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": true, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1107, - "width": 1140, - "x": 4, - "y": 81 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.0, 81.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 24, - "width": 16, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 978.0, 49.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 24, - "width": 16, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 970.0, 49.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 24, - "width": 32, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 28, - "width": 924, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 112.0, 47.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 28, - "width": 924, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": true, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1192, - "width": 1148, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1192, - "width": 1148, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - } ] - } - }, - "frame_index": 341, - "surface_id": { - "child_seq": 1, - "client_id": 0, - "embed_token": "998A37E7C6C2083CAEEDB7EE0F1D0112", - "parent_seq": 1, - "sink_id": 1 - } -}, { - "compositor_frame": { - "metadata": { - "referenced_surfaces": [ ] - }, - "render_pass_list": { - "metadata": [ { - "quad_count": 25, - "render_pass_id": "113", - "shared_quad_state_count": 20 - } ], - "render_pass_count": 1, - "render_pass_list": [ { - "backdrop_filters": [ ], - "cache_render_pass": false, - "color_space": { - "matrix": "RGB", - "primaries": "BT709", - "range": "FULL", - "transfer": "IEC61966_2_1" - }, - "damage_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - }, - "filters": [ ], - "generate_mipmap": false, - "has_damage_from_contributing_content": true, - "has_transparent_background": false, - "id": "113", - "output_rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - }, - "quad_list": [ { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 1107, - "width": 16, - "x": 0, - "y": 0 - }, - "resources": [ 113 ], - "shared_quad_state_index": 0, - "tex_coord_rect": { - "height": 1107.0, - "width": 16.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 1120, - "width": 64 - }, - "visible_rect": { - "height": 1107, - "width": 16, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 1051, - "width": 72, - "x": 0, - "y": 0 - }, - "resources": [ 81 ], - "shared_quad_state_index": 1, - "tex_coord_rect": { - "height": 1051.0, - "width": 72.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 1088, - "width": 128 - }, - "visible_rect": { - "height": 1051, - "width": 72, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 56, - "width": 1124, - "x": 0, - "y": 0 - }, - "resources": [ 91 ], - "shared_quad_state_index": 2, - "tex_coord_rect": { - "height": 56.0, - "width": 1124.0, - "x": 0.0, - "y": 142.0 - }, - "texture_size": { - "height": 288, - "width": 1152 - }, - "visible_rect": { - "height": 56, - "width": 1124, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 56, - "width": 106, - "x": 0, - "y": 0 - }, - "resources": [ 89 ], - "shared_quad_state_index": 3, - "tex_coord_rect": { - "height": 56.0, - "width": 106.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 56, - "width": 106, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 56, - "width": 575, - "x": 0, - "y": 0 - }, - "resources": [ 83 ], - "shared_quad_state_index": 4, - "tex_coord_rect": { - "height": 56.0, - "width": 575.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 576 - }, - "visible_rect": { - "height": 56, - "width": 575, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 56, - "width": 477, - "x": 575, - "y": 0 - }, - "resources": [ 85 ], - "shared_quad_state_index": 4, - "tex_coord_rect": { - "height": 56.0, - "width": 477.0, - "x": 1.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 576 - }, - "visible_rect": { - "height": 56, - "width": 477, - "x": 575, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 58, - "width": 1052, - "x": 0, - "y": 0 - }, - "resources": [ 87 ], - "shared_quad_state_index": 5, - "tex_coord_rect": { - "height": 58.0, - "width": 1052.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 1088 - }, - "visible_rect": { - "height": 58, - "width": 1052, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 80, - "x": 0, - "y": 0 - }, - "resources": [ 110 ], - "shared_quad_state_index": 6, - "tex_coord_rect": { - "height": 18.0, - "width": 80.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 80, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 76, - "x": 0, - "y": 0 - }, - "resources": [ 111 ], - "shared_quad_state_index": 7, - "tex_coord_rect": { - "height": 18.0, - "width": 76.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 76, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 66, - "x": 0, - "y": 0 - }, - "resources": [ 109 ], - "shared_quad_state_index": 8, - "tex_coord_rect": { - "height": 18.0, - "width": 66.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 66, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 60, - "x": 0, - "y": 0 - }, - "resources": [ 104 ], - "shared_quad_state_index": 9, - "tex_coord_rect": { - "height": 18.0, - "width": 60.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 64 - }, - "visible_rect": { - "height": 18, - "width": 60, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - }, - "resources": [ 103 ], - "shared_quad_state_index": 10, - "tex_coord_rect": { - "height": 18.0, - "width": 93.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 100, - "x": 0, - "y": 0 - }, - "resources": [ 105 ], - "shared_quad_state_index": 11, - "tex_coord_rect": { - "height": 18.0, - "width": 100.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 100, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - }, - "resources": [ 77 ], - "shared_quad_state_index": 12, - "tex_coord_rect": { - "height": 18.0, - "width": 93.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 113, - "x": 0, - "y": 0 - }, - "resources": [ 92 ], - "shared_quad_state_index": 13, - "tex_coord_rect": { - "height": 18.0, - "width": 113.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 18, - "width": 113, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 18, - "width": 128, - "x": 0, - "y": 0 - }, - "resources": [ 90 ], - "shared_quad_state_index": 14, - "tex_coord_rect": { - "height": 18.0, - "width": 128.0, - "x": 0.0, - "y": 0.0 - }, - "texture_size": { - "height": 64, - "width": 192 - }, - "visible_rect": { - "height": 18, - "width": 128, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 15, - "width": 141, - "x": 0, - "y": 0 - }, - "resources": [ 78 ], - "shared_quad_state_index": 15, - "tex_coord_rect": { - "height": 15.0, - "width": 141.0, - "x": 0.0, - "y": 3.0 - }, - "texture_size": { - "height": 64, - "width": 192 - }, - "visible_rect": { - "height": 15, - "width": 141, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 15, - "width": 75, - "x": 0, - "y": 0 - }, - "resources": [ 82 ], - "shared_quad_state_index": 16, - "tex_coord_rect": { - "height": 15.0, - "width": 75.0, - "x": 0.0, - "y": 3.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 15, - "width": 75, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": true, - "rect": { - "height": 15, - "width": 84, - "x": 0, - "y": 0 - }, - "resources": [ 79 ], - "shared_quad_state_index": 17, - "tex_coord_rect": { - "height": 15.0, - "width": 84.0, - "x": 0.0, - "y": 3.0 - }, - "texture_size": { - "height": 64, - "width": 128 - }, - "visible_rect": { - "height": 15, - "width": 84, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 190, - "width": 1124, - "x": 0, - "y": 0 - }, - "resources": [ 99 ], - "shared_quad_state_index": 18, - "tex_coord_rect": { - "height": 190.0, - "width": 1124.0, - "x": 0.0, - "y": 97.0 - }, - "texture_size": { - "height": 288, - "width": 1152 - }, - "visible_rect": { - "height": 190, - "width": 1124, - "x": 0, - "y": 0 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 286, - "width": 1124, - "x": 0, - "y": 190 - }, - "resources": [ 100 ], - "shared_quad_state_index": 18, - "tex_coord_rect": { - "height": 286.0, - "width": 1124.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 288, - "width": 1152 - }, - "visible_rect": { - "height": 286, - "width": 1052, - "x": 72, - "y": 190 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 286, - "width": 1124, - "x": 0, - "y": 476 - }, - "resources": [ 101 ], - "shared_quad_state_index": 18, - "tex_coord_rect": { - "height": 286.0, - "width": 1124.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 288, - "width": 1152 - }, - "visible_rect": { - "height": 286, - "width": 1052, - "x": 72, - "y": 476 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 286, - "width": 1124, - "x": 0, - "y": 762 - }, - "resources": [ 106 ], - "shared_quad_state_index": 18, - "tex_coord_rect": { - "height": 286.0, - "width": 1124.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 288, - "width": 1152 - }, - "visible_rect": { - "height": 286, - "width": 1052, - "x": 72, - "y": 762 - } - }, { - "force_anti_aliasing_off": false, - "is_premultiplied": true, - "material": "kTiledContent", - "nearest_neighbor": false, - "needs_blending": false, - "rect": { - "height": 59, - "width": 1124, - "x": 0, - "y": 1048 - }, - "resources": [ 108 ], - "shared_quad_state_index": 18, - "tex_coord_rect": { - "height": 59.0, - "width": 1124.0, - "x": 0.0, - "y": 1.0 - }, - "texture_size": { - "height": 288, - "width": 1152 - }, - "visible_rect": { - "height": 59, - "width": 1052, - "x": 72, - "y": 1048 - } - }, { - "color": -394759, - "force_anti_aliasing_off": false, - "material": "kSolidColor", - "needs_blending": false, - "rect": { - "height": 1107, - "width": 16, - "x": 1124, - "y": 0 - }, - "resources": [ ], - "shared_quad_state_index": 19, - "visible_rect": { - "height": 1107, - "width": 16, - "x": 1124, - "y": 0 - } - } ], - "shared_quad_state_list": [ { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1107, - "width": 16, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1124.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1107, - "width": 16, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": true, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1051, - "width": 72, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 56.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1051, - "width": 72, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1056, - "width": 1124, - "x": 0, - "y": -1000 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 56, - "width": 1124, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 56, - "width": 106, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1018.0, 57.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 56, - "width": 106, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 56, - "width": 1052, - "x": 72, - "y": 57 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 56, - "width": 2033, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0, 57.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 56, - "width": 1052, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 58, - "width": 1052, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0, 56.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 58, - "width": 1052, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 172, - "x": 822, - "y": 1083 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 80, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 1083.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 80, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 88, - "x": 486, - "y": 1083 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 76, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 1083.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 76, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 168, - "x": 150, - "y": 1063 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 66, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 1063.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 66, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 150, - "x": 822, - "y": 681 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 60, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 681.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 60, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 172, - "x": 486, - "y": 681 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 681.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 149, - "x": 150, - "y": 701 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 100, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 701.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 100, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 176, - "x": 822, - "y": 311 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 311.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 93, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 157, - "x": 486, - "y": 291 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 113, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 291.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 113, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 18, - "width": 172, - "x": 150, - "y": 291 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 128, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 291.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 18, - "width": 128, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 15, - "width": 235, - "x": 822, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 141, - "x": 0, - "y": -3 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 15, - "width": 141, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 15, - "width": 234, - "x": 486, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 75, - "x": 0, - "y": -3 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 15, - "width": 75, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": false, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 15, - "width": 172, - "x": 150, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 18, - "width": 84, - "x": 0, - "y": -3 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 15, - "width": 84, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": true, - "blend_mode": "kSrcOver", - "clip_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - }, - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 4396, - "width": 1124, - "x": 0, - "y": -669 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1107, - "width": 1124, - "x": 0, - "y": 0 - } - }, { - "are_contents_opaque": true, - "blend_mode": "kSrcOver", - "de_jelly_delta_y": 0.0, - "is_fast_rounded_corner": false, - "opacity": 1.0, - "quad_layer_rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - }, - "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], - "rounded_corner_bounds": { - "type": "kEmpty" - }, - "sorting_context_id": 0, - "visible_quad_layer_rect": { - "height": 1107, - "width": 1140, - "x": 0, - "y": 0 - } - } ], - "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] - } ] - } - }, - "frame_index": 25, - "surface_id": { - "child_seq": 1, - "client_id": 20, - "embed_token": "40EF4BADBEA6D438ECDA5BCAAD99E819", - "parent_seq": 3, - "sink_id": 2 - } -} ]
diff --git a/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1641.json b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1641.json new file mode 100644 index 0000000..da8294f --- /dev/null +++ b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1641.json
@@ -0,0 +1,5810 @@ +[ { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ { + "end": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + } ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 20, + "render_pass_id": "3", + "shared_quad_state_count": 4 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 22, + "width": 309, + "x": 3, + "y": 1167 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "3", + "output_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 22, + "width": 309, + "x": 0, + "y": 0 + }, + "resources": [ 2104 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 22.0, + "width": 309.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 22, + "width": 309, + "x": 0, + "y": 0 + } + }, { + "allow_merge": true, + "default_background_color": -394759, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 1, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + }, + "visible_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2101 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 28.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + }, + "resources": [ 2096 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 28.0, + "width": 413.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 2093 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 1526 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 1527 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 1528 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + }, + "resources": [ 2095 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 255.0, + "width": 131.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 255 + }, + "resources": [ 1530 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 255 + }, + "resources": [ 1531 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 509 + }, + "resources": [ 1532 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 509 + }, + "resources": [ 1533 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 763 + }, + "resources": [ 1534 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 763 + }, + "resources": [ 1535 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + }, + "resources": [ 1536 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 175.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 255, + "y": 1017 + }, + "resources": [ 1537 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 255, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 509, + "y": 1017 + }, + "resources": [ 1538 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 509, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 763, + "y": 1017 + }, + "resources": [ 1539 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 763, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + }, + "resources": [ 1540 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 175.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 0.27013999223709106, + "quad_layer_rect": { + "height": 22, + "width": 309, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 3.0, 1167.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 22, + "width": 309, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1140, + "x": 4, + "y": 81 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.0, 81.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 112.0, 47.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 1136, + "surface_id": { + "child_seq": 1, + "client_id": 0, + "embed_token": "D1DAE21BA36F9A82630C2B72D2813215", + "parent_seq": 1, + "sink_id": 1 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 18, + "render_pass_id": "113", + "shared_quad_state_count": 14 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 706, + "width": 1042, + "x": 98, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "113", + "output_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + }, + "resources": [ 684 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 1107.0, + "width": 16.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1120, + "width": 64 + }, + "visible_rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + }, + "resources": [ 68 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 1051.0, + "width": 72.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1088, + "width": 128 + }, + "visible_rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 1124, + "x": 0, + "y": 0 + }, + "resources": [ 76 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 56.0, + "width": 1124.0, + "x": 0.0, + "y": 142.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 56, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + }, + "resources": [ 74 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 56.0, + "width": 106.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 575, + "x": 0, + "y": 0 + }, + "resources": [ 70 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 56.0, + "width": 575.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1152 + }, + "visible_rect": { + "height": 56, + "width": 575, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 477, + "x": 575, + "y": 0 + }, + "resources": [ 71 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 56.0, + "width": 477.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 576 + }, + "visible_rect": { + "height": 56, + "width": 477, + "x": 575, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + }, + "resources": [ 72 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 58.0, + "width": 1052.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1088 + }, + "visible_rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + }, + "resources": [ 65 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 18.0, + "width": 238.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + }, + "resources": [ 77 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 18.0, + "width": 82.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + }, + "resources": [ 75 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 18.0, + "width": 113.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + }, + "resources": [ 66 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 18.0, + "width": 147.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 192 + }, + "visible_rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + }, + "resources": [ 69 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 18.0, + "width": 108.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + }, + "resources": [ 67 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 18.0, + "width": 97.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1124, + "x": 0, + "y": 0 + }, + "resources": [ 91 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 287.0, + "width": 1124.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1124, + "x": 0, + "y": 287 + }, + "resources": [ 685 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 286.0, + "width": 1124.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1052, + "x": 72, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1124, + "x": 0, + "y": 573 + }, + "resources": [ 686 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 286.0, + "width": 1124.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1052, + "x": 72, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 248, + "width": 1124, + "x": 0, + "y": 859 + }, + "resources": [ 157 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 248.0, + "width": 1124.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 248, + "width": 1052, + "x": 72, + "y": 859 + } + }, { + "color": -394759, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1107, + "width": 16, + "x": 1124, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 13, + "visible_rect": { + "height": 1107, + "width": 16, + "x": 1124, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1124.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 56.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1056, + "width": 1124, + "x": 0, + "y": -1000 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1018.0, 57.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 56, + "width": 1052, + "x": 72, + "y": 57 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 1904, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0, 57.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 1052, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0, 56.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 238, + "x": 822, + "y": 960 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 960.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 158, + "x": 486, + "y": 980 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 980.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 149, + "x": 150, + "y": 980 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 980.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 157, + "x": 822, + "y": 666 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 666.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 168, + "x": 486, + "y": 666 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 666.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 157, + "x": 150, + "y": 666 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 666.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4194, + "width": 1124, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 350, + "surface_id": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 10, + "render_pass_id": "113", + "shared_quad_state_count": 4 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "113", + "output_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 84, + "width": 15, + "x": 0, + "y": 15 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 26 ], + "secure_output_only": false, + "shared_quad_state_index": 0, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 84, + "width": 15, + "x": 0, + "y": 15 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1107, + "width": 15, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 25 ], + "secure_output_only": false, + "shared_quad_state_index": 0, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1107, + "width": 15, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 49, + "width": 95, + "x": 0, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 49.0, + "width": 95.0, + "x": 480.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 576 + }, + "visible_rect": { + "height": 49, + "width": 95, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 49, + "width": 574, + "x": 95, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 49.0, + "width": 574.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 576 + }, + "visible_rect": { + "height": 49, + "width": 574, + "x": 95, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 49, + "width": 456, + "x": 669, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 49.0, + "width": 456.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 576 + }, + "visible_rect": { + "height": 49, + "width": 456, + "x": 669, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 287, + "width": 1125, + "x": 0, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 287.0, + "width": 1125.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1125, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 287 + }, + "resources": [ 20 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 286.0, + "width": 1125.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 573 + }, + "resources": [ 9 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 286.0, + "width": 1125.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 200, + "width": 1125, + "x": 0, + "y": 859 + }, + "resources": [ 16 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 200.0, + "width": 1125.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 200, + "width": 1125, + "x": 0, + "y": 859 + } + }, { + "color": -2432794, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 3, + "visible_rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1125.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 49, + "width": 1605, + "x": -480, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 49, + "width": 1125, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 14201, + "width": 1125, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 48.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1059, + "width": 1125, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1125, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 8, + "surface_id": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ { + "end": { + "child_seq": 1, + "client_id": 28, + "embed_token": "40C5306C829F7DE2B530ECEE99AA67A2", + "parent_seq": 1, + "sink_id": 7 + } + }, { + "end": { + "child_seq": 1, + "client_id": 41, + "embed_token": "7365690E5327EF5FEEE49BC5721E0703", + "parent_seq": 3, + "sink_id": 13 + } + }, { + "end": { + "child_seq": 1, + "client_id": 43, + "embed_token": "CFBA7140E4B4A4B11DF5AEBCF5701817", + "parent_seq": 2, + "sink_id": 20 + } + } ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 37, + "render_pass_id": "145", + "shared_quad_state_count": 31 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 600, + "width": 300, + "x": 809, + "y": 457 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "145", + "output_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + }, + "resources": [ 13 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 15.0, + "width": 15.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 185, + "width": 15, + "x": 0, + "y": 15 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 35 ], + "secure_output_only": false, + "shared_quad_state_index": 1, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 185, + "width": 15, + "x": 0, + "y": 15 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 1092, + "width": 15, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 34 ], + "secure_output_only": false, + "shared_quad_state_index": 1, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 1092, + "width": 15, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": true, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 15, + "width": 1087, + "x": 15, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 33 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 15, + "width": 1087, + "x": 15, + "y": 0 + }, + "y_flipped": false + }, { + "background_color": 0, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 15, + "width": 1125, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 0, + "width": 0 + }, + "resources": [ 32 ], + "secure_output_only": false, + "shared_quad_state_index": 2, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 15, + "width": 1125, + "x": 0, + "y": 0 + }, + "y_flipped": false + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 46, + "width": 102, + "x": 0, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 46.0, + "width": 102.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 46, + "width": 102, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 50.0, + "width": 50.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "resources": [ 29 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 50.0, + "width": 50.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "resources": [ 27 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 50.0, + "width": 50.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "resources": [ 26 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 50.0, + "width": 50.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 50.0, + "width": 50.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 102, + "width": 246, + "x": 0, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 102.0, + "width": 246.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 102, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 44, + "width": 246, + "x": 0, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 44.0, + "width": 246.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 44, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 258.9999694824219, + "width": 461.9999694824219, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 320, + "width": 512 + }, + "visible_rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 139, + "width": 246, + "x": 0, + "y": 0 + }, + "resources": [ 28 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 139.0, + "width": 246.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 139, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 102, + "width": 247, + "x": 0, + "y": 0 + }, + "resources": [ 24 ], + "shared_quad_state_index": 13, + "tex_coord_rect": { + "height": 102.0, + "width": 247.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 102, + "width": 247, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 259, + "width": 464, + "x": 0, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 14, + "tex_coord_rect": { + "height": 258.9999694824219, + "width": 463.9999694824219, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 320, + "width": 512 + }, + "visible_rect": { + "height": 259, + "width": 464, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 139, + "width": 247, + "x": 0, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 15, + "tex_coord_rect": { + "height": 139.0, + "width": 247.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 139, + "width": 247, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 102, + "width": 246, + "x": 0, + "y": 0 + }, + "resources": [ 18 ], + "shared_quad_state_index": 16, + "tex_coord_rect": { + "height": 102.0, + "width": 246.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 102, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + }, + "resources": [ 15 ], + "shared_quad_state_index": 17, + "tex_coord_rect": { + "height": 258.9999694824219, + "width": 461.9999694824219, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 320, + "width": 512 + }, + "visible_rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 139, + "width": 246, + "x": 0, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 18, + "tex_coord_rect": { + "height": 139.0, + "width": 246.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 192, + "width": 256 + }, + "visible_rect": { + "height": 139, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 88, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 1 ], + "shared_quad_state_index": 19, + "tex_coord_rect": { + "height": 88.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 512 + }, + "visible_rect": { + "height": 88, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 130, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 25 ], + "shared_quad_state_index": 20, + "tex_coord_rect": { + "height": 130.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 512 + }, + "visible_rect": { + "height": 130, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 21, + "tex_coord_rect": { + "height": 288.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 320, + "width": 512 + }, + "visible_rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "color": -16777216, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 22, + "visible_rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 15, + "width": 90, + "x": 0, + "y": 0 + }, + "resources": [ 16 ], + "shared_quad_state_index": 23, + "tex_coord_rect": { + "height": 15.0, + "width": 90.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 15, + "width": 90, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 24, + "tex_coord_rect": { + "height": 90.0, + "width": 970.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 1024 + }, + "visible_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + } + }, { + "allow_merge": true, + "default_background_color": 0, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 25, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 41, + "embed_token": "7365690E5327EF5FEEE49BC5721E0703", + "parent_seq": 3, + "sink_id": 13 + } + }, + "visible_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 188, + "width": 1093, + "x": 0, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 26, + "tex_coord_rect": { + "height": 188.0, + "width": 1093.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 192, + "width": 1152 + }, + "visible_rect": { + "height": 188, + "width": 1093, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 27, + "tex_coord_rect": { + "height": 15.0, + "width": 15.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 64 + }, + "visible_rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "allow_merge": true, + "default_background_color": 0, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 28, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 43, + "embed_token": "CFBA7140E4B4A4B11DF5AEBCF5701817", + "parent_seq": 2, + "sink_id": 20 + } + }, + "visible_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1125, + "x": 0, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 29, + "tex_coord_rect": { + "height": 287.0, + "width": 1125.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1125, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 287 + }, + "resources": [ 43 ], + "shared_quad_state_index": 29, + "tex_coord_rect": { + "height": 286.0, + "width": 1125.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 573 + }, + "resources": [ 44 ], + "shared_quad_state_index": 29, + "tex_coord_rect": { + "height": 286.0, + "width": 1125.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1125, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 233, + "width": 1125, + "x": 0, + "y": 859 + }, + "resources": [ 45 ], + "shared_quad_state_index": 29, + "tex_coord_rect": { + "height": 233.0, + "width": 1125.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 233, + "width": 1125, + "x": 0, + "y": 859 + } + }, { + "color": -723724, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1092, + "width": 15, + "x": 1125, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 30, + "visible_rect": { + "height": 1092, + "width": 15, + "x": 1125, + "y": 0 + } + }, { + "color": -723724, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 15, + "width": 1140, + "x": 0, + "y": 1092 + }, + "resources": [ ], + "shared_quad_state_index": 30, + "visible_rect": { + "height": 15, + "width": 1140, + "x": 0, + "y": 1092 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1125.0, 1092.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1092, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1125.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1092, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 15, + "width": 1125, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1092.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 15, + "width": 1125, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 46, + "width": 102, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 103.0, 1.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 46, + "width": 102, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 35, + "width": 35, + "x": 1057, + "y": 369 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1057.0, 369.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 35, + "width": 35, + "x": 999, + "y": 369 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 999.0, 369.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 35, + "width": 35, + "x": 941, + "y": 369 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 941.0, 369.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 35, + "width": 35, + "x": 883, + "y": 369 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 883.0, 369.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 35, + "width": 35, + "x": 825, + "y": 369 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 0.699999988079071, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 825.0, 369.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 50, + "width": 50, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 246, + "x": 546, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 176, + "width": 247, + "x": -1, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 546.0, 990.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 102, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 246, + "x": 546, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 44, + "width": 246, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 546.0, 946.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 44, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 138, + "width": 246, + "x": 546, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5328184962272644, 0.0, 0.0, 0.0, 0.0, 0.5328184962272644, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 546.0, 852.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 246, + "x": 546, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 140, + "width": 247, + "x": -1, + "y": -1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 546.0, 852.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 139, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 247, + "x": 281, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 175, + "width": 247, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 281.0, 990.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 102, + "width": 247, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 138, + "width": 247, + "x": 281, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 259, + "width": 464, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5328184962272644, 0.0, 0.0, 0.0, 0.0, 0.5328184962272644, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 281.0, 852.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 259, + "width": 464, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 247, + "x": 281, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 140, + "width": 247, + "x": 0, + "y": -1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 281.0, 852.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 139, + "width": 247, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 246, + "x": 17, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 175, + "width": 246, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 990.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 102, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 138, + "width": 246, + "x": 17, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 0.5328184962272644, 0.0, 0.0, 0.0, 0.0, 0.5328184962272644, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 852.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 259, + "width": 462, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 240, + "width": 246, + "x": 17, + "y": 852 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 140, + "width": 247, + "x": 0, + "y": -1 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 852.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 139, + "width": 246, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 288, + "width": 511, + "x": 17, + "y": 426 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 88, + "width": 511, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 626.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 88, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 288, + "width": 511, + "x": 17, + "y": 426 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 130, + "width": 512, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 584.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 130, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 288, + "width": 511, + "x": 17, + "y": 426 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 426.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 288, + "width": 511, + "x": 17, + "y": 426 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 17.0, 426.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 288, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 15, + "width": 90, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 958.0, 98.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 15, + "width": 90, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 90, + "width": 970, + "x": 78, + "y": 113 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 78.0, 113.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 90, + "width": 970, + "x": 78, + "y": 113 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 78.0, 113.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 188, + "width": 1093, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 16.0, 15.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 188, + "width": 1093, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 915.0, 18.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 15, + "width": 15, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 809.0, 457.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 6258, + "width": 1133, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1092, + "width": 1125, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 7, + "surface_id": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ { + "end": { + "child_seq": 1, + "client_id": 45, + "embed_token": "56CD7D090A51AAE03034A5EE97964940", + "parent_seq": 3, + "sink_id": 21 + } + } ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 1, + "render_pass_id": "193", + "shared_quad_state_count": 1 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "193", + "output_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "allow_merge": true, + "default_background_color": 0, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 0, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 45, + "embed_token": "56CD7D090A51AAE03034A5EE97964940", + "parent_seq": 3, + "sink_id": 21 + } + }, + "visible_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 3, + "surface_id": { + "child_seq": 1, + "client_id": 43, + "embed_token": "CFBA7140E4B4A4B11DF5AEBCF5701817", + "parent_seq": 2, + "sink_id": 20 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 1, + "render_pass_id": "145", + "shared_quad_state_count": 1 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "145", + "output_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "background_color": -1, + "material": "kTextureContent", + "nearest_neighbor": false, + "needs_blending": false, + "premultiplied_alpha": true, + "protected_video_type": "kClear", + "rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "resource_size_in_pixels": { + "height": 600, + "width": 300 + }, + "resources": [ 54 ], + "secure_output_only": false, + "shared_quad_state_index": 0, + "uv_bottom_right": { + "x": 1.0, + "y": 1.0 + }, + "uv_top_left": { + "x": 0.0, + "y": 0.0 + }, + "vertex_opacity": [ 1.0, 1.0, 1.0, 1.0 ], + "visible_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "y_flipped": true + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 600, + "width": 300, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 55, + "surface_id": { + "child_seq": 1, + "client_id": 45, + "embed_token": "56CD7D090A51AAE03034A5EE97964940", + "parent_seq": 3, + "sink_id": 21 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 33, + "render_pass_id": "561", + "shared_quad_state_count": 1 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": true, + "id": "561", + "output_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 31, + "x": 0, + "y": 0 + }, + "resources": [ 1 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 31.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 31, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 31, + "y": 0 + }, + "resources": [ 2 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 31, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 61, + "y": 0 + }, + "resources": [ 3 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 61, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 91, + "y": 0 + }, + "resources": [ 4 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 91, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 121, + "y": 0 + }, + "resources": [ 5 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 121, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 151, + "y": 0 + }, + "resources": [ 6 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 151, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 181, + "y": 0 + }, + "resources": [ 7 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 181, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 211, + "y": 0 + }, + "resources": [ 8 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 211, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 241, + "y": 0 + }, + "resources": [ 9 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 241, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 271, + "y": 0 + }, + "resources": [ 10 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 271, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 301, + "y": 0 + }, + "resources": [ 11 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 301, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 331, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 331, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 361, + "y": 0 + }, + "resources": [ 13 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 361, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 391, + "y": 0 + }, + "resources": [ 14 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 391, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 421, + "y": 0 + }, + "resources": [ 15 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 421, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 451, + "y": 0 + }, + "resources": [ 16 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 451, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 481, + "y": 0 + }, + "resources": [ 17 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 481, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 511, + "y": 0 + }, + "resources": [ 18 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 541, + "y": 0 + }, + "resources": [ 19 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 541, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 571, + "y": 0 + }, + "resources": [ 20 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 571, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 601, + "y": 0 + }, + "resources": [ 21 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 601, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 631, + "y": 0 + }, + "resources": [ 22 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 631, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 661, + "y": 0 + }, + "resources": [ 23 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 661, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 691, + "y": 0 + }, + "resources": [ 24 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 691, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 721, + "y": 0 + }, + "resources": [ 25 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 721, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 751, + "y": 0 + }, + "resources": [ 26 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 751, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 781, + "y": 0 + }, + "resources": [ 27 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 781, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 811, + "y": 0 + }, + "resources": [ 28 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 811, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 841, + "y": 0 + }, + "resources": [ 29 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 841, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 871, + "y": 0 + }, + "resources": [ 30 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 871, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 901, + "y": 0 + }, + "resources": [ 31 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 901, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 30, + "x": 931, + "y": 0 + }, + "resources": [ 32 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 30.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 30, + "x": 931, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 90, + "width": 9, + "x": 961, + "y": 0 + }, + "resources": [ 33 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 90.0, + "width": 9.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 128, + "width": 32 + }, + "visible_rect": { + "height": 90, + "width": 9, + "x": 961, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 90, + "width": 970, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 2, + "surface_id": { + "child_seq": 1, + "client_id": 41, + "embed_token": "7365690E5327EF5FEEE49BC5721E0703", + "parent_seq": 3, + "sink_id": 13 + } +}, { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 4, + "render_pass_id": "305", + "shared_quad_state_count": 1 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 20, + "width": 2, + "x": 417, + "y": 484 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "305", + "output_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1140, + "x": 0, + "y": 0 + }, + "resources": [ 12 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 287.0, + "width": 1140.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1140, + "x": 0, + "y": 287 + }, + "resources": [ 55 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 286.0, + "width": 1140.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1140, + "x": 0, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1140, + "x": 0, + "y": 573 + }, + "resources": [ 49 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 286.0, + "width": 1140.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1140, + "x": 0, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 248, + "width": 1140, + "x": 0, + "y": 859 + }, + "resources": [ 50 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 248.0, + "width": 1140.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 248, + "width": 1140, + "x": 0, + "y": 859 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 39, + "surface_id": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + } +} ]
diff --git a/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1642.json b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1642.json new file mode 100644 index 0000000..d1e3545 --- /dev/null +++ b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1642.json
@@ -0,0 +1,976 @@ +[ { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 18, + "render_pass_id": "113", + "shared_quad_state_count": 14 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 292, + "width": 16, + "x": 1124, + "y": 0 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "113", + "output_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + }, + "resources": [ 687 ], + "shared_quad_state_index": 0, + "tex_coord_rect": { + "height": 1107.0, + "width": 16.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1120, + "width": 64 + }, + "visible_rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + }, + "resources": [ 68 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 1051.0, + "width": 72.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 1088, + "width": 128 + }, + "visible_rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 1124, + "x": 0, + "y": 0 + }, + "resources": [ 76 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 56.0, + "width": 1124.0, + "x": 0.0, + "y": 142.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 56, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + }, + "resources": [ 74 ], + "shared_quad_state_index": 3, + "tex_coord_rect": { + "height": 56.0, + "width": 106.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 575, + "x": 0, + "y": 0 + }, + "resources": [ 70 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 56.0, + "width": 575.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1152 + }, + "visible_rect": { + "height": 56, + "width": 575, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 56, + "width": 477, + "x": 575, + "y": 0 + }, + "resources": [ 71 ], + "shared_quad_state_index": 4, + "tex_coord_rect": { + "height": 56.0, + "width": 477.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 576 + }, + "visible_rect": { + "height": 56, + "width": 477, + "x": 575, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + }, + "resources": [ 72 ], + "shared_quad_state_index": 5, + "tex_coord_rect": { + "height": 58.0, + "width": 1052.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 1088 + }, + "visible_rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + }, + "resources": [ 65 ], + "shared_quad_state_index": 6, + "tex_coord_rect": { + "height": 18.0, + "width": 238.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 256 + }, + "visible_rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + }, + "resources": [ 77 ], + "shared_quad_state_index": 7, + "tex_coord_rect": { + "height": 18.0, + "width": 82.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + }, + "resources": [ 75 ], + "shared_quad_state_index": 8, + "tex_coord_rect": { + "height": 18.0, + "width": 113.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + }, + "resources": [ 66 ], + "shared_quad_state_index": 9, + "tex_coord_rect": { + "height": 18.0, + "width": 147.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 192 + }, + "visible_rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + }, + "resources": [ 69 ], + "shared_quad_state_index": 10, + "tex_coord_rect": { + "height": 18.0, + "width": 108.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + }, + "resources": [ 67 ], + "shared_quad_state_index": 11, + "tex_coord_rect": { + "height": 18.0, + "width": 97.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 128 + }, + "visible_rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 287, + "width": 1124, + "x": 0, + "y": 0 + }, + "resources": [ 91 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 287.0, + "width": 1124.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 287, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1124, + "x": 0, + "y": 287 + }, + "resources": [ 685 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 286.0, + "width": 1124.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1052, + "x": 72, + "y": 287 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 286, + "width": 1124, + "x": 0, + "y": 573 + }, + "resources": [ 686 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 286.0, + "width": 1124.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 286, + "width": 1052, + "x": 72, + "y": 573 + } + }, { + "force_anti_aliasing_off": false, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 248, + "width": 1124, + "x": 0, + "y": 859 + }, + "resources": [ 157 ], + "shared_quad_state_index": 12, + "tex_coord_rect": { + "height": 248.0, + "width": 1124.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 288, + "width": 1152 + }, + "visible_rect": { + "height": 248, + "width": 1052, + "x": 72, + "y": 859 + } + }, { + "color": -394759, + "force_anti_aliasing_off": false, + "material": "kSolidColor", + "needs_blending": false, + "rect": { + "height": 1107, + "width": 16, + "x": 1124, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 13, + "visible_rect": { + "height": 1107, + "width": 16, + "x": 1124, + "y": 0 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1124.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 16, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 56.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1051, + "width": 72, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1056, + "width": 1124, + "x": 0, + "y": -1000 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1018.0, 57.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 106, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 56, + "width": 1052, + "x": 72, + "y": 57 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 56, + "width": 1904, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0, 57.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 56, + "width": 1052, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 72.0, 56.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 58, + "width": 1052, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 238, + "x": 822, + "y": 960 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 960.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 238, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 158, + "x": 486, + "y": 980 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 980.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 82, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 149, + "x": 150, + "y": 980 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 980.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 113, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 157, + "x": 822, + "y": 666 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 822.0, 666.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 147, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 168, + "x": 486, + "y": 666 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 486.0, 666.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 108, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 18, + "width": 157, + "x": 150, + "y": 666 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 150.0, 666.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 18, + "width": 97, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 4194, + "width": 1124, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1124, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 351, + "surface_id": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } +} ]
diff --git a/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1643.json b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1643.json new file mode 100644 index 0000000..330f69bd --- /dev/null +++ b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1643.json
@@ -0,0 +1,765 @@ +[ { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ { + "end": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + } ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 19, + "render_pass_id": "3", + "shared_quad_state_count": 3 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1108, + "width": 1141, + "x": 3, + "y": 81 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "3", + "output_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "allow_merge": true, + "default_background_color": -394759, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 0, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + }, + "visible_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2101 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 28.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + }, + "resources": [ 2096 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 28.0, + "width": 413.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 2093 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 1526 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 1527 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 1528 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + }, + "resources": [ 2095 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 131.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 255 + }, + "resources": [ 1530 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 255 + }, + "resources": [ 1531 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 509 + }, + "resources": [ 1532 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 509 + }, + "resources": [ 1533 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 763 + }, + "resources": [ 1534 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 763 + }, + "resources": [ 1535 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + }, + "resources": [ 1536 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 255, + "y": 1017 + }, + "resources": [ 1537 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 255, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 509, + "y": 1017 + }, + "resources": [ 1538 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 509, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 763, + "y": 1017 + }, + "resources": [ 1539 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 763, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + }, + "resources": [ 1540 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1140, + "x": 4, + "y": 81 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.0, 81.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 112.0, 47.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 1137, + "surface_id": { + "child_seq": 1, + "client_id": 0, + "embed_token": "D1DAE21BA36F9A82630C2B72D2813215", + "parent_seq": 1, + "sink_id": 1 + } +} ]
diff --git a/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1644.json b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1644.json new file mode 100644 index 0000000..f2cd7da --- /dev/null +++ b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1644.json
@@ -0,0 +1,765 @@ +[ { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ { + "end": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + } ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 19, + "render_pass_id": "3", + "shared_quad_state_count": 3 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1107, + "width": 1140, + "x": 4, + "y": 81 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "3", + "output_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "allow_merge": true, + "default_background_color": -394759, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 0, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + }, + "visible_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2101 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 28.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + }, + "resources": [ 2096 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 28.0, + "width": 413.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 2093 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 1526 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 1527 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 1528 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + }, + "resources": [ 2095 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 131.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 255 + }, + "resources": [ 1530 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 255 + }, + "resources": [ 1531 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 509 + }, + "resources": [ 1532 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 509 + }, + "resources": [ 1533 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 763 + }, + "resources": [ 1534 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 763 + }, + "resources": [ 1535 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + }, + "resources": [ 1536 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 255, + "y": 1017 + }, + "resources": [ 1537 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 255, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 509, + "y": 1017 + }, + "resources": [ 1538 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 509, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 763, + "y": 1017 + }, + "resources": [ 1539 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 763, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + }, + "resources": [ 1540 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1140, + "x": 4, + "y": 81 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.0, 81.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 112.0, 47.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 1138, + "surface_id": { + "child_seq": 1, + "client_id": 0, + "embed_token": "D1DAE21BA36F9A82630C2B72D2813215", + "parent_seq": 1, + "sink_id": 1 + } +} ]
diff --git a/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1645.json b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1645.json new file mode 100644 index 0000000..8d357780 --- /dev/null +++ b/components/viz/test/data/render_pass_data/multi_surface_test/youtube_tab_focused/1645.json
@@ -0,0 +1,765 @@ +[ { + "compositor_frame": { + "metadata": { + "referenced_surfaces": [ { + "end": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 8, + "embed_token": "1B91EED3F346CA74F40FCC4F49C485DA", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 23, + "embed_token": "4CA04770AE06F81CAF23716C158797F8", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 33, + "embed_token": "C32D9F441349D144181CFFE597162BB1", + "parent_seq": 3, + "sink_id": 2 + } + }, { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + } ] + }, + "render_pass_list": { + "metadata": [ { + "quad_count": 19, + "render_pass_id": "3", + "shared_quad_state_count": 3 + } ], + "render_pass_count": 1, + "render_pass_list": [ { + "backdrop_filters": [ ], + "cache_render_pass": false, + "color_space": { + "matrix": "RGB", + "primaries": "BT709", + "range": "FULL", + "transfer": "IEC61966_2_1" + }, + "damage_rect": { + "height": 1107, + "width": 1140, + "x": 4, + "y": 81 + }, + "filters": [ ], + "generate_mipmap": false, + "has_damage_from_contributing_content": true, + "has_transparent_background": false, + "id": "3", + "output_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_list": [ { + "allow_merge": true, + "default_background_color": -394759, + "is_reflection": false, + "material": "kSurfaceContent", + "needs_blending": true, + "rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "resources": [ ], + "shared_quad_state_index": 0, + "stretch_content": false, + "surface_range": { + "end": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + }, + "start": { + "child_seq": 1, + "client_id": 46, + "embed_token": "ECCAC9DBCC3C5483B97DF084027AEAD2", + "parent_seq": 3, + "sink_id": 2 + } + }, + "visible_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + }, + "resources": [ 2101 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 28.0, + "width": 511.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 511, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": true, + "rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + }, + "resources": [ 2096 ], + "shared_quad_state_index": 1, + "tex_coord_rect": { + "height": 28.0, + "width": 413.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 64, + "width": 512 + }, + "visible_rect": { + "height": 28, + "width": 413, + "x": 511, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + }, + "resources": [ 2093 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 255.0, + "x": 0.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 255, + "x": 0, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 255, + "y": 0 + }, + "resources": [ 1526 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 255, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 509, + "y": 0 + }, + "resources": [ 1527 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 509, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 254, + "x": 763, + "y": 0 + }, + "resources": [ 1528 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 254.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 81, + "width": 254, + "x": 763, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + }, + "resources": [ 2095 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 255.0, + "width": 131.0, + "x": 1.0, + "y": 0.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 255, + "width": 131, + "x": 1017, + "y": 0 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 255 + }, + "resources": [ 1530 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 255 + }, + "resources": [ 1531 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 255 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 509 + }, + "resources": [ 1532 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 509 + }, + "resources": [ 1533 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 509 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 255, + "x": 0, + "y": 763 + }, + "resources": [ 1534 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 0, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 254, + "width": 131, + "x": 1017, + "y": 763 + }, + "resources": [ 1535 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 254.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 254, + "width": 4, + "x": 1144, + "y": 763 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + }, + "resources": [ 1536 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 255.0, + "x": 0.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 255, + "x": 0, + "y": 1017 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 255, + "y": 1017 + }, + "resources": [ 1537 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 255, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 509, + "y": 1017 + }, + "resources": [ 1538 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 509, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 254, + "x": 763, + "y": 1017 + }, + "resources": [ 1539 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 254.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 4, + "width": 254, + "x": 763, + "y": 1188 + } + }, { + "force_anti_aliasing_off": true, + "is_premultiplied": true, + "material": "kTiledContent", + "nearest_neighbor": false, + "needs_blending": false, + "rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + }, + "resources": [ 1540 ], + "shared_quad_state_index": 2, + "tex_coord_rect": { + "height": 175.0, + "width": 131.0, + "x": 1.0, + "y": 1.0 + }, + "texture_size": { + "height": 256, + "width": 256 + }, + "visible_rect": { + "height": 175, + "width": 131, + "x": 1017, + "y": 1017 + } + } ], + "shared_quad_state_list": [ { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "clip_rect": { + "height": 1107, + "width": 1140, + "x": 4, + "y": 81 + }, + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 4.0, 81.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1107, + "width": 1140, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": false, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 112.0, 47.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 28, + "width": 924, + "x": 0, + "y": 0 + } + }, { + "are_contents_opaque": true, + "blend_mode": "kSrcOver", + "de_jelly_delta_y": 0.0, + "is_fast_rounded_corner": false, + "opacity": 1.0, + "quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + }, + "quad_to_target_transform": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ], + "rounded_corner_bounds": { + "type": "kEmpty" + }, + "sorting_context_id": 0, + "visible_quad_layer_rect": { + "height": 1192, + "width": 1148, + "x": 0, + "y": 0 + } + } ], + "transform_to_root_target": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] + } ] + } + }, + "frame_index": 1139, + "surface_id": { + "child_seq": 1, + "client_id": 0, + "embed_token": "D1DAE21BA36F9A82630C2B72D2813215", + "parent_seq": 1, + "sink_id": 1 + } +} ]
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index cfd2e51..b8935dc 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -894,123 +894,14 @@ return this; } -bool BrowserAccessibility::HasBoolAttribute( - ax::mojom::BoolAttribute attribute) const { - return GetData().HasBoolAttribute(attribute); -} - -bool BrowserAccessibility::GetBoolAttribute( - ax::mojom::BoolAttribute attribute) const { - return GetData().GetBoolAttribute(attribute); -} - -bool BrowserAccessibility::GetBoolAttribute(ax::mojom::BoolAttribute attribute, - bool* value) const { - return GetData().GetBoolAttribute(attribute, value); -} - -bool BrowserAccessibility::HasFloatAttribute( - ax::mojom::FloatAttribute attribute) const { - return GetData().HasFloatAttribute(attribute); -} - -float BrowserAccessibility::GetFloatAttribute( - ax::mojom::FloatAttribute attribute) const { - return GetData().GetFloatAttribute(attribute); -} - -bool BrowserAccessibility::GetFloatAttribute( - ax::mojom::FloatAttribute attribute, - float* value) const { - return GetData().GetFloatAttribute(attribute, value); -} - bool BrowserAccessibility::HasInheritedStringAttribute( ax::mojom::StringAttribute attribute) const { - if (GetData().HasStringAttribute(attribute)) + if (node_->HasStringAttribute(attribute)) return true; return PlatformGetParent() && PlatformGetParent()->HasInheritedStringAttribute(attribute); } -const std::string& BrowserAccessibility::GetInheritedStringAttribute( - ax::mojom::StringAttribute attribute) const { - return node_->GetInheritedStringAttribute(attribute); -} - -std::u16string BrowserAccessibility::GetInheritedString16Attribute( - ax::mojom::StringAttribute attribute) const { - return node_->GetInheritedString16Attribute(attribute); -} - -bool BrowserAccessibility::HasIntAttribute( - ax::mojom::IntAttribute attribute) const { - return GetData().HasIntAttribute(attribute); -} - -int BrowserAccessibility::GetIntAttribute( - ax::mojom::IntAttribute attribute) const { - return GetData().GetIntAttribute(attribute); -} - -bool BrowserAccessibility::GetIntAttribute(ax::mojom::IntAttribute attribute, - int* value) const { - return GetData().GetIntAttribute(attribute, value); -} - -bool BrowserAccessibility::HasStringAttribute( - ax::mojom::StringAttribute attribute) const { - return GetData().HasStringAttribute(attribute); -} - -const std::string& BrowserAccessibility::GetStringAttribute( - ax::mojom::StringAttribute attribute) const { - return GetData().GetStringAttribute(attribute); -} - -bool BrowserAccessibility::GetStringAttribute( - ax::mojom::StringAttribute attribute, - std::string* value) const { - return GetData().GetStringAttribute(attribute, value); -} - -std::u16string BrowserAccessibility::GetString16Attribute( - ax::mojom::StringAttribute attribute) const { - return GetData().GetString16Attribute(attribute); -} - -bool BrowserAccessibility::GetString16Attribute( - ax::mojom::StringAttribute attribute, - std::u16string* value) const { - return GetData().GetString16Attribute(attribute, value); -} - -bool BrowserAccessibility::HasIntListAttribute( - ax::mojom::IntListAttribute attribute) const { - return GetData().HasIntListAttribute(attribute); -} - -const std::vector<int32_t>& BrowserAccessibility::GetIntListAttribute( - ax::mojom::IntListAttribute attribute) const { - return GetData().GetIntListAttribute(attribute); -} - -bool BrowserAccessibility::GetIntListAttribute( - ax::mojom::IntListAttribute attribute, - std::vector<int32_t>* value) const { - return GetData().GetIntListAttribute(attribute, value); -} - -bool BrowserAccessibility::GetHtmlAttribute(const char* html_attr, - std::string* value) const { - return GetData().GetHtmlAttribute(html_attr, value); -} - -bool BrowserAccessibility::GetHtmlAttribute(const char* html_attr, - std::u16string* value) const { - return GetData().GetHtmlAttribute(html_attr, value); -} - bool BrowserAccessibility::HasState(ax::mojom::State state_enum) const { return GetData().HasState(state_enum); } @@ -1271,7 +1162,7 @@ DCHECK(ui::IsNodeIdIntAttribute(attr)); int target_id; - if (!GetData().GetIntAttribute(attr, &target_id)) + if (!node_->GetIntAttribute(attr, &target_id)) return nullptr; return GetFromNodeID(target_id); @@ -1412,6 +1303,131 @@ return *empty_data; } +bool BrowserAccessibility::HasBoolAttribute( + ax::mojom::BoolAttribute attribute) const { + return node_->HasBoolAttribute(attribute); +} + +bool BrowserAccessibility::GetBoolAttribute( + ax::mojom::BoolAttribute attribute) const { + return node_->GetBoolAttribute(attribute); +} + +bool BrowserAccessibility::GetBoolAttribute(ax::mojom::BoolAttribute attribute, + bool* value) const { + return node_->GetBoolAttribute(attribute, value); +} + +bool BrowserAccessibility::HasFloatAttribute( + ax::mojom::FloatAttribute attribute) const { + return node_->HasFloatAttribute(attribute); +} + +float BrowserAccessibility::GetFloatAttribute( + ax::mojom::FloatAttribute attribute) const { + return node_->GetFloatAttribute(attribute); +} + +bool BrowserAccessibility::GetFloatAttribute( + ax::mojom::FloatAttribute attribute, + float* value) const { + return node_->GetFloatAttribute(attribute, value); +} + +bool BrowserAccessibility::HasIntAttribute( + ax::mojom::IntAttribute attribute) const { + return node_->HasIntAttribute(attribute); +} + +int BrowserAccessibility::GetIntAttribute( + ax::mojom::IntAttribute attribute) const { + return node_->GetIntAttribute(attribute); +} + +bool BrowserAccessibility::GetIntAttribute(ax::mojom::IntAttribute attribute, + int* value) const { + return node_->GetIntAttribute(attribute, value); +} + +bool BrowserAccessibility::HasStringAttribute( + ax::mojom::StringAttribute attribute) const { + return node_->HasStringAttribute(attribute); +} + +const std::string& BrowserAccessibility::GetStringAttribute( + ax::mojom::StringAttribute attribute) const { + return node_->GetStringAttribute(attribute); +} + +bool BrowserAccessibility::GetStringAttribute( + ax::mojom::StringAttribute attribute, + std::string* value) const { + return node_->GetStringAttribute(attribute, value); +} + +std::u16string BrowserAccessibility::GetString16Attribute( + ax::mojom::StringAttribute attribute) const { + return node_->GetString16Attribute(attribute); +} + +bool BrowserAccessibility::GetString16Attribute( + ax::mojom::StringAttribute attribute, + std::u16string* value) const { + return node_->GetString16Attribute(attribute, value); +} + +const std::string& BrowserAccessibility::GetInheritedStringAttribute( + ax::mojom::StringAttribute attribute) const { + return node_->GetInheritedStringAttribute(attribute); +} + +std::u16string BrowserAccessibility::GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const { + return node_->GetInheritedString16Attribute(attribute); +} + +bool BrowserAccessibility::HasIntListAttribute( + ax::mojom::IntListAttribute attribute) const { + return node_->HasIntListAttribute(attribute); +} + +const std::vector<int32_t>& BrowserAccessibility::GetIntListAttribute( + ax::mojom::IntListAttribute attribute) const { + return node_->GetIntListAttribute(attribute); +} + +bool BrowserAccessibility::GetIntListAttribute( + ax::mojom::IntListAttribute attribute, + std::vector<int32_t>* value) const { + return node_->GetIntListAttribute(attribute, value); +} + +bool BrowserAccessibility::HasStringListAttribute( + ax::mojom::StringListAttribute attribute) const { + return node_->HasStringListAttribute(attribute); +} + +const std::vector<std::string>& BrowserAccessibility::GetStringListAttribute( + ax::mojom::StringListAttribute attribute) const { + return node_->GetStringListAttribute(attribute); +} + +bool BrowserAccessibility::GetStringListAttribute( + ax::mojom::StringListAttribute attribute, + std::vector<std::string>* value) const { + return node_->GetStringListAttribute(attribute, value); +} + +bool BrowserAccessibility::GetHtmlAttribute(const char* attribute, + std::string* value) const { + return node_->GetHtmlAttribute(attribute, value); +} + +bool BrowserAccessibility::GetHtmlAttribute(const char* attribute, + std::u16string* value) const { + return node_->GetHtmlAttribute(attribute, value); +} + const ui::AXTree::Selection BrowserAccessibility::GetUnignoredSelection() const { DCHECK(manager()); @@ -1993,9 +2009,8 @@ std::u16string BrowserAccessibility::GetLocalizedStringForLandmarkType() const { ContentClient* content_client = content::GetContentClient(); - const ui::AXNodeData& data = GetData(); - switch (data.role) { + switch (GetData().role) { case ax::mojom::Role::kBanner: case ax::mojom::Role::kHeader: return content_client->GetLocalizedString(IDS_AX_ROLE_BANNER); @@ -2018,9 +2033,8 @@ std::u16string BrowserAccessibility::GetLocalizedStringForRoleDescription() const { ContentClient* content_client = content::GetContentClient(); - const ui::AXNodeData& data = GetData(); - switch (data.role) { + switch (GetData().role) { case ax::mojom::Role::kArticle: return content_client->GetLocalizedString(IDS_AX_ROLE_ARTICLE); @@ -2044,8 +2058,8 @@ case ax::mojom::Role::kDateTime: { std::string input_type; - if (data.GetStringAttribute(ax::mojom::StringAttribute::kInputType, - &input_type)) { + if (GetData().GetStringAttribute(ax::mojom::StringAttribute::kInputType, + &input_type)) { if (input_type == "datetime-local") { return content_client->GetLocalizedString( IDS_AX_ROLE_DATE_TIME_LOCAL); @@ -2104,8 +2118,8 @@ case ax::mojom::Role::kTextField: { std::string input_type; - if (data.GetStringAttribute(ax::mojom::StringAttribute::kInputType, - &input_type)) { + if (GetData().GetStringAttribute(ax::mojom::StringAttribute::kInputType, + &input_type)) { if (input_type == "email") { return content_client->GetLocalizedString(IDS_AX_ROLE_EMAIL); } else if (input_type == "tel") {
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index c1e651e..8a4eff5 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h
@@ -303,61 +303,8 @@ typedef base::StringPairs HtmlAttributes; const HtmlAttributes& GetHtmlAttributes() const; - // Accessing accessibility attributes: - // - // There are dozens of possible attributes for an accessibility node, - // but only a few tend to apply to any one object, so we store them - // in sparse arrays of <attribute id, attribute value> pairs, organized - // by type (bool, int, float, string, int list). - // - // There are three accessors for each type of attribute: one that returns - // true if the attribute is present and false if not, one that takes a - // pointer argument and returns true if the attribute is present (if you - // need to distinguish between the default value and a missing attribute), - // and another that returns the default value for that type if the - // attribute is not present. In addition, strings can be returned as - // either std::string or std::u16string, for convenience. - - bool HasBoolAttribute(ax::mojom::BoolAttribute attr) const; - bool GetBoolAttribute(ax::mojom::BoolAttribute attr) const; - bool GetBoolAttribute(ax::mojom::BoolAttribute attr, bool* value) const; - - bool HasFloatAttribute(ax::mojom::FloatAttribute attr) const; - float GetFloatAttribute(ax::mojom::FloatAttribute attr) const; - bool GetFloatAttribute(ax::mojom::FloatAttribute attr, float* value) const; - + // TODO(nektar): Move this method to AXNode. bool HasInheritedStringAttribute(ax::mojom::StringAttribute attribute) const; - const std::string& GetInheritedStringAttribute( - ax::mojom::StringAttribute attribute) const; - std::u16string GetInheritedString16Attribute( - ax::mojom::StringAttribute attribute) const; - - bool HasIntAttribute(ax::mojom::IntAttribute attribute) const; - int GetIntAttribute(ax::mojom::IntAttribute attribute) const; - bool GetIntAttribute(ax::mojom::IntAttribute attribute, int* value) const; - - bool HasStringAttribute(ax::mojom::StringAttribute attribute) const; - const std::string& GetStringAttribute( - ax::mojom::StringAttribute attribute) const; - bool GetStringAttribute(ax::mojom::StringAttribute attribute, - std::string* value) const; - - std::u16string GetString16Attribute( - ax::mojom::StringAttribute attribute) const; - bool GetString16Attribute(ax::mojom::StringAttribute attribute, - std::u16string* value) const; - - bool HasIntListAttribute(ax::mojom::IntListAttribute attribute) const; - const std::vector<int32_t>& GetIntListAttribute( - ax::mojom::IntListAttribute attribute) const; - bool GetIntListAttribute(ax::mojom::IntListAttribute attribute, - std::vector<int32_t>* value) const; - - // Retrieve the value of a html attribute from the attribute map and - // returns true if found. - bool GetHtmlAttribute(const char* attr, std::string* value) const; - bool GetHtmlAttribute(const char* attr, std::u16string* value) const; - // Returns true if the bit corresponding to the given enum is 1. bool HasState(ax::mojom::State state_enum) const; bool HasAction(ax::mojom::Action action_enum) const; @@ -407,10 +354,51 @@ std::u16string GetNameAsString16() const; - // AXPlatformNodeDelegate. + // `AXPlatformNodeDelegate` implementation. std::u16string GetAuthorUniqueId() const override; const ui::AXNodeData& GetData() const override; const ui::AXTreeData& GetTreeData() const override; + bool HasBoolAttribute(ax::mojom::BoolAttribute attribute) const override; + bool GetBoolAttribute(ax::mojom::BoolAttribute attribute) const override; + bool GetBoolAttribute(ax::mojom::BoolAttribute attribute, + bool* value) const override; + bool HasFloatAttribute(ax::mojom::FloatAttribute attribute) const override; + float GetFloatAttribute(ax::mojom::FloatAttribute attribute) const override; + bool GetFloatAttribute(ax::mojom::FloatAttribute attribute, + float* value) const override; + bool HasIntAttribute(ax::mojom::IntAttribute attribute) const override; + int GetIntAttribute(ax::mojom::IntAttribute attribute) const override; + bool GetIntAttribute(ax::mojom::IntAttribute attribute, + int* value) const override; + bool HasStringAttribute(ax::mojom::StringAttribute attribute) const override; + const std::string& GetStringAttribute( + ax::mojom::StringAttribute attribute) const override; + bool GetStringAttribute(ax::mojom::StringAttribute attribute, + std::string* value) const override; + std::u16string GetString16Attribute( + ax::mojom::StringAttribute attribute) const override; + bool GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const override; + const std::string& GetInheritedStringAttribute( + ax::mojom::StringAttribute attribute) const override; + std::u16string GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const override; + bool HasIntListAttribute( + ax::mojom::IntListAttribute attribute) const override; + const std::vector<int32_t>& GetIntListAttribute( + ax::mojom::IntListAttribute attribute) const override; + bool GetIntListAttribute(ax::mojom::IntListAttribute attribute, + std::vector<int32_t>* value) const override; + bool HasStringListAttribute( + ax::mojom::StringListAttribute attribute) const override; + const std::vector<std::string>& GetStringListAttribute( + ax::mojom::StringListAttribute attribute) const override; + bool GetStringListAttribute(ax::mojom::StringListAttribute attribute, + std::vector<std::string>* value) const override; + bool GetHtmlAttribute(const char* attribute, + std::string* value) const override; + bool GetHtmlAttribute(const char* attribute, + std::u16string* value) const override; const ui::AXTree::Selection GetUnignoredSelection() const override; AXPosition CreateTextPositionAt(int offset) const override; gfx::NativeViewAccessible GetNSWindow() override; @@ -423,7 +411,6 @@ gfx::NativeViewAccessible GetLastChild() override; gfx::NativeViewAccessible GetNextSibling() override; gfx::NativeViewAccessible GetPreviousSibling() override; - bool IsChildOfLeaf() const override; bool IsDescendantOfAtomicTextField() const override; bool IsLeaf() const override;
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index f2395ae5..b903384 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -1124,10 +1124,9 @@ message_id = IDS_AX_ROLE_DATE; break; case ax::mojom::Role::kDateTime: { - const ui::AXNodeData& data = GetData(); std::string type; - if (data.GetStringAttribute(ax::mojom::StringAttribute::kInputType, - &type)) { + if (node()->GetStringAttribute(ax::mojom::StringAttribute::kInputType, + &type)) { // Returns a specific role to better aid users on the control type // they are interacting with. This differs from Android text input type // which has a more granular mapping that determines type of keyboard @@ -1952,9 +1951,9 @@ if (html_tag != "input") return ANDROID_TEXT_INPUTTYPE_TYPE_NULL; - const ui::AXNodeData& data = GetData(); std::string type; - if (!data.GetStringAttribute(ax::mojom::StringAttribute::kInputType, &type)) + if (!node()->GetStringAttribute(ax::mojom::StringAttribute::kInputType, + &type)) return ANDROID_TEXT_INPUTTYPE_TYPE_TEXT; if (type.empty() || type == "text" || type == "search") @@ -2182,15 +2181,12 @@ while (node && node != this) { if (node->IsText()) { const std::vector<int32_t>& marker_types = - node->GetData().GetIntListAttribute( - ax::mojom::IntListAttribute::kMarkerTypes); + node->GetIntListAttribute(ax::mojom::IntListAttribute::kMarkerTypes); if (!marker_types.empty()) { - const std::vector<int>& marker_starts = - node->GetData().GetIntListAttribute( - ax::mojom::IntListAttribute::kMarkerStarts); + const std::vector<int>& marker_starts = node->GetIntListAttribute( + ax::mojom::IntListAttribute::kMarkerStarts); const std::vector<int>& marker_ends = - node->GetData().GetIntListAttribute( - ax::mojom::IntListAttribute::kMarkerEnds); + node->GetIntListAttribute(ax::mojom::IntListAttribute::kMarkerEnds); for (size_t i = 0; i < marker_types.size(); ++i) { // On Android, both spelling errors and alternatives from dictation
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index 30a50357..3e7de84 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -1367,7 +1367,7 @@ - (NSNumber*)elementBusy { if (![self instanceActive]) return nil; - return @(_owner->GetData().GetBoolAttribute(ax::mojom::BoolAttribute::kBusy)); + return @(_owner->GetBoolAttribute(ax::mojom::BoolAttribute::kBusy)); } - (NSNumber*)enabled {
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index f3442464..38eae393 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -2971,6 +2971,12 @@ // IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, + AddChildOfNotIncludedInTreeChain) { + RunRegressionTest( + FILE_PATH_LITERAL("add-child-of-not-included-in-tree-chain.html")); +} + +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, ContentVisibilityWithPseudoElement) { RunRegressionTest( FILE_PATH_LITERAL("content-visibility-with-pseudo-element.html"));
diff --git a/content/browser/browser_interface_broker_impl.h b/content/browser/browser_interface_broker_impl.h index 7ffeaf2..25c958941 100644 --- a/content/browser/browser_interface_broker_impl.h +++ b/content/browser/browser_interface_broker_impl.h
@@ -33,6 +33,14 @@ public: explicit BrowserInterfaceBrokerImpl(ExecutionContextHost* host) : host_(host) { + // The populate functions here define all the interfaces that will be + // exposed through the broker. + // + // The `host` is a templated type (one of RenderFrameHostImpl, + // ServiceWorkerHost, etc.). which allows the populate steps here to call a + // set of overloaded functions based on that type. Thus each type of `host` + // can expose a different set of interfaces, which is determined statically + // at compile time. internal::PopulateBinderMap(host, &binder_map_); internal::PopulateBinderMapWithContext(host, &binder_map_with_context_); }
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index d62a36a..739962a 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -722,6 +722,7 @@ download::DownloadItemImpl* download_item) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if ((download_item->GetState() != download::DownloadItem::COMPLETE) || + download_item->GetRenameHandler() || download_item->GetFileExternallyRemoved()) { return; }
diff --git a/content/browser/media/android/browser_gpu_video_accelerator_factories.cc b/content/browser/media/android/browser_gpu_video_accelerator_factories.cc index d6c7432e..9381ff56 100644 --- a/content/browser/media/android/browser_gpu_video_accelerator_factories.cc +++ b/content/browser/media/android/browser_gpu_video_accelerator_factories.cc
@@ -88,8 +88,8 @@ base::UnguessableToken BrowserGpuVideoAcceleratorFactories::GetChannelToken() { if (channel_token_.is_empty()) { - context_provider_->GetCommandBufferProxy()->channel()->Send( - new GpuCommandBufferMsg_GetChannelToken(&channel_token_)); + context_provider_->GetCommandBufferProxy()->GetGpuChannel().GetChannelToken( + &channel_token_); } return channel_token_;
diff --git a/content/browser/media/audio_input_stream_broker.cc b/content/browser/media/audio_input_stream_broker.cc index ddb9f18b..f3774261 100644 --- a/content/browser/media/audio_input_stream_broker.cc +++ b/content/browser/media/audio_input_stream_broker.cc
@@ -208,6 +208,8 @@ switch (static_cast<DisconnectReason>(reason)) { case DisconnectReason::kSystemPermissions: return InputStreamErrorCode::kSystemPermissions; + case DisconnectReason::kDeviceInUse: + return InputStreamErrorCode::kDeviceInUse; case DisconnectReason::kDefault: case DisconnectReason::kPlatformError: case DisconnectReason::kTerminatedByClient:
diff --git a/content/browser/renderer_host/agent_scheduling_group_host.h b/content/browser/renderer_host/agent_scheduling_group_host.h index aea3625..e28eca7 100644 --- a/content/browser/renderer_host/agent_scheduling_group_host.h +++ b/content/browser/renderer_host/agent_scheduling_group_host.h
@@ -189,6 +189,11 @@ // BrowserInterfaceBroker implementation through which this // AgentSchedulingGroupHost exposes ASG-scoped Mojo services to the // currently active document. + // + // The interfaces that can be requested from this broker are defined in the + // content/browser/browser_interface_binders.cc file, in the functions which + // take a `AgentSchedulingGroupHost*` parameter. + // // TODO(crbug.com/1132752): Enable capability control for Prerender2 by // initializing BrowserInterfaceBrokerImpl with a non-null // MojoBinderPolicyApplier pointer.
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc index 88d5037..4f69b86 100644 --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -120,6 +120,10 @@ SetHistoryOffsetAndLength, (int32_t offset, int32_t length), (override)); + MOCK_METHOD(void, + SetPageBaseBackgroundColor, + (absl::optional<SkColor> color), + (override)); mojo::PendingAssociatedRemote<blink::mojom::PageBroadcast> GetRemote() { return receiver_.BindNewEndpointAndPassDedicatedRemote();
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 78b921016..cba7b63 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -3941,7 +3941,7 @@ proxy->GetRoutingID(), is_loading, proxy->frame_tree_node()->current_replication_state().Clone(), proxy->GetFrameToken(), - proxy->BindAndPassRemoteMainFrameInterfaces()); + proxy->CreateAndBindRemoteMainFrameInterfaces()); // Remember that a RenderFrameProxy was created as part of processing the // Unload message above. proxy->SetRenderFrameProxyCreated(true); @@ -3974,7 +3974,7 @@ GetMojomFrameInRenderer()->Unload( proxy->GetRoutingID(), /*is_loading=*/false, frame_tree_node()->current_replication_state().Clone(), - proxy->GetFrameToken(), proxy->BindAndPassRemoteMainFrameInterfaces()); + proxy->GetFrameToken(), proxy->CreateAndBindRemoteMainFrameInterfaces()); } void RenderFrameHostImpl::DetachFromProxy() {
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 23a0310..cf0c373 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3378,6 +3378,10 @@ // BrowserInterfaceBroker implementation through which this // RenderFrameHostImpl exposes document-scoped Mojo services to the currently // active document in the corresponding RenderFrame. + // + // The interfaces that can be requested from this broker are defined in the + // content/browser/browser_interface_binders.cc file, in the functions which + // take a `RenderFrameHostImpl*` parameter. BrowserInterfaceBrokerImpl<RenderFrameHostImpl, RenderFrameHost*> broker_{ this}; mojo::Receiver<blink::mojom::BrowserInterfaceBroker> broker_receiver_{
diff --git a/content/browser/renderer_host/render_frame_host_manager_unittest.cc b/content/browser/renderer_host/render_frame_host_manager_unittest.cc index 3ee15f69..a49662f 100644 --- a/content/browser/renderer_host/render_frame_host_manager_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_manager_unittest.cc
@@ -2067,16 +2067,13 @@ // This class intercepts RenderFrameProxyHost creations, and overrides their // respective blink::mojom::RemoteFrame instances, so that it can watch the // updates of opener frames. -class UpdateOpenerProxyObserver { +class UpdateOpenerProxyObserver : public RenderFrameProxyHost::TestObserver { public: UpdateOpenerProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting(base::BindRepeating( - &UpdateOpenerProxyObserver::RenderFrameProxyHostCreatedCallback, - base::Unretained(this))); + RenderFrameProxyHost::SetObserverForTesting(this); } - ~UpdateOpenerProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting( - RenderFrameProxyHost::CreatedCallback()); + ~UpdateOpenerProxyObserver() override { + RenderFrameProxyHost::SetObserverForTesting(nullptr); } absl::optional<blink::FrameToken> OpenerFrameToken( RenderFrameProxyHost* proxy) { @@ -2101,7 +2098,7 @@ absl::optional<blink::FrameToken> frame_token_; }; - void RenderFrameProxyHostCreatedCallback(RenderFrameProxyHost* proxy_host) { + void OnCreated(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); } @@ -2328,19 +2325,41 @@ nodes_with_back_links.end()); } -// Stub out remote frame mojo binding. Intercepts calls to SetPageFocus -// and marks the message as received. -class PageFocusRemoteFrame : public content::FakeRemoteFrame { +// This class intercepts RenderFrameProxyHost creations, and overrides their +// respective blink::mojom::RemoteFrame instances, so that it can watch the +// start and stop loading states. +class PageFocusProxyObserver : public RenderFrameProxyHost::TestObserver { public: - explicit PageFocusRemoteFrame(RenderFrameProxyHost* render_frame_proxy_host) { - Init(render_frame_proxy_host->GetRemoteAssociatedInterfacesTesting()); + PageFocusProxyObserver() { + RenderFrameProxyHost::SetObserverForTesting(this); + } + ~PageFocusProxyObserver() override { + RenderFrameProxyHost::SetObserverForTesting(nullptr); + } + bool IsPageFocused(RenderFrameProxyHost* proxy) { + return remote_frames_[proxy]->set_page_focus(); } - void SetPageFocus(bool is_focused) override { set_page_focus_ = is_focused; } - bool IsPageFocused() { return set_page_focus_; } - private: - bool set_page_focus_ = false; + class Remote : public content::FakeRemoteFrame { + public: + explicit Remote(RenderFrameProxyHost* proxy) { + Init(proxy->GetRemoteAssociatedInterfacesTesting()); + } + void SetPageFocus(bool is_focused) override { + set_page_focus_ = is_focused; + } + bool set_page_focus() { return set_page_focus_; } + + private: + bool set_page_focus_ = false; + }; + + void OnCreated(RenderFrameProxyHost* proxy_host) override { + remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); + } + + std::map<RenderFrameProxyHost*, std::unique_ptr<Remote>> remote_frames_; }; // Check that when a window is focused/blurred, the message that sets @@ -2355,6 +2374,9 @@ if (!AreAllSitesIsolatedForTesting()) return; + // Start monitoring RenderFrameProxyHost. + PageFocusProxyObserver proxy_observer; + const GURL kUrlA("http://a.com/"); const GURL kUrlB("http://b.com/"); const GURL kUrlC("http://c.com/"); @@ -2407,9 +2429,6 @@ root->render_manager()->GetRenderFrameProxyHost(host1->GetSiteInstance()); EXPECT_TRUE(proxyB); - // Create PageFocusRemoteFrame to intercept SetPageFocus to RemoteFrame. - PageFocusRemoteFrame remote_frame1(proxyB); - TestRenderFrameHost* host2 = static_cast<TestRenderFrameHost*>(NavigateToEntry(child2, &entryB)); @@ -2430,9 +2449,6 @@ root->render_manager()->GetRenderFrameProxyHost(host3->GetSiteInstance()); EXPECT_TRUE(proxyC); - // Create PageFocusRemoteFrame to intercept SetPageFocus to RemoteFrame. - PageFocusRemoteFrame remote_frame3(proxyC); - DidNavigateFrame(child3, host3); // Make sure the first two subframes and the third subframe are placed in @@ -2454,8 +2470,8 @@ main_test_rfh()->GetRenderWidgetHost()->Focus(); base::RunLoop().RunUntilIdle(); VerifyPageFocusMessage(main_test_rfh()->GetRenderWidgetHost(), true); - EXPECT_TRUE(remote_frame1.IsPageFocused()); - EXPECT_TRUE(remote_frame3.IsPageFocused()); + EXPECT_TRUE(proxy_observer.IsPageFocused(proxyB)); + EXPECT_TRUE(proxy_observer.IsPageFocused(proxyC)); // Similarly, simulate focus loss on main page, and verify that the focus // message was sent to all processes. @@ -2465,8 +2481,8 @@ main_test_rfh()->GetRenderWidgetHost()->Blur(); base::RunLoop().RunUntilIdle(); VerifyPageFocusMessage(main_test_rfh()->GetRenderWidgetHost(), false); - EXPECT_FALSE(remote_frame1.IsPageFocused()); - EXPECT_FALSE(remote_frame3.IsPageFocused()); + EXPECT_FALSE(proxy_observer.IsPageFocused(proxyB)); + EXPECT_FALSE(proxy_observer.IsPageFocused(proxyC)); } // Check that page-level focus state is preserved across subframe navigations. @@ -2480,6 +2496,9 @@ if (!AreAllSitesIsolatedForTesting()) return; + // Start monitoring RenderFrameProxyHost. + PageFocusProxyObserver proxy_observer; + const GURL kUrlA("http://a.com/"); const GURL kUrlB("http://b.com/"); const GURL kUrlC("http://c.com/"); @@ -2529,9 +2548,6 @@ root->render_manager()->GetRenderFrameProxyHost(hostC->GetSiteInstance()); EXPECT_TRUE(proxyC); - // Create PageFocusRemoteFrame to intercept SetPageFocus to RemoteFrame. - PageFocusRemoteFrame remote_frame(proxyC); - DidNavigateFrame(child, hostC); base::RunLoop().RunUntilIdle(); @@ -2539,7 +2555,7 @@ // Since the B->C navigation happened while the current page was focused, // page focus should propagate to the new subframe process. Check that // process C received the proper focus message. - EXPECT_TRUE(remote_frame.IsPageFocused()); + EXPECT_TRUE(proxy_observer.IsPageFocused(proxyC)); } // Checks that a restore navigation to a WebUI works. @@ -2996,17 +3012,14 @@ // This class intercepts RenderFrameProxyHost creations, and overrides their // respective blink::mojom::RemoteFrame instances. -class InsecureRequestPolicyProxyObserver { +class InsecureRequestPolicyProxyObserver + : public RenderFrameProxyHost::TestObserver { public: InsecureRequestPolicyProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting( - base::BindRepeating(&InsecureRequestPolicyProxyObserver:: - RenderFrameProxyHostCreatedCallback, - base::Unretained(this))); + RenderFrameProxyHost::SetObserverForTesting(this); } - ~InsecureRequestPolicyProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting( - RenderFrameProxyHost::CreatedCallback()); + ~InsecureRequestPolicyProxyObserver() override { + RenderFrameProxyHost::SetObserverForTesting(nullptr); } blink::mojom::InsecureRequestPolicy GetRequestPolicy( RenderFrameProxyHost* proxy_host) { @@ -3034,7 +3047,7 @@ blink::mojom::InsecureRequestPolicy enforce_insecure_request_policy_; }; - void RenderFrameProxyHostCreatedCallback(RenderFrameProxyHost* proxy_host) { + void OnCreated(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<RemoteFrame>(proxy_host); } @@ -3126,16 +3139,14 @@ // This class intercepts RenderFrameProxyHost creations, and overrides their // respective blink::mojom::RemoteFrame instances, so that it can watch the // start and stop loading states. -class StartStopLoadingProxyObserver { +class StartStopLoadingProxyObserver + : public RenderFrameProxyHost::TestObserver { public: StartStopLoadingProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting(base::BindRepeating( - &StartStopLoadingProxyObserver::RenderFrameProxyHostCreatedCallback, - base::Unretained(this))); + RenderFrameProxyHost::SetObserverForTesting(this); } - ~StartStopLoadingProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting( - RenderFrameProxyHost::CreatedCallback()); + ~StartStopLoadingProxyObserver() override { + RenderFrameProxyHost::SetObserverForTesting(nullptr); } bool IsLoading(RenderFrameProxyHost* proxy) { return remote_frames_[proxy]->is_loading(); @@ -3155,7 +3166,7 @@ bool is_loading_ = false; }; - void RenderFrameProxyHostCreatedCallback(RenderFrameProxyHost* proxy_host) { + void OnCreated(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); } @@ -3408,20 +3419,18 @@ }; class RenderFrameHostManagerAdTaggingSignalTest - : public RenderFrameHostManagerTest { + : public RenderFrameHostManagerTest, + public RenderFrameProxyHost::TestObserver { public: RenderFrameHostManagerAdTaggingSignalTest() { - RenderFrameProxyHost::SetCreatedCallbackForTesting(base::BindRepeating( - &RenderFrameHostManagerAdTaggingSignalTest::OnProxyHostCreated, - base::Unretained(this))); + RenderFrameProxyHost::SetObserverForTesting(this); } ~RenderFrameHostManagerAdTaggingSignalTest() override { - RenderFrameProxyHost::SetCreatedCallbackForTesting( - RenderFrameProxyHost::CreatedCallback()); + RenderFrameProxyHost::SetObserverForTesting(nullptr); } - void OnProxyHostCreated(RenderFrameProxyHost* proxy_host) { + void OnCreated(RenderFrameProxyHost* proxy_host) override { auto fake_remote_frame = std::make_unique<AdStatusInterceptingRemoteFrame>(); fake_remote_frame->Init(proxy_host->GetRemoteAssociatedInterfacesTesting());
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc index ef1df57..725b81f 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.cc +++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -50,21 +50,7 @@ namespace { -RenderFrameProxyHost::CreatedCallback& GetProxyHostCreatedCallback() { - static base::NoDestructor<RenderFrameProxyHost::CreatedCallback> s_callback; - return *s_callback; -} - -RenderFrameProxyHost::CreatedCallback& GetProxyHostDeletedCallback() { - static base::NoDestructor<RenderFrameProxyHost::DeletedCallback> s_callback; - return *s_callback; -} - -RenderFrameProxyHost::BindRemoteFrameCallback& GetBindRemoteFrameCallback() { - static base::NoDestructor<RenderFrameProxyHost::BindRemoteFrameCallback> - s_callback; - return *s_callback; -} +RenderFrameProxyHost::TestObserver* g_observer_for_testing = nullptr; // The (process id, routing id) pair that identifies one RenderFrameProxy. typedef std::pair<int32_t, int32_t> RenderFrameProxyHostID; @@ -113,21 +99,10 @@ } // namespace // static -void RenderFrameProxyHost::SetCreatedCallbackForTesting( - const CreatedCallback& created_callback) { - GetProxyHostCreatedCallback() = created_callback; -} - -// static -void RenderFrameProxyHost::SetDeletedCallbackForTesting( - const DeletedCallback& deleted_callback) { - GetProxyHostDeletedCallback() = deleted_callback; -} - -// static -void RenderFrameProxyHost::SetBindRemoteFrameCallbackForTesting( - const BindRemoteFrameCallback& bind_callback) { - GetBindRemoteFrameCallback() = bind_callback; +void RenderFrameProxyHost::SetObserverForTesting(TestObserver* observer) { + // Prevent clobbering by previously set TestObserver. + DCHECK(!observer || (observer && !g_observer_for_testing)); + g_observer_for_testing = observer; } // static @@ -197,13 +172,13 @@ std::make_unique<CrossProcessFrameConnector>(this); } - if (!GetProxyHostCreatedCallback().is_null()) - GetProxyHostCreatedCallback().Run(this); + if (g_observer_for_testing) + g_observer_for_testing->OnCreated(this); } RenderFrameProxyHost::~RenderFrameProxyHost() { - if (!GetProxyHostDeletedCallback().is_null()) - GetProxyHostDeletedCallback().Run(this); + if (g_observer_for_testing) + g_observer_for_testing->OnDeleted(this); if (GetProcess()->IsInitializedAndNotDead()) { // TODO(nasko): For now, don't send this IPC for top-level frames, as @@ -306,7 +281,7 @@ frame_tree_node_->tree_scope_type(), frame_tree_node_->current_replication_state().Clone(), frame_tree_node_->devtools_frame_token(), - BindAndPassRemoteMainFrameInterfaces()); + CreateAndBindRemoteMainFrameInterfaces()); SetRenderFrameProxyCreated(true); @@ -795,21 +770,28 @@ } mojom::RemoteMainFrameInterfacesPtr -RenderFrameProxyHost::BindAndPassRemoteMainFrameInterfaces() { +RenderFrameProxyHost::CreateAndBindRemoteMainFrameInterfaces() { + auto params = mojom::RemoteMainFrameInterfaces::New(); + BindRemoteMainFrameInterfaces( + params->main_frame.InitWithNewEndpointAndPassRemote(), + params->main_frame_host.InitWithNewEndpointAndPassReceiver()); + return params; +} + +void RenderFrameProxyHost::BindRemoteMainFrameInterfaces( + mojo::PendingAssociatedRemote<blink::mojom::RemoteMainFrame> + remote_main_frame, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteMainFrameHost> + remote_main_frame_host_receiver) { DCHECK(!remote_main_frame_.is_bound()); DCHECK(!remote_main_frame_host_receiver_.is_bound()); - auto params = mojom::RemoteMainFrameInterfaces::New(); - params->main_frame = remote_main_frame_.BindNewEndpointAndPassReceiver(); + remote_main_frame_.Bind(std::move(remote_main_frame)); remote_main_frame_host_receiver_.Bind( - params->main_frame_host.InitWithNewEndpointAndPassReceiver()); + std::move(remote_main_frame_host_receiver)); - // This callback is only for testing which needs to intercept RemoteMainFrame - // interfaces. - if (!GetBindRemoteFrameCallback().is_null()) - GetBindRemoteFrameCallback().Run(this); - - return params; + if (g_observer_for_testing) + g_observer_for_testing->OnRemoteMainFrameBound(this); } void RenderFrameProxyHost::InvalidateMojoConnection() {
diff --git a/content/browser/renderer_host/render_frame_proxy_host.h b/content/browser/renderer_host/render_frame_proxy_host.h index 6f52829..e58fa3a 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.h +++ b/content/browser/renderer_host/render_frame_proxy_host.h
@@ -72,29 +72,26 @@ public blink::mojom::RemoteFrameHost, public blink::mojom::RemoteMainFrameHost { public: - using CreatedCallback = base::RepeatingCallback<void(RenderFrameProxyHost*)>; - using DeletedCallback = base::RepeatingCallback<void(RenderFrameProxyHost*)>; - using BindRemoteFrameCallback = - base::RepeatingCallback<void(RenderFrameProxyHost*)>; + // A test observer to monitor RenderFrameProxyHosts. + class TestObserver { + public: + virtual ~TestObserver() = default; + // Called when a RenderFrameProxyHost is created. + virtual void OnCreated(RenderFrameProxyHost* host) {} + // Called when a RenderFrameProxyHost is deleted. + virtual void OnDeleted(RenderFrameProxyHost* host) {} + // Called when RemoteMainFrame mojo channels are bound to a + // RenderFrameProxyHost. + virtual void OnRemoteMainFrameBound(RenderFrameProxyHost* host) {} + }; + + static void SetObserverForTesting(TestObserver* observer); static RenderFrameProxyHost* FromID(int process_id, int routing_id); static RenderFrameProxyHost* FromFrameToken( int process_id, const blink::RemoteFrameToken& frame_token); - // Sets a callback to be called whenever any RenderFrameProxyHost is created. - static void SetCreatedCallbackForTesting( - const CreatedCallback& created_callback); - - // Sets a callback to be called whenever any RenderFrameProxyHost is deleted. - static void SetDeletedCallbackForTesting( - const DeletedCallback& deleted_callback); - - // Sets a callback to be called whenever mojo connections to any - // RenderFrameProxyHost is bound and transferred. - static void SetBindRemoteFrameCallbackForTesting( - const BindRemoteFrameCallback& bind_callback); - RenderFrameProxyHost(SiteInstance* site_instance, scoped_refptr<RenderViewHostImpl> render_view_host, FrameTreeNode* frame_tree_node); @@ -236,7 +233,14 @@ // Bind mojo endpoints of the RemoteMainFrame in blink and pass unbound // corresponding endpoints. The corresponding endpoints should be transferred // and bound in blink. - mojom::RemoteMainFrameInterfacesPtr BindAndPassRemoteMainFrameInterfaces(); + mojom::RemoteMainFrameInterfacesPtr CreateAndBindRemoteMainFrameInterfaces(); + + // Bind mojo endpoints of the RemoteMainFrame in blink. + void BindRemoteMainFrameInterfaces( + mojo::PendingAssociatedRemote<blink::mojom::RemoteMainFrame> + remote_main_frame, + mojo::PendingAssociatedReceiver<blink::mojom::RemoteMainFrameHost> + remote_main_frame_host_receiver); private: // These interceptor need access to frame_host_receiver_for_testing().
diff --git a/content/browser/renderer_host/render_view_host_delegate.cc b/content/browser/renderer_host/render_view_host_delegate.cc index 9874982a..6254e5d0 100644 --- a/content/browser/renderer_host/render_view_host_delegate.cc +++ b/content/browser/renderer_host/render_view_host_delegate.cc
@@ -39,4 +39,8 @@ return false; } +absl::optional<SkColor> RenderViewHostDelegate::GetBaseBackgroundColor() { + return absl::nullopt; +} + } // namespace content
diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index ba6cb540..6421591 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h
@@ -13,6 +13,8 @@ #include "content/common/content_export.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "net/base/load_states.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/skia/include/core/SkColor.h" namespace blink { namespace web_pref { @@ -143,6 +145,11 @@ // changed. virtual void OnBackgroundColorChanged(RenderViewHostImpl* source) {} + // Called on RenderView creation to get the initial base background color + // for this RenderView. Nullopt means a color is not set, and the blink + // default color should be used. + virtual absl::optional<SkColor> GetBaseBackgroundColor(); + protected: virtual ~RenderViewHostDelegate() {} };
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 4ada412..0f23ca94 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -468,7 +468,7 @@ params->main_frame = mojom::CreateMainFrameUnion::NewRemoteParams( mojom::CreateRemoteMainFrameParams::New( main_rfph->GetFrameToken(), proxy_route_id, - main_rfph->BindAndPassRemoteMainFrameInterfaces())); + main_rfph->CreateAndBindRemoteMainFrameInterfaces())); } params->session_storage_namespace_id = @@ -476,6 +476,7 @@ params->hidden = frame_tree_->delegate()->IsHidden(); params->never_composited = delegate_->IsNeverComposited(); params->window_was_created_with_opener = window_was_created_with_opener; + params->base_background_color = delegate_->GetBaseBackgroundColor(); bool is_portal = delegate_->IsPortal(); bool is_guest_view = delegate_->IsGuest();
diff --git a/content/browser/service_worker/service_worker_host.cc b/content/browser/service_worker/service_worker_host.cc index 4a53662..28010de 100644 --- a/content/browser/service_worker/service_worker_host.cc +++ b/content/browser/service_worker/service_worker_host.cc
@@ -55,7 +55,6 @@ base::WeakPtr<ServiceWorkerContextCore> context) : version_(version), broker_(this), - broker_receiver_(&broker_), container_host_(std::make_unique<content::ServiceWorkerContainerHost>( std::move(context))), host_receiver_(container_host_.get(), std::move(host_receiver)) {
diff --git a/content/browser/service_worker/service_worker_host.h b/content/browser/service_worker/service_worker_host.h index 5f81fe5b..e2df6a529 100644 --- a/content/browser/service_worker/service_worker_host.h +++ b/content/browser/service_worker/service_worker_host.h
@@ -88,10 +88,18 @@ // owns |this|. ServiceWorkerVersion* const version_; + // BrowserInterfaceBroker implementation through which this + // ServiceWorkerHost exposes worker-scoped Mojo services to the corresponding + // service worker in the renderer. + // + // The interfaces that can be requested from this broker are defined in the + // content/browser/browser_interface_binders.cc file, in the functions which + // take a `ServiceWorkerHost*` parameter. BrowserInterfaceBrokerImpl<ServiceWorkerHost, const ServiceWorkerVersionBaseInfo&> broker_; - mojo::Receiver<blink::mojom::BrowserInterfaceBroker> broker_receiver_; + mojo::Receiver<blink::mojom::BrowserInterfaceBroker> broker_receiver_{ + &broker_}; std::unique_ptr<ServiceWorkerContainerHost> container_host_;
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 4964518..99ebfe51 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -891,17 +891,14 @@ // This class intercepts RenderFrameProxyHost creations, and overrides their // respective blink::mojom::RemoteMainFrame instances, so that it can watch for // text autosizer page info updates. -class UpdateTextAutosizerInfoProxyObserver { +class UpdateTextAutosizerInfoProxyObserver + : public RenderFrameProxyHost::TestObserver { public: UpdateTextAutosizerInfoProxyObserver() { - RenderFrameProxyHost::SetBindRemoteFrameCallbackForTesting( - base::BindRepeating(&UpdateTextAutosizerInfoProxyObserver:: - RemoteFrameInterfacesBoundCallback, - base::Unretained(this))); + RenderFrameProxyHost::SetObserverForTesting(this); } - ~UpdateTextAutosizerInfoProxyObserver() { - RenderFrameProxyHost::SetBindRemoteFrameCallbackForTesting( - RenderFrameProxyHost::BindRemoteFrameCallback()); + ~UpdateTextAutosizerInfoProxyObserver() override { + RenderFrameProxyHost::SetObserverForTesting(nullptr); } const blink::mojom::TextAutosizerPageInfo& TextAutosizerPageInfo( @@ -927,7 +924,7 @@ blink::mojom::TextAutosizerPageInfo page_info_; }; - void RemoteFrameInterfacesBoundCallback(RenderFrameProxyHost* proxy_host) { + void OnRemoteMainFrameBound(RenderFrameProxyHost* proxy_host) override { remote_frames_[proxy_host] = std::make_unique<Remote>(proxy_host); }
diff --git a/content/browser/site_per_process_scroll_browsertest.cc b/content/browser/site_per_process_scroll_browsertest.cc index 686ed0f..37cdea0 100644 --- a/content/browser/site_per_process_scroll_browsertest.cc +++ b/content/browser/site_per_process_scroll_browsertest.cc
@@ -795,25 +795,18 @@ // SynchronizeVisualProperties. We may not use them all but we need to create // the interceptors as soon as the RenderFrameProxyHost is created so we don't // miss any messages. -class ScrollBubblingProxyObserver { +class ScrollBubblingProxyObserver : RenderFrameProxyHost::TestObserver { public: ScrollBubblingProxyObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting(base::BindRepeating( - &ScrollBubblingProxyObserver::RenderFrameProxyHostCreatedCallback, - weak_factory_.GetWeakPtr())); - - // RenderFrameProxyHost can be deleted before the test is finished. In such - // case, |interceptors_| should remove the mapped interceptor to avoid a - // dangling pointer issue when it's destroyed. - RenderFrameProxyHost::SetDeletedCallbackForTesting(base::BindRepeating( - &ScrollBubblingProxyObserver::RenderFrameProxyHostDeletedCallback, - weak_factory_.GetWeakPtr())); + RenderFrameProxyHost::SetObserverForTesting(this); } // We don't need to set an empty callback to // RenderFrameProxyHost::Set[Created|Deleted]CallbackForTesting because we // already bound callbacks using a weak ptr. - ~ScrollBubblingProxyObserver() = default; + ~ScrollBubblingProxyObserver() override { + RenderFrameProxyHost::SetObserverForTesting(nullptr); + } SynchronizeVisualPropertiesInterceptor* interceptor( RenderFrameProxyHost* proxy) { @@ -821,21 +814,22 @@ } private: - void RenderFrameProxyHostCreatedCallback(RenderFrameProxyHost* proxy_host) { + void OnCreated(RenderFrameProxyHost* proxy_host) override { interceptors_.emplace( proxy_host, std::make_unique<SynchronizeVisualPropertiesInterceptor>(proxy_host)); } - void RenderFrameProxyHostDeletedCallback(RenderFrameProxyHost* proxy_host) { + void OnDeleted(RenderFrameProxyHost* proxy_host) override { + // RenderFrameProxyHost can be deleted before the test is finished. In such + // case, |interceptors_| should remove the mapped interceptor to avoid a + // dangling pointer issue when it's destroyed. interceptors_.erase(proxy_host); } std::map<RenderFrameProxyHost*, std::unique_ptr<SynchronizeVisualPropertiesInterceptor>> interceptors_; - - base::WeakPtrFactory<ScrollBubblingProxyObserver> weak_factory_{this}; }; // Test that scrolling a nested out-of-process iframe bubbles unused scroll
diff --git a/content/browser/utility_process_sandbox_browsertest.cc b/content/browser/utility_process_sandbox_browsertest.cc index 793f48cf..6ad4f01 100644 --- a/content/browser/utility_process_sandbox_browsertest.cc +++ b/content/browser/utility_process_sandbox_browsertest.cc
@@ -24,6 +24,10 @@ #include "sandbox/policy/linux/sandbox_linux.h" #include "sandbox/policy/switches.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "chromeos/assistant/buildflags.h" +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + using sandbox::policy::SandboxLinux; using sandbox::policy::SandboxType; @@ -133,7 +137,10 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kIme: case SandboxType::kTts: -#endif +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) + case SandboxType::kLibassistant: +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) +#endif // BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kNetwork: #if BUILDFLAG(ENABLE_PRINTING) case SandboxType::kPrintBackend:
diff --git a/content/browser/utility_sandbox_delegate.cc b/content/browser/utility_sandbox_delegate.cc index 03d0af2..b9ed59e5 100644 --- a/content/browser/utility_sandbox_delegate.cc +++ b/content/browser/utility_sandbox_delegate.cc
@@ -18,7 +18,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "chromeos/assistant/buildflags.h" -#endif +#endif // BUILDFLAG(IS_CHROMEOS_ASH) namespace content { @@ -60,9 +60,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) sandbox_type_ == sandbox::policy::SandboxType::kIme || sandbox_type_ == sandbox::policy::SandboxType::kTts || -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) sandbox_type_ == sandbox::policy::SandboxType::kLibassistant || -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) sandbox_type_ == sandbox::policy::SandboxType::kAudio || #if !defined(OS_MAC) @@ -100,9 +100,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) sandbox_type_ == sandbox::policy::SandboxType::kIme || sandbox_type_ == sandbox::policy::SandboxType::kTts || -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) sandbox_type_ == sandbox::policy::SandboxType::kLibassistant || -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) sandbox_type_ == sandbox::policy::SandboxType::kAudio || #if BUILDFLAG(ENABLE_PRINTING)
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index c22aa3d4..8146748 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1502,6 +1502,21 @@ return GetRenderViewHost()->background_color(); } +void WebContentsImpl::SetPageBaseBackgroundColor( + absl::optional<SkColor> color) { + if (page_base_background_color_ == color) + return; + page_base_background_color_ = color; + ExecutePageBroadcastMethod(base::BindRepeating( + [](absl::optional<SkColor> color, RenderViewHostImpl* rvh) { + // Null `broadcast` can happen before view is created on the renderer + // side, in which case this color will be sent in CreateView. + if (auto& broadcast = rvh->GetAssociatedPageBroadcast()) + broadcast->SetPageBaseBackgroundColor(color); + }, + page_base_background_color_)); +} + void WebContentsImpl::SetAccessibilityMode(ui::AXMode mode) { OPTIONAL_TRACE_EVENT2("content", "WebContentsImpl::SetAccessibilityMode", "mode", mode.ToString(), "previous_mode", @@ -5858,6 +5873,10 @@ OnWebPreferencesChanged(); } +absl::optional<SkColor> WebContentsImpl::GetBaseBackgroundColor() { + return page_base_background_color_; +} + void WebContentsImpl::PrintCrossProcessSubframe( const gfx::Rect& rect, int document_cookie,
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 7ba50c20..b92f6ee 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -364,6 +364,7 @@ void ClosePage() override; absl::optional<SkColor> GetThemeColor() override; absl::optional<SkColor> GetBackgroundColor() override; + void SetPageBaseBackgroundColor(absl::optional<SkColor> color) override; WebUI* GetWebUI() override; WebUI* GetCommittedWebUI() override; void SetUserAgentOverride(const blink::UserAgentOverride& ua_override, @@ -858,6 +859,7 @@ void OnThemeColorChanged(RenderViewHostImpl* source) override; void OnBackgroundColorChanged(RenderViewHostImpl* source) override; void RecomputeWebPreferencesSlow() override; + absl::optional<SkColor> GetBaseBackgroundColor() override; // NavigatorDelegate --------------------------------------------------------- @@ -2208,6 +2210,12 @@ // information to apps that capture it. blink::mojom::CaptureHandleConfig capture_handle_config_; + // Background color of the page set by the embedder to be passed to all + // renderers attached to this WebContents, for use in the main frame. + // It is used when the page has not loaded enough to know a background + // color or if the page does not set a background color. + absl::optional<SkColor> page_base_background_color_; + base::WeakPtrFactory<WebContentsImpl> loading_weak_factory_{this}; base::WeakPtrFactory<WebContentsImpl> weak_factory_{this};
diff --git a/content/browser/webauth/webauth_browsertest.cc b/content/browser/webauth/webauth_browsertest.cc index d66b4b6f..2779ce8c 100644 --- a/content/browser/webauth/webauth_browsertest.cc +++ b/content/browser/webauth/webauth_browsertest.cc
@@ -83,8 +83,10 @@ constexpr char kOkMessage[] = "webauth: OK"; constexpr char kPublicKeyErrorMessage[] = - "webauth: NotSupportedError: Required parameters missing in " - "`options.publicKey`."; + "webauth: TypeError: Failed to execute 'create' on 'CredentialsContainer': " + "Failed to read the 'publicKey' property from 'CredentialCreationOptions': " + "Failed to read the 'rp' property from 'PublicKeyCredentialCreationOptions'" + ": The provided value is not of type 'PublicKeyCredentialRpEntity'."; constexpr char kNotAllowedErrorMessage[] = "webauth: NotAllowedError: The operation either timed out or was not "
diff --git a/content/browser/worker_host/dedicated_worker_host.h b/content/browser/worker_host/dedicated_worker_host.h index 062b2b5..416523c 100644 --- a/content/browser/worker_host/dedicated_worker_host.h +++ b/content/browser/worker_host/dedicated_worker_host.h
@@ -263,6 +263,13 @@ std::unique_ptr<ServiceWorkerMainResourceHandle> service_worker_handle_; + // BrowserInterfaceBroker implementation through which this + // DedicatedWorkerHost exposes worker-scoped Mojo services to the + // corresponding worker in the renderer. + // + // The interfaces that can be requested from this broker are defined in the + // content/browser/browser_interface_binders.cc file, in the functions which + // take a `DedicatedWorkerHost*` parameter. BrowserInterfaceBrokerImpl<DedicatedWorkerHost, const url::Origin&> broker_{ this}; mojo::Receiver<blink::mojom::BrowserInterfaceBroker> broker_receiver_{
diff --git a/content/child/child_process.h b/content/child/child_process.h index e196f28..31d3c0b 100644 --- a/content/child/child_process.h +++ b/content/child/child_process.h
@@ -54,7 +54,10 @@ // Takes ownership of the pointer. void set_main_thread(ChildThreadImpl* thread); - void FlushIOThreadForTesting() { io_thread_.FlushForTesting(); } + // We need to stop the IO thread here instead of just flushing it, so that it + // can no longer post tasks back to the main thread. + void StopIOThreadForTesting() { io_thread_.Stop(); } + base::SingleThreadTaskRunner* io_task_runner() { return io_thread_.task_runner().get(); }
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index e49ee542..e70a3ce 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -183,7 +183,7 @@ "//base/third_party/dynamic_annotations", "//build:branding_buildflags", "//build:chromeos_buildflags", - "//build/util:webkit_version", + "//build/util:chromium_git_revision", "//components/discardable_memory/common", "//components/power_scheduler", "//components/services/filesystem/public/mojom",
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index 542a9bb..3c10f532 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -17,6 +17,7 @@ import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom"; import "mojo/public/mojom/base/values.mojom"; +import "skia/public/mojom/skcolor.mojom"; import "services/network/public/mojom/content_security_policy.mojom"; import "services/network/public/mojom/url_loader.mojom"; import "services/network/public/mojom/url_loader_factory.mojom"; @@ -127,6 +128,9 @@ // Endpoint for any messages that are broadcast to all views in a WebContents. pending_associated_receiver<blink.mojom.PageBroadcast> blink_page_broadcast; + + // Base background color of this view. Only used by a local main frame. + skia.mojom.SkColor? base_background_color; }; // A union to distinguish between parameters specific to local main frame
diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc index 3b0305e6..72ff8e1 100644 --- a/content/common/user_agent.cc +++ b/content/common/user_agent.cc
@@ -12,7 +12,7 @@ #include "base/system/sys_info.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "build/util/webkit_version.h" +#include "build/util/chromium_git_revision.h" #if defined(OS_MAC) #include "base/mac/mac_util.h" @@ -62,14 +62,11 @@ } std::string GetWebKitVersion() { - return base::StringPrintf("%d.%d (%s)", - WEBKIT_VERSION_MAJOR, - WEBKIT_VERSION_MINOR, - WEBKIT_SVN_REVISION); + return base::StringPrintf("537.36 (%s)", CHROMIUM_GIT_REVISION); } std::string GetWebKitRevision() { - return WEBKIT_SVN_REVISION; + return CHROMIUM_GIT_REVISION; } std::string BuildCpuInfo() { @@ -328,15 +325,10 @@ // This is done to expose our product name in a manner that is maximally // compatible with Safari, we hope!! std::string user_agent; - base::StringAppendF( - &user_agent, - "Mozilla/5.0 (%s) AppleWebKit/%d.%d (KHTML, like Gecko) %s Safari/%d.%d", - os_info.c_str(), - WEBKIT_VERSION_MAJOR, - WEBKIT_VERSION_MINOR, - product.c_str(), - WEBKIT_VERSION_MAJOR, - WEBKIT_VERSION_MINOR); + base::StringAppendF(&user_agent, + "Mozilla/5.0 (%s) AppleWebKit/537.36 (KHTML, like Gecko) " + "%s Safari/537.36", + os_info.c_str(), product.c_str()); return user_agent; }
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index 67006dfc..d2a72168 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h
@@ -413,6 +413,19 @@ // any. virtual absl::optional<SkColor> GetBackgroundColor() = 0; + // Sets the renderer-side default background color of the page. This is used + // when the page has not loaded enough to know a background color or if the + // page does not set a background color. + // Pass in nullopt to reset back to the default. + // Note there are situations where the base background color is not used, such + // as fullscreen. + // Note currently this is sent directly to the renderer, so does not interact + // directly with `RenderWidgetHostView::SetBackgroundColor`. There is pending + // refactor to remove `RenderWidgetHostView::SetBackgroundColor` and merge its + // functionality here, which will be more consistent and simpler to + // understand. + virtual void SetPageBaseBackgroundColor(absl::optional<SkColor> color) = 0; + // Returns the committed WebUI if one exists, otherwise the pending one. virtual WebUI* GetWebUI() = 0; virtual WebUI* GetCommittedWebUI() = 0;
diff --git a/content/public/renderer/render_frame.h b/content/public/renderer/render_frame.h index 1ec48b2..8a5fdc0 100644 --- a/content/public/renderer/render_frame.h +++ b/content/public/renderer/render_frame.h
@@ -140,6 +140,11 @@ // Returns the RenderView associated with this frame. virtual RenderView* GetRenderView() = 0; + // Returns the RenderFrame associated with the main frame of the WebView. + // See `blink::WebView::MainFrame()`. Note that this will be null when + // the main frame in this process is a remote frame. + virtual RenderFrame* GetMainRenderFrame() = 0; + // Return the RenderAccessibility associated with this frame. virtual RenderAccessibility* GetRenderAccessibility() = 0;
diff --git a/content/public/renderer/render_view.h b/content/public/renderer/render_view.h index a7c771a..5bcce9e 100644 --- a/content/public/renderer/render_view.h +++ b/content/public/renderer/render_view.h
@@ -43,9 +43,6 @@ // been closed but not yet destroyed are excluded). static void ForEach(RenderViewVisitor* visitor); - // Returns the main RenderFrame. - virtual RenderFrame* GetMainRenderFrame() = 0; - // Get the routing ID of the view. virtual int GetRoutingID() = 0;
diff --git a/content/public/test/DEPS b/content/public/test/DEPS index 58f50ac..d8f95f5e 100644 --- a/content/public/test/DEPS +++ b/content/public/test/DEPS
@@ -12,6 +12,7 @@ "+content/public", "+components/discardable_memory/service", "+components/download/public/common", + "+components/enterprise/common/proto", "+components/leveldb_proto/public", "+components/services/storage/public", "+components/viz/client",
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 9b999662a..a1497c3 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc
@@ -633,6 +633,37 @@ #endif +// Observer for RenderFrameProxyHost by setting itself through +// RenderFrameProxyHost::SetObserverForTesting. +class ProxyHostObserver : public RenderFrameProxyHost::TestObserver { + public: + using CreatedCallback = base::RepeatingCallback<void(RenderFrameProxyHost*)>; + + ProxyHostObserver() = default; + ~ProxyHostObserver() override = default; + + void Reset() { created_callback_ = CreatedCallback(); } + + void set_created_callback(CreatedCallback callback) { + created_callback_ = std::move(callback); + } + + private: + // RenderFrameProxyHost::TestObserver: + void OnCreated(RenderFrameProxyHost* rfph) override { + if (created_callback_) + created_callback_.Run(rfph); + } + + // Callback which runs on RenderFrameProxyHost is created. + CreatedCallback created_callback_; +}; + +ProxyHostObserver* GetProxyHostObserver() { + static base::NoDestructor<ProxyHostObserver> observer; + return observer.get(); +} + } // namespace bool NavigateToURL(WebContents* web_contents, const GURL& url) { @@ -3653,13 +3684,17 @@ } ProxyDSFObserver::ProxyDSFObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting(base::BindRepeating( + // Set callback and observer to track the creation of RenderFrameProxyHosts. + ProxyHostObserver* observer = GetProxyHostObserver(); + observer->set_created_callback(base::BindRepeating( &ProxyDSFObserver::OnCreation, base::Unretained(this))); + RenderFrameProxyHost::SetObserverForTesting(observer); } ProxyDSFObserver::~ProxyDSFObserver() { - RenderFrameProxyHost::SetCreatedCallbackForTesting( - RenderFrameProxyHost::CreatedCallback()); + // Stop observing RenderFrameProxyHosts. + GetProxyHostObserver()->Reset(); + RenderFrameProxyHost::SetObserverForTesting(nullptr); } void ProxyDSFObserver::WaitForOneProxyHostCreation() {
diff --git a/content/public/test/fake_download_item.cc b/content/public/test/fake_download_item.cc index 64a019fb..b91a7ad6 100644 --- a/content/public/test/fake_download_item.cc +++ b/content/public/test/fake_download_item.cc
@@ -436,6 +436,11 @@ return nullptr; } +const download::DownloadItemRerouteInfo& FakeDownloadItem::GetRerouteInfo() + const { + return reroute_info_; +} + bool FakeDownloadItem::IsDangerous() const { NOTREACHED(); return false;
diff --git a/content/public/test/fake_download_item.h b/content/public/test/fake_download_item.h index 3a2840a1..e346f18 100644 --- a/content/public/test/fake_download_item.h +++ b/content/public/test/fake_download_item.h
@@ -15,6 +15,7 @@ #include "components/download/public/common/download_interrupt_reasons.h" #include "components/download/public/common/download_item.h" #include "components/download/public/common/download_source.h" +#include "components/enterprise/common/proto/download_item_reroute_info.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/page_transition_types.h" #include "url/gurl.h" @@ -90,6 +91,7 @@ void DeleteFile(base::OnceCallback<void(bool)> callback) override; download::DownloadFile* GetDownloadFile() override; download::DownloadItemRenameHandler* GetRenameHandler() override; + const download::DownloadItemRerouteInfo& GetRerouteInfo() const override; bool IsDangerous() const override; bool IsMixedContent() const override; download::DownloadDangerType GetDangerType() const override; @@ -192,6 +194,7 @@ std::string hash_; absl::optional<download::DownloadSchedule> download_schedule_; int percent_complete_ = 0; + download::DownloadItemRerouteInfo reroute_info_; // The members below are to be returned by methods, which return by reference. std::string dummy_string;
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 0918fd1f..fbd8fe7 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -533,7 +533,8 @@ *agent_scheduling_group_, std::move(view_params), /*was_created_by_renderer=*/false, base::ThreadTaskRunnerHandle::Get()); - RenderFrameWasShownWaiter waiter(view->GetMainRenderFrame()); + RenderFrameWasShownWaiter waiter(RenderFrame::FromWebFrame( + view->GetWebView()->MainFrame()->ToWebLocalFrame())); render_widget_host_->widget_remote_for_testing()->WasShown( {} /* record_tab_switch_time_request */, false /* was_evicted=*/, blink::mojom::RecordContentToVisibleTimeRequestPtr());
diff --git a/content/public/utility/content_utility_client.cc b/content/public/utility/content_utility_client.cc index f00b904..cd72caf 100644 --- a/content/public/utility/content_utility_client.cc +++ b/content/public/utility/content_utility_client.cc
@@ -6,10 +6,6 @@ namespace content { -bool ContentUtilityClient::OnMessageReceived(const IPC::Message& message) { - return false; -} - bool ContentUtilityClient::HandleServiceRequestDeprecated( const std::string& service_name, mojo::ScopedMessagePipeHandle service_pipe) {
diff --git a/content/public/utility/content_utility_client.h b/content/public/utility/content_utility_client.h index dc0aa6a..94d9d6a6 100644 --- a/content/public/utility/content_utility_client.h +++ b/content/public/utility/content_utility_client.h
@@ -13,10 +13,6 @@ #include "mojo/public/cpp/bindings/generic_pending_receiver.h" #include "services/service_manager/public/cpp/binder_registry.h" -namespace IPC { -class Message; -} - namespace mojo { class BinderMap; class ServiceFactory; @@ -32,9 +28,6 @@ // Notifies us that the UtilityThread has been created. virtual void UtilityThreadStarted() {} - // Allows the embedder to filter messages. - virtual bool OnMessageReceived(const IPC::Message& message); - // Allows the embedder to register interface binders to handle interface // requests coming in from the browser process. These are requests that the // browser issues through the ChildProcessHost's BindReceiver() API on the
diff --git a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc index 843ac3b..1d6ad72 100644 --- a/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc +++ b/content/renderer/media/gpu/gpu_video_accelerator_factories_impl.cc
@@ -286,8 +286,8 @@ return base::UnguessableToken(); if (channel_token_.is_empty()) { - context_provider_->GetCommandBufferProxy()->channel()->Send( - new GpuCommandBufferMsg_GetChannelToken(&channel_token_)); + context_provider_->GetCommandBufferProxy()->GetGpuChannel().GetChannelToken( + &channel_token_); } return channel_token_;
diff --git a/content/renderer/pepper/mock_renderer_ppapi_host.cc b/content/renderer/pepper/mock_renderer_ppapi_host.cc index c0b3119..348e6c3 100644 --- a/content/renderer/pepper/mock_renderer_ppapi_host.cc +++ b/content/renderer/pepper/mock_renderer_ppapi_host.cc
@@ -11,16 +11,15 @@ namespace content { MockRendererPpapiHost::MockRendererPpapiHost(RenderView* render_view, + RenderFrame* render_frame, PP_Instance instance) : sink_(), ppapi_host_(&sink_, ppapi::PpapiPermissions()), render_view_(render_view), + render_frame_(render_frame), pp_instance_(instance), has_user_gesture_(false), - plugin_instance_(new FakePepperPluginInstance) { - if (render_view) - render_frame_ = render_view->GetMainRenderFrame(); -} + plugin_instance_(new FakePepperPluginInstance) {} MockRendererPpapiHost::~MockRendererPpapiHost() {}
diff --git a/content/renderer/pepper/mock_renderer_ppapi_host.h b/content/renderer/pepper/mock_renderer_ppapi_host.h index 16d8b2ed..dc50e2a 100644 --- a/content/renderer/pepper/mock_renderer_ppapi_host.h +++ b/content/renderer/pepper/mock_renderer_ppapi_host.h
@@ -20,9 +20,11 @@ // resources through this will get added to the test sink. class MockRendererPpapiHost : public RendererPpapiHost { public: - // This function takes the RenderView and instance that the mock resource - // host will be associated with. - MockRendererPpapiHost(RenderView* render_view, PP_Instance instance); + // This function takes the RenderView, RenderFrame and instance that the mock + // resource host will be associated with. + MockRendererPpapiHost(RenderView* render_view, + RenderFrame* render_frame, + PP_Instance instance); ~MockRendererPpapiHost() override; ppapi::proxy::ResourceMessageTestSink& sink() { return sink_; }
diff --git a/content/renderer/pepper/pepper_file_chooser_host_unittest.cc b/content/renderer/pepper/pepper_file_chooser_host_unittest.cc index b93afda..7141b8c2 100644 --- a/content/renderer/pepper/pepper_file_chooser_host_unittest.cc +++ b/content/renderer/pepper/pepper_file_chooser_host_unittest.cc
@@ -142,7 +142,7 @@ TEST_F(PepperFileChooserHostTest, Show) { PP_Resource pp_resource = 123; - MockRendererPpapiHost host(view_, pp_instance()); + MockRendererPpapiHost host(view_, GetMainRenderFrame(), pp_instance()); PepperFileChooserHost chooser(&host, pp_instance(), pp_resource); // Say there's a user gesture. @@ -199,7 +199,7 @@ TEST_F(PepperFileChooserHostTest, NoUserGesture) { PP_Resource pp_resource = 123; - MockRendererPpapiHost host(view_, pp_instance()); + MockRendererPpapiHost host(view_, GetMainRenderFrame(), pp_instance()); PepperFileChooserHost chooser(&host, pp_instance(), pp_resource); // Say there's no user gesture.
diff --git a/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc b/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc index 81394c5..5e7b378 100644 --- a/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc +++ b/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc
@@ -29,7 +29,7 @@ return PepperGraphics2DHost::ConvertToLogicalPixels(scale, op_rect, delta); } - PepperGraphics2DHostTest() : renderer_ppapi_host_(nullptr, 12345) {} + PepperGraphics2DHostTest() : renderer_ppapi_host_(nullptr, nullptr, 12345) {} ~PepperGraphics2DHostTest() override { ppapi::ProxyAutoLock proxy_lock;
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index 256e78e1..cbb8a84 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -2370,9 +2370,7 @@ PP_Instance instance) { if (!LoadFindInterface()) return; - bool is_main_frame = - render_frame_ && - render_frame_->GetRenderView()->GetMainRenderFrame() == render_frame_; + bool is_main_frame = render_frame_ && render_frame_->IsMainFrame(); if (!is_main_frame) return; container_->UsePluginAsFindHandler();
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 03af468..8eff548 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -1874,15 +1874,6 @@ web_media_stream_device_observer_.reset(); base::trace_event::TraceLog::GetInstance()->RemoveProcessLabel(routing_id_); - - if (is_main_frame_) { - // Ensure the RenderView doesn't point to this object, once it is destroyed. - // TODO(nasko): Add a check that the |main_render_frame_| of |render_view_| - // is |this|, once the object is no longer leaked. - // See https://crbug.com/464764. - render_view_->main_render_frame_ = nullptr; - } - g_routing_id_frame_map.Get().erase(routing_id_); agent_scheduling_group_.RemoveRoute(routing_id_); } @@ -2121,9 +2112,7 @@ // TODO(creis): WebFrame::swap() can return false. Most of those cases // should be due to the frame being detached during unload (in which case // the necessary cleanup has happened anyway), but it might be possible for - // it to return false without detaching. Catch any cases that the - // RenderView's main_render_frame_ isn't cleared below (whether swap returns - // false or not). + // it to return false without detaching. // // This executes the unload handlers on this frame and its local descendants. bool success = frame_->Swap(proxy->web_frame()); @@ -2134,10 +2123,6 @@ // Main frames should always swap successfully because there is no parent // frame to cause them to become detached. DCHECK(success); - // For main frames, the swap should have cleared the RenderView's pointer to - // this frame. - CHECK(!render_view->main_render_frame_); - // The RenderFrameProxy being swapped in here has now been attached to the // Page as its main frame and properly initialized by the WebFrame::Swap() // call, so we can call WebView's DidAttachRemoteMainFrame(). @@ -2288,6 +2273,14 @@ return render_view_; } +RenderFrame* RenderFrameImpl::GetMainRenderFrame() { + WebFrame* main_frame = GetWebView()->MainFrame(); + DCHECK(main_frame); + if (!main_frame->IsWebLocalFrame()) + return nullptr; + return RenderFrame::FromWebFrame(main_frame->ToWebLocalFrame()); +} + RenderAccessibility* RenderFrameImpl::GetRenderAccessibility() { return render_accessibility_manager_->GetRenderAccessibilityImpl(); } @@ -4853,10 +4846,6 @@ // If this is the main frame going from a remote frame to a local frame, // it needs to set RenderViewImpl's pointer for the main frame to itself. if (is_main_frame_) { - // TODO(https://crubg.com/936696): Implement RenderDocument on main frames. - CHECK(!render_view_->main_render_frame_); - render_view_->main_render_frame_ = this; - // The WebFrame being swapped in here has now been attached to the Page as // its main frame, and the WebFrameWidget was previously initialized when // the frame was created so we can call WebView's DidAttachLocalMainFrame().
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 5329930..4bdb4b6 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -334,6 +334,7 @@ // RenderFrame implementation: RenderView* GetRenderView() override; + RenderFrame* GetMainRenderFrame() override; RenderAccessibility* GetRenderAccessibility() override; std::unique_ptr<AXTreeSnapshotter> CreateAXTreeSnapshotter( ui::AXMode ax_mode) override;
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc index 58a57d9..cf41680 100644 --- a/content/renderer/render_thread_impl_browsertest.cc +++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -212,7 +212,23 @@ // because it will call _exit(0) and kill the process before the browser // side is ready to exit. ANNOTATE_LEAKING_OBJECT_PTR(process_.get()); - process_->FlushIOThreadForTesting(); + // TODO(crbug.com/1219038): `StopIOThreadForTesting()` is a stop-gap + // solution to fix flaky tests (see crbug.com/1126157). The underlying + // reason for this issue is that the `RenderThreadImpl` created in `SetUp()` + // above actually shares its main thread with the browser's, which is + // inconsistent with how in-process renderers work in production and other + // tests. Despite sharing its main thread with the browser, it still has its + // own IO thread (owned and created by `ChildProcess`). In these tests, the + // `BrowserTaskEnvironment` has no idea about this separate renderer IO + // thread, which can post tasks back to the browser's main thread. During + // `BrowserTaskEnvironment` shutdown, it CHECK()s that after the threads are + // stopped and flushed, no other tasks exist on its SequenceManager's task + // queues. However if we don't stop the IO thread here, then it may continue + // to post tasks to the `BrowserTaskEnvironment`'s main thread, causing the + // CHECK() to get hit. We should really fix the above tests to create a + // `RenderThreadImpl` on its own thread the traditional route, but this fix + // will work until we have the time to explore that option. + process_->StopIOThreadForTesting(); process_.release(); }
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm index 3a33c28b..979570e 100644 --- a/content/renderer/render_view_browsertest_mac.mm +++ b/content/renderer/render_view_browsertest_mac.mm
@@ -7,6 +7,7 @@ #include "base/strings/utf_string_conversions.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/test/render_view_test.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" @@ -77,8 +78,11 @@ prefs.enable_scroll_animator = false; RenderViewImpl* view = static_cast<RenderViewImpl*>(view_); - blink::WebFrameWidget* blink_widget = - view->GetMainRenderFrame()->GetLocalRootWebFrameWidget(); + blink::WebFrameWidget* blink_widget = view->GetWebView() + ->MainFrame() + ->ToWebLocalFrame() + ->LocalRoot() + ->FrameWidget(); view->GetWebView()->SetWebPreferences(prefs); @@ -89,7 +93,9 @@ NSEvent* arrowUpKeyDown = CmdDeadKeyEvent(NSKeyDown, kVK_UpArrow); // First test when javascript does not eat keypresses -- should scroll. - view->GetMainRenderFrame()->set_send_content_state_immediately(true); + RenderFrameImpl::FromWebFrame( + view->GetWebView()->MainFrame()->ToWebLocalFrame()) + ->set_send_content_state_immediately(true); LoadHTML(kRawHtml); render_thread_->sink().ClearMessages();
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index a229509d..2f697c7 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -120,7 +120,7 @@ opener_frame ? opener_frame->View() : nullptr, std::move(params->blink_page_broadcast), agent_scheduling_group_.agent_group_scheduler(), - params->session_storage_namespace_id); + params->session_storage_namespace_id, params->base_background_color); g_view_map.Get().insert(std::make_pair(GetWebView(), this)); g_routing_id_view_map.Get().insert(std::make_pair(GetRoutingID(), this)); @@ -130,7 +130,7 @@ webview_->SetWebPreferences(params->web_preferences); if (local_main_frame) { - main_render_frame_ = RenderFrameImpl::CreateMainFrame( + RenderFrameImpl::CreateMainFrame( agent_scheduling_group_, this, opener_frame, params->type != mojom::ViewWidgetType::kTopLevel, std::move(params->replication_state), params->devtools_main_frame_token, @@ -372,8 +372,11 @@ creator->GetTaskRunner(blink::TaskType::kInternalDefault)); if (reply->wait_for_debugger) { - blink::WebFrameWidget* frame_widget = - view->GetMainRenderFrame()->GetLocalRootWebFrameWidget(); + blink::WebFrameWidget* frame_widget = view->GetWebView() + ->MainFrame() + ->ToWebLocalFrame() + ->LocalRoot() + ->FrameWidget(); frame_widget->WaitForDebuggerWhenShown(); } @@ -382,10 +385,6 @@ // RenderView implementation --------------------------------------------------- -RenderFrameImpl* RenderViewImpl::GetMainRenderFrame() { - return main_render_frame_; -} - int RenderViewImpl::GetRoutingID() { return routing_id_; }
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 59f8c47..a4e38fd 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -117,7 +117,6 @@ // RenderView implementation ------------------------------------------------- - RenderFrameImpl* GetMainRenderFrame() override; int GetRoutingID() override; blink::WebView* GetWebView() override; @@ -185,8 +184,6 @@ // The `AgentSchedulingGroup` this view is associated with. AgentSchedulingGroup& agent_scheduling_group_; - RenderFrameImpl* main_render_frame_ = nullptr; - #if defined(OS_ANDROID) // Android Specific ----------------------------------------------------------
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn index 4f980fd..b28fe6f6 100644 --- a/content/shell/BUILD.gn +++ b/content/shell/BUILD.gn
@@ -29,6 +29,9 @@ import("//v8/gni/v8.gni") } +# TODO(spang): Investigate using shell_views with is_chromecast=true. +shell_use_toolkit_views = toolkit_views && !is_chromecast + declare_args() { content_shell_product_name = "Content Shell" content_shell_version = "999.77.34.5" @@ -311,8 +314,12 @@ ] } - # TODO(spang): Investigate using shell_views with is_chromecast=true. - if (toolkit_views && !is_chromecast) { + if (shell_use_toolkit_views) { + # All content_shell code should use this define instead of TOOLKIT_VIEWS, + # since any transitive dependency on //ui/views from another component will + # cause TOOLKIT_VIEWS to be defined, even when content_shell does not want + # to use it internally. See https://crbug.com/1218907. + defines += [ "SHELL_USE_TOOLKIT_VIEWS=1" ] deps += [ "//ui/views" ] } @@ -324,7 +331,7 @@ "//ui/wm", ] - if (toolkit_views && !is_chromecast) { + if (shell_use_toolkit_views) { sources += [ "browser/shell_platform_delegate_views.cc", "browser/shell_web_contents_view_delegate_views.cc", @@ -436,7 +443,7 @@ sources += [ "$root_gen_dir/content/browser/tracing/tracing_resources.pak" ] } - if (toolkit_views && !is_chromecast) { + if (shell_use_toolkit_views) { deps += [ "//ui/views/resources" ] sources += [ "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak" ]
diff --git a/content/shell/browser/shell_platform_delegate.h b/content/shell/browser/shell_platform_delegate.h index 87654e8..b872588 100644 --- a/content/shell/browser/shell_platform_delegate.h +++ b/content/shell/browser/shell_platform_delegate.h
@@ -126,7 +126,7 @@ #endif protected: -#if defined(USE_AURA) && !defined(TOOLKIT_VIEWS) +#if defined(USE_AURA) && !defined(SHELL_USE_TOOLKIT_VIEWS) // Helper to avoid duplicating aura's ShellPlatformDelegate in web tests. If // this hack gets expanded to become more expansive then we should just // duplicate the aura ShellPlatformDelegate code to the web test code impl in
diff --git a/content/shell/browser/shell_web_contents_view_delegate.h b/content/shell/browser/shell_web_contents_view_delegate.h index 49dbdbe..27db813 100644 --- a/content/shell/browser/shell_web_contents_view_delegate.h +++ b/content/shell/browser/shell_web_contents_view_delegate.h
@@ -13,7 +13,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_view_delegate.h" -#if defined(TOOLKIT_VIEWS) +#if defined(SHELL_USE_TOOLKIT_VIEWS) #include "ui/base/models/simple_menu_model.h" // nogncheck #include "ui/views/controls/menu/menu_runner.h" // nogncheck #endif @@ -42,7 +42,7 @@ ContextMenuParams params_; #endif -#if defined(TOOLKIT_VIEWS) +#if defined(SHELL_USE_TOOLKIT_VIEWS) std::unique_ptr<ui::SimpleMenuModel> context_menu_model_; std::unique_ptr<views::MenuRunner> context_menu_runner_; #endif
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 82771b0..3fae1a6 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -402,6 +402,7 @@ public_deps = [ ":test_interfaces", "//components/download/public/common:test_support", + "//components/enterprise/common/proto:download_item_reroute_info_proto", "//components/services/filesystem/public/mojom", "//components/services/storage/public/cpp", "//components/services/storage/public/mojom", @@ -1559,6 +1560,10 @@ } } + if (is_chromeos_ash) { + deps += [ "//chromeos/assistant:buildflags" ] + } + if (is_android) { if (is_component_build) { sources += [ "../browser/android/render_widget_host_connector.cc" ]
diff --git a/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt b/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt new file mode 100644 index 0000000..b60a621 --- /dev/null +++ b/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain-expected-blink.txt
@@ -0,0 +1,7 @@ +rootWebArea htmlTag='#document' +++genericContainer ignored htmlTag='html' +++++genericContainer ignored htmlTag='body' +++++++heading ignored invisible htmlTag='h2' +++++++++paragraph ignored invisible htmlTag='p' +++++++++++button ignored invisible htmlTag='li' +++++++group htmlTag='div' name='Done'
diff --git a/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain.html b/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain.html new file mode 100644 index 0000000..00162544 --- /dev/null +++ b/content/test/data/accessibility/regression/add-child-of-not-included-in-tree-chain.html
@@ -0,0 +1,65 @@ +<!-- +@WAIT-FOR:Done +@BLINK-ALLOW:htmlTag* +--> +<html> +<body> + <!-- This whole subtree is display:none, so all nodes will be + ignored, and the default will be for all of them to be + not included in the tree unless there's a good reason to + include them. + + Adding lang="en" forces a node to be included in the tree + without many other side effects, so when you see lang="en" + on a node here, that ensures it will be included in the tree. + The other nodes will not. --> + <div hidden> + <h2 lang="en"> + <div> + <here> + </here> + </div> + </h2> + </div> + + <div role="group" id="test-status" aria-label="running"></div> + + <script> + setTimeout(() => { + // After the page finishes loading... + // + // Add a paragraph child to the node <here> and include it + // in the tree (using lang=en). Because <here> and its + // parent <div> are both not included in the tree, it + // should be added as a child of the heading - but a bug + // was preventing this from happening as it should. + let here = document.querySelector('here'); + let child = document.createElement('p'); + child.setAttribute('lang', 'en'); + here.appendChild(child); + + // Now add a child of that paragraph and include it in the + // tree too. + let grandchild = document.createElement('li'); + grandchild.setAttribute('lang', 'en'); + child.appendChild(grandchild); + + // Finally, change the role on this grandchild. This is to + // check for a totally separate regression where an event + // that fires on a node that's not reachable can lead to + // an endless loop in SendPendingAccessibilityEvents. + grandchild.setAttribute('role', 'button'); + }, 100); + + // Make the test end after some time has passed, because one + // possible regression this can cause is continuously sending + // the same event over and over again. The test needs to run + // long enough for it to either generate abnormal logspam or + // run out of memory or something like that. + setTimeout(() => { + document.getElementById('test-status').setAttribute('aria-label', 'Done'); + }, 600); + + </script> +</body> +</html>
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index c9997ab..2ca593c 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -427,5 +427,5 @@ crbug.com/852089 [ win7 ] Pixel_WebGPUImportUnaccelerated2DCanvas [ Skip ] # Flaky on Pixel 4 +crbug.com/1215747 [ android android-pixel-4 skia-renderer-gl ] Pixel_OffscreenCanvas2DResizeOnWorker [ RetryOnFailure ] crbug.com/1215747 [ android android-pixel-4 skia-renderer-gl ] Pixel_OffscreenCanvasWebGLDefault [ RetryOnFailure ] -
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 1808367f..b2efb56 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
@@ -116,6 +116,7 @@ # ======================== # Failing new updated tests +crbug.com/891861 conformance2/extensions/webgl-multi-draw-instanced-base-vertex-base-instance.html [ Failure ] crbug.com/1131224 conformance2/rendering/framebuffer-mismatched-attachment-targets.html [ Failure ] crbug.com/1108086 [ no-passthrough ] conformance2/renderbuffers/framebuffer-object-attachment.html [ Failure ] crbug.com/angleproject/4807 [ win angle-d3d11 passthrough ] conformance2/glsl3/switch-case.html [ Failure ] @@ -180,6 +181,8 @@ # Win failures # #################### +crbug.com/1219015 [ win intel ] conformance/textures/misc/video-rotation.html [ Failure ] + crbug.com/1204224 [ win7 angle-d3d11 amd passthrough ] conformance/textures/video/* [ RetryOnFailure ] crbug.com/1204224 [ win7 angle-d3d11 amd passthrough ] conformance/textures/image_bitmap_from_video/* [ RetryOnFailure ] @@ -635,6 +638,9 @@ [ android qualcomm ] WebglExtension_WEBGL_compressed_texture_s3tc [ Skip ] [ android qualcomm ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Skip ] +# Until Qualcomm devices on the waterfall and CQ are updated to Android S, skip this new test. +crbug.com/1076188 [ android qualcomm ] conformance2/glsl3/fragment-shader-loop-crash.html [ Skip ] + # Video tests are flaky. Sometimes the video is black. crbug.com/948894 [ android ] conformance/textures/video/* [ RetryOnFailure ] crbug.com/948894 [ android ] conformance/textures/image_bitmap_from_video/* [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 707d8d73..afeca47 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -286,6 +286,7 @@ crbug.com/1143424 [ fuchsia ] deqp/data/gles2/shaders/conversions.html [ Skip ] crbug.com/478572 [ fuchsia ] deqp/data/gles2/shaders/functions.html [ Skip ] crbug.com/angleproject/3111 [ fuchsia ] deqp/data/gles2/shaders/swizzles.html [ Skip ] +crbug.com/1218708 [ fuchsia ] conformance/rendering/many-draw-calls.html [ Skip ] # Video not supported on Fuchsia qemu boards. [ fuchsia fuchsia-board-qemu-x64 ] conformance/extensions/oes-texture-float-with-video.html [ Skip ] @@ -316,6 +317,7 @@ # Intel flaky issues crbug.com/929009 [ win intel ] conformance/glsl/misc/shader-with-non-reserved-words.html [ RetryOnFailure ] crbug.com/1111652 [ win intel angle-vulkan passthrough ] conformance/context/context-size-change.html [ Failure ] +crbug.com/1219015 [ win angle-d3d11 intel ] conformance/textures/misc/video-rotation.html [ Failure ] # Intel driver issues crbug.com/854100 [ win intel angle-opengl passthrough intel_lt_25.20.100.6577 ] conformance/glsl/variables/gl-pointcoord.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_revision.txt b/content/test/gpu/gpu_tests/webgl_conformance_revision.txt index a5d4766..50765c2 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance_revision.txt +++ b/content/test/gpu/gpu_tests/webgl_conformance_revision.txt
@@ -1,3 +1,3 @@ # AUTOGENERATED FILE - DO NOT EDIT # SEE roll_webgl_conformance.py -Current webgl revision a0b8774ce8cec1dc8f4308810bf05eb8867c62de +Current webgl revision aca1420b74cd8420e73670e56dc4c61394a2ad90
diff --git a/content/test/gpu/unexpected_passes/builders.py b/content/test/gpu/unexpected_passes/builders.py index 7fbb1f6..1056e40 100644 --- a/content/test/gpu/unexpected_passes/builders.py +++ b/content/test/gpu/unexpected_passes/builders.py
@@ -10,18 +10,12 @@ import logging import os import subprocess -import sys from unexpected_passes import multiprocessing_utils -CHROMIUM_SRC_DIR = os.path.realpath( - os.path.join(os.path.dirname(__file__), '..', '..', '..', '..')) -TESTING_BUILDBOT_DIR = os.path.join(CHROMIUM_SRC_DIR, 'testing', 'buildbot') -TOOLS_PERF_DIR = os.path.join(CHROMIUM_SRC_DIR, 'tools', 'perf') - -sys.path.append(TOOLS_PERF_DIR) -from chrome_telemetry_build import android_browser_types -sys.path.remove(TOOLS_PERF_DIR) +TESTING_BUILDBOT_DIR = os.path.realpath( + os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', 'testing', + 'buildbot')) AUTOGENERATED_JSON_KEY = 'AAAAA1 AUTOGENERATED FILE DO NOT EDIT' @@ -30,11 +24,6 @@ 'telemetry_gpu_integration_test', } -# Android targets are split based on binary type, so add those using the -# maintained list of suffixes -for suffix in android_browser_types.TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES: - GPU_TELEMETRY_ISOLATES.add('telemetry_gpu_integration_test' + suffix) - # There are a few CI builders that don't actually exist, but have trybot # mirrors. So, define a manual mapping here. # Go from try -> CI then reverse the mapping so that there's less of a chance of
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc index 11cc4e1..be12b58e 100644 --- a/content/test/test_blink_web_unit_test_support.cc +++ b/content/test/test_blink_web_unit_test_support.cc
@@ -248,6 +248,10 @@ return threaded_animation_; } +bool TestBlinkWebUnitTestSupport::IsUseZoomForDSFEnabled() { + return use_zoom_for_dsf_; +} + cc::TaskGraphRunner* TestBlinkWebUnitTestSupport::GetTaskGraphRunner() { return &test_task_graph_runner_; } @@ -261,4 +265,13 @@ return old; } +// static +bool TestBlinkWebUnitTestSupport::SetUseZoomForDsfEnabled(bool enabled) { + DCHECK(g_test_platform) + << "Not using TestBlinkWebUnitTestSupport as blink::Platform"; + bool old = g_test_platform->use_zoom_for_dsf_; + g_test_platform->use_zoom_for_dsf_ = enabled; + return old; +} + } // namespace content
diff --git a/content/test/test_blink_web_unit_test_support.h b/content/test/test_blink_web_unit_test_support.h index c34d552..ee2155f 100644 --- a/content/test/test_blink_web_unit_test_support.h +++ b/content/test/test_blink_web_unit_test_support.h
@@ -54,6 +54,7 @@ blink::WebString DefaultLocale() override; scoped_refptr<base::SingleThreadTaskRunner> GetIOTaskRunner() const override; bool IsThreadedAnimationEnabled() override; + bool IsUseZoomForDSFEnabled() override; cc::TaskGraphRunner* GetTaskGraphRunner() override; // May be called when |this| is registered as the active blink Platform @@ -63,11 +64,14 @@ // cross-test side effects. static bool SetThreadedAnimationEnabled(bool enabled); + static bool SetUseZoomForDsfEnabled(bool enabled); + private: void BindClipboardHost(mojo::ScopedMessagePipeHandle handle); std::unique_ptr<blink::scheduler::WebThreadScheduler> main_thread_scheduler_; bool threaded_animation_ = true; + bool use_zoom_for_dsf_ = false; cc::TestTaskGraphRunner test_task_graph_runner_; base::WeakPtrFactory<TestBlinkWebUnitTestSupport> weak_factory_{this};
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc index 5989d9c..4c7124c 100644 --- a/content/test/test_render_view_host.cc +++ b/content/test/test_render_view_host.cc
@@ -314,7 +314,13 @@ } else { // Pretend that mojo connections of the RemoteFrame is transferred to // renderer process and bound in blink. - ignore_result(proxy_host->BindRemoteMainFrameReceiverForTesting()); + mojo::AssociatedRemote<blink::mojom::RemoteMainFrame> remote_main_frame; + ignore_result(remote_main_frame.BindNewEndpointAndPassDedicatedReceiver()); + proxy_host->BindRemoteMainFrameInterfaces( + remote_main_frame.Unbind(), + mojo::AssociatedRemote<blink::mojom::RemoteMainFrameHost>() + .BindNewEndpointAndPassDedicatedReceiver()); + proxy_host->SetRenderFrameProxyCreated(true); }
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn index 4b6a6cd4..d2da8e25c 100644 --- a/content/utility/BUILD.gn +++ b/content/utility/BUILD.gn
@@ -93,7 +93,7 @@ ] } - if (enable_libassistant_sandbox) { + if (enable_cros_libassistant) { deps += [ "//chromeos/services/libassistant:sandbox_hook" ] }
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index 4b30d8f..9621ae10 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -44,9 +44,9 @@ #include "chromeos/services/ime/ime_sandbox_hook.h" #include "chromeos/services/tts/tts_sandbox_hook.h" -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/services/libassistant/libassistant_sandbox_hook.h" // nogncheck -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif #if defined(OS_MAC) @@ -143,12 +143,12 @@ case sandbox::policy::SandboxType::kTts: pre_sandbox_hook = base::BindOnce(&chromeos::tts::TtsPreSandboxHook); break; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) case sandbox::policy::SandboxType::kLibassistant: pre_sandbox_hook = base::BindOnce(&chromeos::libassistant::LibassistantPreSandboxHook); break; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) default: break;
diff --git a/content/utility/utility_thread_impl.cc b/content/utility/utility_thread_impl.cc index 6c73929..17bd43b8 100644 --- a/content/utility/utility_thread_impl.cc +++ b/content/utility/utility_thread_impl.cc
@@ -252,10 +252,6 @@ service_factory_ = std::make_unique<UtilityServiceFactory>(); } -bool UtilityThreadImpl::OnControlMessageReceived(const IPC::Message& msg) { - return GetContentClient()->utility()->OnMessageReceived(msg); -} - void UtilityThreadImpl::RunServiceDeprecated( const std::string& service_name, mojo::ScopedMessagePipeHandle service_pipe) {
diff --git a/content/utility/utility_thread_impl.h b/content/utility/utility_thread_impl.h index 099f02f2..c21df4e 100644 --- a/content/utility/utility_thread_impl.h +++ b/content/utility/utility_thread_impl.h
@@ -56,7 +56,6 @@ void Init(); // ChildThreadImpl: - bool OnControlMessageReceived(const IPC::Message& msg) override; void RunServiceDeprecated( const std::string& service_name, mojo::ScopedMessagePipeHandle service_pipe) override;
diff --git a/extensions/browser/api/socket/socket_api.cc b/extensions/browser/api/socket/socket_api.cc index 28957b7e..299f201 100644 --- a/extensions/browser/api/socket/socket_api.cc +++ b/extensions/browser/api/socket/socket_api.cc
@@ -285,63 +285,54 @@ Release(); // Added in StartDnsLookup(). } -SocketCreateFunction::SocketCreateFunction() - : socket_type_(kSocketTypeInvalid) {} +SocketCreateFunction::SocketCreateFunction() = default; -SocketCreateFunction::~SocketCreateFunction() {} +SocketCreateFunction::~SocketCreateFunction() = default; -bool SocketCreateFunction::Prepare() { - params_ = api::socket::Create::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); +ExtensionFunction::ResponseAction SocketCreateFunction::Work() { + std::unique_ptr<api::socket::Create::Params> params = + api::socket::Create::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); - switch (params_->type) { + Socket* socket = nullptr; + switch (params->type) { case extensions::api::socket::SOCKET_TYPE_TCP: - socket_type_ = kSocketTypeTCP; + socket = new TCPSocket(browser_context(), extension_id()); break; - case extensions::api::socket::SOCKET_TYPE_UDP: { - socket_type_ = kSocketTypeUDP; + case extensions::api::socket::SOCKET_TYPE_UDP: { mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote; - socket_listener_receiver_ = - listener_remote.InitWithNewPipeAndPassReceiver(); + mojo::PendingReceiver<network::mojom::UDPSocketListener> + socket_listener_receiver = + listener_remote.InitWithNewPipeAndPassReceiver(); + mojo::PendingRemote<network::mojom::UDPSocket> udp_socket; browser_context() ->GetDefaultStoragePartition() ->GetNetworkContext() - ->CreateUDPSocket(socket_.InitWithNewPipeAndPassReceiver(), + ->CreateUDPSocket(udp_socket.InitWithNewPipeAndPassReceiver(), std::move(listener_remote)); + socket = + new UDPSocket(std::move(udp_socket), + std::move(socket_listener_receiver), extension_id()); break; } case extensions::api::socket::SOCKET_TYPE_NONE: NOTREACHED(); - break; + return RespondNow(NoArguments()); } - return true; -} - -void SocketCreateFunction::Work() { - Socket* socket = nullptr; - if (socket_type_ == kSocketTypeTCP) { - socket = new TCPSocket(browser_context(), extension_->id()); - } else if (socket_type_ == kSocketTypeUDP) { - socket = - new UDPSocket(std::move(socket_), std::move(socket_listener_receiver_), - extension_->id()); - } DCHECK(socket); - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->SetInteger(kSocketIdKey, AddSocket(socket)); - SetResult(std::move(result)); + base::Value result(base::Value::Type::DICTIONARY); + result.SetKey(kSocketIdKey, base::Value(AddSocket(socket))); + return RespondNow(OneArgument(std::move(result))); } -bool SocketDestroyFunction::Prepare() { - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); - return true; -} - -void SocketDestroyFunction::Work() { - RemoveSocket(socket_id_); +ExtensionFunction::ResponseAction SocketDestroyFunction::Work() { + int socket_id; + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id)); + RemoveSocket(socket_id); + return RespondNow(NoArguments()); } SocketConnectFunction::SocketConnectFunction() = default; @@ -412,47 +403,39 @@ Respond(OneArgument(base::Value(result))); } -bool SocketDisconnectFunction::Prepare() { - EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); - return true; -} +ExtensionFunction::ResponseAction SocketDisconnectFunction::Work() { + int socket_id; + EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id)); -void SocketDisconnectFunction::Work() { - Socket* socket = GetSocket(socket_id_); - if (socket) + Socket* socket = GetSocket(socket_id); + if (socket) { socket->Disconnect(false /* socket_destroying */); - else - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>()); + return RespondNow(OneArgument(base::Value())); + } else { + std::vector<base::Value> args; + args.emplace_back(); + return RespondNow( + ErrorWithArguments(std::move(args), kSocketNotFoundError)); + } } -bool SocketBindFunction::Prepare() { +ExtensionFunction::ResponseAction SocketBindFunction::Work() { EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &address_)); int port; EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(2, &port)); if (!IsPortValid(port)) { - error_ = kPortInvalidError; - return false; + return RespondNow(Error(kPortInvalidError)); } port_ = static_cast<uint16_t>(port); - return true; -} -void SocketBindFunction::AsyncWorkStart() { Socket* socket = GetSocket(socket_id_); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } if (socket->GetSocketType() == Socket::TYPE_TCP) { - error_ = kTCPSocketBindError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kTCPSocketBindError)); } CHECK(socket->GetSocketType() == Socket::TYPE_UDP); @@ -460,65 +443,56 @@ address_, port_); if (!extension()->permissions_data()->CheckAPIPermissionWithParam( APIPermissionID::kSocket, ¶m)) { - error_ = kPermissionError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kPermissionError)); } socket->Bind(address_, port_, base::BindOnce(&SocketBindFunction::OnCompleted, this)); + return RespondLater(); } + void SocketBindFunction::OnCompleted(int net_result) { Socket* socket = GetSocket(socket_id_); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); + Respond(ErrorWithCode(-1, kSocketNotFoundError)); return; } - SetResult(std::make_unique<base::Value>(net_result)); if (net_result != net::OK) { - AsyncWorkCompleted(); + Respond(OneArgument(base::Value(net_result))); return; } OpenFirewallHole(address_, socket_id_, socket); + if (!did_respond()) { + Respond(OneArgument(base::Value(net_result))); + } } -SocketListenFunction::SocketListenFunction() {} +SocketListenFunction::SocketListenFunction() = default; -SocketListenFunction::~SocketListenFunction() {} +SocketListenFunction::~SocketListenFunction() = default; -bool SocketListenFunction::Prepare() { +ExtensionFunction::ResponseAction SocketListenFunction::Work() { params_ = api::socket::Listen::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} -void SocketListenFunction::AsyncWorkStart() { Socket* socket = GetSocket(params_->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } SocketPermission::CheckParam param(SocketPermissionRequest::TCP_LISTEN, params_->address, params_->port); if (!extension()->permissions_data()->CheckAPIPermissionWithParam( APIPermissionID::kSocket, ¶m)) { - error_ = kPermissionError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kPermissionError)); } socket->Listen(params_->address, params_->port, params_->backlog.get() ? *params_->backlog : 5, base::BindOnce(&SocketListenFunction::OnCompleted, this)); + return RespondLater(); } void SocketListenFunction::OnCompleted(int result, @@ -526,39 +500,39 @@ DCHECK_NE(net::ERR_IO_PENDING, result); Socket* socket = GetSocket(params_->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(-1)); - AsyncWorkCompleted(); + Respond(ErrorWithCode(-1, kSocketNotFoundError)); return; } - SetResult(std::make_unique<base::Value>(result)); + if (result != net::OK) { - error_ = error_msg; - AsyncWorkCompleted(); + Respond(ErrorWithCode(result, error_msg)); return; } + OpenFirewallHole(params_->address, params_->socket_id, socket); + if (!did_respond()) { + Respond(OneArgument(base::Value(result))); + } } -SocketAcceptFunction::SocketAcceptFunction() {} +SocketAcceptFunction::SocketAcceptFunction() = default; -SocketAcceptFunction::~SocketAcceptFunction() {} +SocketAcceptFunction::~SocketAcceptFunction() = default; -bool SocketAcceptFunction::Prepare() { - params_ = api::socket::Accept::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketAcceptFunction::Work() { + std::unique_ptr<api::socket::Accept::Params> params = + api::socket::Accept::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketAcceptFunction::AsyncWorkStart() { - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (socket) { socket->Accept(base::BindOnce(&SocketAcceptFunction::OnAccept, this)); + return RespondLater(); } else { - error_ = kSocketNotFoundError; - OnAccept(net::ERR_FAILED, mojo::NullRemote(), absl::nullopt, - mojo::ScopedDataPipeConsumerHandle(), - mojo::ScopedDataPipeProducerHandle()); + api::socket::AcceptInfo info; + info.result_code = net::ERR_FAILED; + return RespondNow(ErrorWithArguments( + api::socket::Accept::Results::Create(info), kSocketNotFoundError)); } } @@ -568,39 +542,37 @@ const absl::optional<net::IPEndPoint>& remote_addr, mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, mojo::ScopedDataPipeProducerHandle send_pipe_handle) { - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->SetInteger(kResultCodeKey, result_code); + base::Value result(base::Value::Type::DICTIONARY); + result.SetIntKey(kResultCodeKey, result_code); if (result_code == net::OK) { Socket* client_socket = new TCPSocket(std::move(socket), std::move(receive_pipe_handle), std::move(send_pipe_handle), remote_addr, extension_id()); - result->SetInteger(kSocketIdKey, AddSocket(client_socket)); + result.SetIntKey(kSocketIdKey, AddSocket(client_socket)); } - SetResult(std::move(result)); - - AsyncWorkCompleted(); + Respond(OneArgument(std::move(result))); } -SocketReadFunction::SocketReadFunction() {} +SocketReadFunction::SocketReadFunction() = default; -SocketReadFunction::~SocketReadFunction() {} +SocketReadFunction::~SocketReadFunction() = default; -bool SocketReadFunction::Prepare() { - params_ = api::socket::Read::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketReadFunction::Work() { + std::unique_ptr<api::socket::Read::Params> params = + api::socket::Read::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketReadFunction::AsyncWorkStart() { - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - OnCompleted(-1, nullptr, false /* socket_destroying */); - return; + api::socket::ReadInfo info; + info.result_code = -1; + return RespondNow(ErrorWithArguments( + api::socket::Read::Results::Create(info), kSocketNotFoundError)); } - socket->Read(params_->buffer_size.get() ? *params_->buffer_size : 4096, + socket->Read(params->buffer_size.get() ? *params->buffer_size : 4096, base::BindOnce(&SocketReadFunction::OnCompleted, this)); + return RespondLater(); } void SocketReadFunction::OnCompleted(int bytes_read, @@ -612,18 +584,14 @@ if (bytes_read > 0) data_span = base::as_bytes(base::make_span(io_buffer->data(), bytes_read)); result.SetKey(kDataKey, base::Value(data_span)); - SetResult(base::DictionaryValue::From( - base::Value::ToUniquePtrValue(std::move(result)))); - - AsyncWorkCompleted(); + Respond(OneArgument(std::move(result))); } -SocketWriteFunction::SocketWriteFunction() - : socket_id_(0), io_buffer_(nullptr), io_buffer_size_(0) {} +SocketWriteFunction::SocketWriteFunction() = default; -SocketWriteFunction::~SocketWriteFunction() {} +SocketWriteFunction::~SocketWriteFunction() = default; -bool SocketWriteFunction::Prepare() { +ExtensionFunction::ResponseAction SocketWriteFunction::Work() { const auto& list = args_->GetList(); EXTENSION_FUNCTION_VALIDATE(list.size() >= 2); const auto& socket_id_value = list[0]; @@ -631,54 +599,52 @@ EXTENSION_FUNCTION_VALIDATE(socket_id_value.is_int()); EXTENSION_FUNCTION_VALIDATE(data_value.is_blob()); - socket_id_ = socket_id_value.GetInt(); - io_buffer_size_ = data_value.GetBlob().size(); - io_buffer_ = base::MakeRefCounted<net::WrappedIOBuffer>( - reinterpret_cast<const char*>(data_value.GetBlob().data())); - return true; -} + int socket_id = socket_id_value.GetInt(); + size_t io_buffer_size = data_value.GetBlob().size(); + scoped_refptr<net::IOBuffer> io_buffer = + base::MakeRefCounted<net::WrappedIOBuffer>( + reinterpret_cast<const char*>(data_value.GetBlob().data())); -void SocketWriteFunction::AsyncWorkStart() { - Socket* socket = GetSocket(socket_id_); - + Socket* socket = GetSocket(socket_id); if (!socket) { - error_ = kSocketNotFoundError; - OnCompleted(-1); - return; + api::socket::WriteInfo info; + info.bytes_written = -1; + return RespondNow(ErrorWithArguments( + api::socket::Write::Results::Create(info), kSocketNotFoundError)); } - socket->Write(io_buffer_, io_buffer_size_, + socket->Write(io_buffer, io_buffer_size, base::BindOnce(&SocketWriteFunction::OnCompleted, this)); + return RespondLater(); } void SocketWriteFunction::OnCompleted(int bytes_written) { - std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue()); - result->SetInteger(kBytesWrittenKey, bytes_written); - SetResult(std::move(result)); - - AsyncWorkCompleted(); + base::Value result(base::Value::Type::DICTIONARY); + result.SetIntKey(kBytesWrittenKey, bytes_written); + Respond(OneArgument(std::move(result))); } -SocketRecvFromFunction::SocketRecvFromFunction() {} +SocketRecvFromFunction::SocketRecvFromFunction() = default; -SocketRecvFromFunction::~SocketRecvFromFunction() {} +SocketRecvFromFunction::~SocketRecvFromFunction() = default; -bool SocketRecvFromFunction::Prepare() { - params_ = api::socket::RecvFrom::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketRecvFromFunction::Work() { + std::unique_ptr<api::socket::RecvFrom::Params> params = + api::socket::RecvFrom::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketRecvFromFunction::AsyncWorkStart() { - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket || socket->GetSocketType() != Socket::TYPE_UDP) { - error_ = kSocketNotFoundError; - OnCompleted(-1, nullptr, false /* socket_destroying*/, std::string(), 0); - return; + api::socket::RecvFromInfo info; + info.result_code = -1; + info.port = 0; + return RespondNow(ErrorWithArguments( + api::socket::RecvFrom::Results::Create(info), kSocketNotFoundError)); } - socket->RecvFrom(params_->buffer_size.get() ? *params_->buffer_size : 4096, + socket->RecvFrom(params->buffer_size.get() ? *params->buffer_size : 4096, base::BindOnce(&SocketRecvFromFunction::OnCompleted, this)); + return RespondLater(); } void SocketRecvFromFunction::OnCompleted(int bytes_read, @@ -694,10 +660,7 @@ result.SetKey(kDataKey, base::Value(data_span)); result.SetStringKey(kAddressKey, address); result.SetIntKey(kPortKey, port); - SetResult(base::DictionaryValue::From( - base::Value::ToUniquePtrValue(std::move(result)))); - - AsyncWorkCompleted(); + Respond(OneArgument(std::move(result))); } SocketSendToFunction::SocketSendToFunction() = default; @@ -771,80 +734,69 @@ Respond(ArgumentList(api::socket::SendTo::Results::Create(info))); } -SocketSetKeepAliveFunction::SocketSetKeepAliveFunction() {} +SocketSetKeepAliveFunction::SocketSetKeepAliveFunction() = default; -SocketSetKeepAliveFunction::~SocketSetKeepAliveFunction() {} +SocketSetKeepAliveFunction::~SocketSetKeepAliveFunction() = default; -bool SocketSetKeepAliveFunction::Prepare() { - params_ = api::socket::SetKeepAlive::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketSetKeepAliveFunction::Work() { + std::unique_ptr<api::socket::SetKeepAlive::Params> params = + api::socket::SetKeepAlive::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketSetKeepAliveFunction::AsyncWorkStart() { - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - SetResult(std::make_unique<base::Value>(false)); - error_ = kSocketNotFoundError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithArguments(api::socket::SetKeepAlive::Results::Create(false), + kSocketNotFoundError)); } int delay = 0; - if (params_->delay.get()) - delay = *params_->delay; + if (params->delay.get()) + delay = *params->delay; socket->SetKeepAlive( - params_->enable, delay, + params->enable, delay, base::BindOnce(&SocketSetKeepAliveFunction::OnCompleted, this)); + return RespondLater(); } void SocketSetKeepAliveFunction::OnCompleted(bool success) { - SetResult(std::make_unique<base::Value>(success)); - AsyncWorkCompleted(); + Respond(OneArgument(base::Value(success))); } -SocketSetNoDelayFunction::SocketSetNoDelayFunction() {} +SocketSetNoDelayFunction::SocketSetNoDelayFunction() = default; -SocketSetNoDelayFunction::~SocketSetNoDelayFunction() {} +SocketSetNoDelayFunction::~SocketSetNoDelayFunction() = default; -bool SocketSetNoDelayFunction::Prepare() { - params_ = api::socket::SetNoDelay::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketSetNoDelayFunction::Work() { + std::unique_ptr<api::socket::SetNoDelay::Params> params = + api::socket::SetNoDelay::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketSetNoDelayFunction::AsyncWorkStart() { - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(false)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithArguments( + api::socket::SetNoDelay::Results::Create(false), kSocketNotFoundError)); } socket->SetNoDelay( - params_->no_delay, + params->no_delay, base::BindOnce(&SocketSetNoDelayFunction::OnCompleted, this)); + return RespondLater(); } void SocketSetNoDelayFunction::OnCompleted(bool success) { - SetResult(std::make_unique<base::Value>(success)); - AsyncWorkCompleted(); + Respond(OneArgument(base::Value(success))); } -SocketGetInfoFunction::SocketGetInfoFunction() {} +SocketGetInfoFunction::SocketGetInfoFunction() = default; -SocketGetInfoFunction::~SocketGetInfoFunction() {} +SocketGetInfoFunction::~SocketGetInfoFunction() = default; -bool SocketGetInfoFunction::Prepare() { - params_ = api::socket::GetInfo::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketGetInfoFunction::Work() { + std::unique_ptr<api::socket::GetInfo::Params> params = + api::socket::GetInfo::Params::Create(*args_); -void SocketGetInfoFunction::Work() { - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - return; + return RespondNow(Error(kSocketNotFoundError)); } api::socket::SocketInfo info; @@ -875,7 +827,7 @@ info.local_port = std::make_unique<int>(localAddress.port()); } - SetResult(info.ToValue()); + return RespondNow(ArgumentList(api::socket::GetInfo::Results::Create(info))); } ExtensionFunction::ResponseAction SocketGetNetworkListFunction::Run() { @@ -907,31 +859,22 @@ ArgumentList(api::socket::GetNetworkList::Results::Create(create_arg))); } -SocketJoinGroupFunction::SocketJoinGroupFunction() {} +SocketJoinGroupFunction::SocketJoinGroupFunction() = default; -SocketJoinGroupFunction::~SocketJoinGroupFunction() {} +SocketJoinGroupFunction::~SocketJoinGroupFunction() = default; -bool SocketJoinGroupFunction::Prepare() { - params_ = api::socket::JoinGroup::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketJoinGroupFunction::Work() { + std::unique_ptr<api::socket::JoinGroup::Params> params = + api::socket::JoinGroup::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketJoinGroupFunction::AsyncWorkStart() { - int result = -1; - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } if (socket->GetSocketType() != Socket::TYPE_UDP) { - error_ = kMulticastSocketTypeError; - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kMulticastSocketTypeError)); } SocketPermission::CheckParam param( @@ -941,51 +884,40 @@ if (!extension()->permissions_data()->CheckAPIPermissionWithParam( APIPermissionID::kSocket, ¶m)) { - error_ = kPermissionError; - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kPermissionError)); } static_cast<UDPSocket*>(socket)->JoinGroup( - params_->address, + params->address, base::BindOnce(&SocketJoinGroupFunction::OnCompleted, this)); + return RespondLater(); } void SocketJoinGroupFunction::OnCompleted(int result) { - if (result != net::OK) { - error_ = net::ErrorToString(result); + if (result == net::OK) { + Respond(OneArgument(base::Value(result))); + } else { + Respond(ErrorWithCode(result, net::ErrorToString(result))); } - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); } -SocketLeaveGroupFunction::SocketLeaveGroupFunction() {} +SocketLeaveGroupFunction::SocketLeaveGroupFunction() = default; -SocketLeaveGroupFunction::~SocketLeaveGroupFunction() {} +SocketLeaveGroupFunction::~SocketLeaveGroupFunction() = default; -bool SocketLeaveGroupFunction::Prepare() { - params_ = api::socket::LeaveGroup::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketLeaveGroupFunction::Work() { + std::unique_ptr<api::socket::LeaveGroup::Params> params = + api::socket::LeaveGroup::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketLeaveGroupFunction::AsyncWorkStart() { - int result = -1; - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } if (socket->GetSocketType() != Socket::TYPE_UDP) { - error_ = kMulticastSocketTypeError; - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kMulticastSocketTypeError)); } SocketPermission::CheckParam param( @@ -994,112 +926,98 @@ kWildcardPort); if (!extension()->permissions_data()->CheckAPIPermissionWithParam( APIPermissionID::kSocket, ¶m)) { - error_ = kPermissionError; - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(-1, kPermissionError)); } static_cast<UDPSocket*>(socket)->LeaveGroup( - params_->address, + params->address, base::BindOnce(&SocketLeaveGroupFunction::OnCompleted, this)); + return RespondLater(); } void SocketLeaveGroupFunction::OnCompleted(int result) { - if (result != net::OK) - error_ = net::ErrorToString(result); - SetResult(std::make_unique<base::Value>(result)); - AsyncWorkCompleted(); + if (result == net::OK) { + Respond(OneArgument(base::Value(result))); + } else { + Respond(ErrorWithCode(result, net::ErrorToString(result))); + } } -SocketSetMulticastTimeToLiveFunction::SocketSetMulticastTimeToLiveFunction() {} +SocketSetMulticastTimeToLiveFunction::SocketSetMulticastTimeToLiveFunction() = + default; -SocketSetMulticastTimeToLiveFunction::~SocketSetMulticastTimeToLiveFunction() {} +SocketSetMulticastTimeToLiveFunction::~SocketSetMulticastTimeToLiveFunction() = + default; -bool SocketSetMulticastTimeToLiveFunction::Prepare() { - params_ = api::socket::SetMulticastTimeToLive::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} -void SocketSetMulticastTimeToLiveFunction::Work() { - int result = -1; - Socket* socket = GetSocket(params_->socket_id); +ExtensionFunction::ResponseAction SocketSetMulticastTimeToLiveFunction::Work() { + std::unique_ptr<api::socket::SetMulticastTimeToLive::Params> params = + api::socket::SetMulticastTimeToLive::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); + + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } if (socket->GetSocketType() != Socket::TYPE_UDP) { - error_ = kMulticastSocketTypeError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kMulticastSocketTypeError)); } - result = - static_cast<UDPSocket*>(socket)->SetMulticastTimeToLive(params_->ttl); - if (result != 0) - error_ = net::ErrorToString(result); - SetResult(std::make_unique<base::Value>(result)); + int result = + static_cast<UDPSocket*>(socket)->SetMulticastTimeToLive(params->ttl); + if (result == 0) { + return RespondNow(OneArgument(base::Value(result))); + } else { + return RespondNow(ErrorWithCode(result, net::ErrorToString(result))); + } } SocketSetMulticastLoopbackModeFunction:: - SocketSetMulticastLoopbackModeFunction() {} + SocketSetMulticastLoopbackModeFunction() = default; SocketSetMulticastLoopbackModeFunction:: - ~SocketSetMulticastLoopbackModeFunction() {} + ~SocketSetMulticastLoopbackModeFunction() = default; -bool SocketSetMulticastLoopbackModeFunction::Prepare() { - params_ = api::socket::SetMulticastLoopbackMode::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction +SocketSetMulticastLoopbackModeFunction::Work() { + std::unique_ptr<api::socket::SetMulticastLoopbackMode::Params> params = + api::socket::SetMulticastLoopbackMode::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketSetMulticastLoopbackModeFunction::Work() { - int result = -1; - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } if (socket->GetSocketType() != Socket::TYPE_UDP) { - error_ = kMulticastSocketTypeError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kMulticastSocketTypeError)); } - result = static_cast<UDPSocket*>(socket) - ->SetMulticastLoopbackMode(params_->enabled); - if (result != 0) - error_ = net::ErrorToString(result); - SetResult(std::make_unique<base::Value>(result)); + int result = static_cast<UDPSocket*>(socket)->SetMulticastLoopbackMode( + params->enabled); + if (result == 0) { + return RespondNow(OneArgument(base::Value(result))); + } else { + return RespondNow(ErrorWithCode(result, net::ErrorToString(result))); + } } -SocketGetJoinedGroupsFunction::SocketGetJoinedGroupsFunction() {} +SocketGetJoinedGroupsFunction::SocketGetJoinedGroupsFunction() = default; -SocketGetJoinedGroupsFunction::~SocketGetJoinedGroupsFunction() {} +SocketGetJoinedGroupsFunction::~SocketGetJoinedGroupsFunction() = default; -bool SocketGetJoinedGroupsFunction::Prepare() { - params_ = api::socket::GetJoinedGroups::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketGetJoinedGroupsFunction::Work() { + std::unique_ptr<api::socket::GetJoinedGroups::Params> params = + api::socket::GetJoinedGroups::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketGetJoinedGroupsFunction::Work() { - int result = -1; - Socket* socket = GetSocket(params_->socket_id); + Socket* socket = GetSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kSocketNotFoundError)); } if (socket->GetSocketType() != Socket::TYPE_UDP) { - error_ = kMulticastSocketTypeError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kMulticastSocketTypeError)); } SocketPermission::CheckParam param( @@ -1108,64 +1026,48 @@ kWildcardPort); if (!extension()->permissions_data()->CheckAPIPermissionWithParam( APIPermissionID::kSocket, ¶m)) { - error_ = kPermissionError; - SetResult(std::make_unique<base::Value>(result)); - return; + return RespondNow(ErrorWithCode(-1, kPermissionError)); } - std::unique_ptr<base::ListValue> values(new base::ListValue()); + base::Value values(base::Value::Type::LIST); auto* udp_socket = static_cast<UDPSocket*>(socket); for (const std::string& group : udp_socket->GetJoinedGroups()) { - values->Append(group); + values.Append(group); } - SetResult(std::move(values)); + return RespondNow(OneArgument(std::move(values))); } -SocketSecureFunction::SocketSecureFunction() { -} +SocketSecureFunction::SocketSecureFunction() = default; -SocketSecureFunction::~SocketSecureFunction() { -} +SocketSecureFunction::~SocketSecureFunction() = default; -bool SocketSecureFunction::Prepare() { +ExtensionFunction::ResponseAction SocketSecureFunction::Work() { DCHECK_CURRENTLY_ON(BrowserThread::UI); params_ = api::socket::Secure::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} - -// Override the regular implementation, which would call AsyncWorkCompleted -// immediately after Work(). -void SocketSecureFunction::AsyncWorkStart() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); Socket* socket = GetSocket(params_->socket_id); if (!socket) { - SetResult(std::make_unique<base::Value>(net::ERR_INVALID_ARGUMENT)); - error_ = kSocketNotFoundError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithCode(net::ERR_INVALID_ARGUMENT, kSocketNotFoundError)); } // Make sure that the socket is a TCP client socket. if (socket->GetSocketType() != Socket::TYPE_TCP) { - SetResult(std::make_unique<base::Value>(net::ERR_INVALID_ARGUMENT)); - error_ = kSecureSocketTypeError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithCode(net::ERR_INVALID_ARGUMENT, kSecureSocketTypeError)); } if (!socket->IsConnected()) { - SetResult(std::make_unique<base::Value>(net::ERR_INVALID_ARGUMENT)); - error_ = kSocketNotConnectedError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithCode(net::ERR_INVALID_ARGUMENT, kSocketNotConnectedError)); } TCPSocket* tcp_socket = static_cast<TCPSocket*>(socket); tcp_socket->UpgradeToTLS( params_->options.get(), base::BindOnce(&SocketSecureFunction::TlsConnectDone, this)); + return RespondLater(); } void SocketSecureFunction::TlsConnectDone( @@ -1177,10 +1079,7 @@ mojo::ScopedDataPipeProducerHandle send_pipe_handle) { if (result != net::OK) { RemoveSocket(params_->socket_id); - error_ = net::ErrorToString(result); - results_ = std::make_unique<base::ListValue>( - api::socket::Secure::Results::Create(result)); - AsyncWorkCompleted(); + Respond(ErrorWithCode(result, net::ErrorToString(result))); return; } @@ -1189,9 +1088,7 @@ std::move(receive_pipe_handle), std::move(send_pipe_handle), extension_id()); ReplaceSocket(params_->socket_id, socket.release()); - results_ = std::make_unique<base::ListValue>( - api::socket::Secure::Results::Create(result)); - AsyncWorkCompleted(); + Respond(OneArgument(base::Value(result))); } } // namespace extensions
diff --git a/extensions/browser/api/socket/socket_api.h b/extensions/browser/api/socket/socket_api.h index deeb8ed..852e097 100644 --- a/extensions/browser/api/socket/socket_api.h +++ b/extensions/browser/api/socket/socket_api.h
@@ -234,7 +234,7 @@ mojo::Receiver<network::mojom::ResolveHostClient> receiver_{this}; }; -class SocketCreateFunction : public SocketAsyncApiFunction { +class SocketCreateFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.create", SOCKET_CREATE) @@ -243,36 +243,22 @@ protected: ~SocketCreateFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; + // SocketApiFunction: + ResponseAction Work() override; private: FRIEND_TEST_ALL_PREFIXES(SocketUnitTest, Create); - enum SocketType { kSocketTypeInvalid = -1, kSocketTypeTCP, kSocketTypeUDP }; - - // These two fields are only applicable if |socket_type_| is UDP. - mojo::PendingRemote<network::mojom::UDPSocket> socket_; - mojo::PendingReceiver<network::mojom::UDPSocketListener> - socket_listener_receiver_; - - std::unique_ptr<api::socket::Create::Params> params_; - SocketType socket_type_; }; -class SocketDestroyFunction : public SocketAsyncApiFunction { +class SocketDestroyFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.destroy", SOCKET_DESTROY) protected: ~SocketDestroyFunction() override {} - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - int socket_id_; + // SocketApiFunction: + ResponseAction Work() override; }; class SocketConnectFunction : public SocketExtensionWithDnsLookupFunction { @@ -299,31 +285,26 @@ uint16_t port_ = 0; }; -class SocketDisconnectFunction : public SocketAsyncApiFunction { +class SocketDisconnectFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.disconnect", SOCKET_DISCONNECT) protected: ~SocketDisconnectFunction() override {} - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - int socket_id_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketBindFunction : public SocketAsyncApiFunction { +class SocketBindFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.bind", SOCKET_BIND) protected: ~SocketBindFunction() override {} - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(int net_error); @@ -333,7 +314,7 @@ uint16_t port_; }; -class SocketListenFunction : public SocketAsyncApiFunction { +class SocketListenFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.listen", SOCKET_LISTEN) @@ -342,16 +323,15 @@ protected: ~SocketListenFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(int result, const std::string& error_msg); std::unique_ptr<api::socket::Listen::Params> params_; }; -class SocketAcceptFunction : public SocketAsyncApiFunction { +class SocketAcceptFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.accept", SOCKET_ACCEPT) @@ -360,9 +340,8 @@ protected: ~SocketAcceptFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnAccept(int result_code, @@ -370,11 +349,9 @@ const absl::optional<net::IPEndPoint>& remote_addr, mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, mojo::ScopedDataPipeProducerHandle send_pipe_handle); - - std::unique_ptr<api::socket::Accept::Params> params_; }; -class SocketReadFunction : public SocketAsyncApiFunction { +class SocketReadFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.read", SOCKET_READ) @@ -383,18 +360,14 @@ protected: ~SocketReadFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; void OnCompleted(int result, scoped_refptr<net::IOBuffer> io_buffer, bool socket_destroying); - - private: - std::unique_ptr<api::socket::Read::Params> params_; }; -class SocketWriteFunction : public SocketAsyncApiFunction { +class SocketWriteFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.write", SOCKET_WRITE) @@ -403,18 +376,12 @@ protected: ~SocketWriteFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; void OnCompleted(int result); - - private: - int socket_id_; - scoped_refptr<net::IOBuffer> io_buffer_; - size_t io_buffer_size_; }; -class SocketRecvFromFunction : public SocketAsyncApiFunction { +class SocketRecvFromFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.recvFrom", SOCKET_RECVFROM) @@ -423,17 +390,13 @@ protected: ~SocketRecvFromFunction() override; - // AsyncApiFunction - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; void OnCompleted(int result, scoped_refptr<net::IOBuffer> io_buffer, bool socket_destroying, const std::string& address, uint16_t port); - - private: - std::unique_ptr<api::socket::RecvFrom::Params> params_; }; class SocketSendToFunction : public SocketExtensionWithDnsLookupFunction { @@ -447,7 +410,6 @@ // SocketApiFunction:: ResponseAction Work() override; - void OnCompleted(int result); // SocketExtensionWithDnsLookupFunction: @@ -463,7 +425,7 @@ uint16_t port_ = 0; }; -class SocketSetKeepAliveFunction : public SocketAsyncApiFunction { +class SocketSetKeepAliveFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.setKeepAlive", SOCKET_SETKEEPALIVE) @@ -472,17 +434,14 @@ protected: ~SocketSetKeepAliveFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(bool success); - - std::unique_ptr<api::socket::SetKeepAlive::Params> params_; }; -class SocketSetNoDelayFunction : public SocketAsyncApiFunction { +class SocketSetNoDelayFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.setNoDelay", SOCKET_SETNODELAY) @@ -491,9 +450,8 @@ protected: ~SocketSetNoDelayFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(bool success); @@ -501,7 +459,7 @@ std::unique_ptr<api::socket::SetNoDelay::Params> params_; }; -class SocketGetInfoFunction : public SocketAsyncApiFunction { +class SocketGetInfoFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.getInfo", SOCKET_GETINFO) @@ -510,12 +468,8 @@ protected: ~SocketGetInfoFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<api::socket::GetInfo::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; class SocketGetNetworkListFunction : public ExtensionFunction { @@ -533,7 +487,7 @@ const absl::optional<net::NetworkInterfaceList>& interface_list); }; -class SocketJoinGroupFunction : public SocketAsyncApiFunction { +class SocketJoinGroupFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.joinGroup", SOCKET_MULTICAST_JOIN_GROUP) @@ -542,17 +496,14 @@ protected: ~SocketJoinGroupFunction() override; - // AsyncApiFunction - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(int result); - - std::unique_ptr<api::socket::JoinGroup::Params> params_; }; -class SocketLeaveGroupFunction : public SocketAsyncApiFunction { +class SocketLeaveGroupFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.leaveGroup", SOCKET_MULTICAST_LEAVE_GROUP) @@ -561,17 +512,14 @@ protected: ~SocketLeaveGroupFunction() override; - // AsyncApiFunction - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(int result); - - std::unique_ptr<api::socket::LeaveGroup::Params> params_; }; -class SocketSetMulticastTimeToLiveFunction : public SocketAsyncApiFunction { +class SocketSetMulticastTimeToLiveFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.setMulticastTimeToLive", SOCKET_MULTICAST_SET_TIME_TO_LIVE) @@ -581,15 +529,11 @@ protected: ~SocketSetMulticastTimeToLiveFunction() override; - // AsyncApiFunction - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<api::socket::SetMulticastTimeToLive::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketSetMulticastLoopbackModeFunction : public SocketAsyncApiFunction { +class SocketSetMulticastLoopbackModeFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.setMulticastLoopbackMode", SOCKET_MULTICAST_SET_LOOPBACK_MODE) @@ -599,15 +543,11 @@ protected: ~SocketSetMulticastLoopbackModeFunction() override; - // AsyncApiFunction - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<api::socket::SetMulticastLoopbackMode::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketGetJoinedGroupsFunction : public SocketAsyncApiFunction { +class SocketGetJoinedGroupsFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.getJoinedGroups", SOCKET_MULTICAST_GET_JOINED_GROUPS) @@ -617,15 +557,11 @@ protected: ~SocketGetJoinedGroupsFunction() override; - // AsyncApiFunction - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<api::socket::GetJoinedGroups::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketSecureFunction : public SocketAsyncApiFunction { +class SocketSecureFunction : public SocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("socket.secure", SOCKET_SECURE) SocketSecureFunction(); @@ -633,9 +569,8 @@ protected: ~SocketSecureFunction() override; - // AsyncApiFunction - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void TlsConnectDone(
diff --git a/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc b/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc index 4a50da6..c14eadfa 100644 --- a/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc +++ b/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc
@@ -92,20 +92,20 @@ using content::SocketPermissionRequest; -TCPSocketAsyncApiFunction::~TCPSocketAsyncApiFunction() {} +TCPSocketApiFunction::~TCPSocketApiFunction() = default; std::unique_ptr<SocketResourceManagerInterface> -TCPSocketAsyncApiFunction::CreateSocketResourceManager() { +TCPSocketApiFunction::CreateSocketResourceManager() { return std::unique_ptr<SocketResourceManagerInterface>( new SocketResourceManager<ResumableTCPSocket>()); } -ResumableTCPSocket* TCPSocketAsyncApiFunction::GetTcpSocket(int socket_id) { +ResumableTCPSocket* TCPSocketApiFunction::GetTcpSocket(int socket_id) { return static_cast<ResumableTCPSocket*>(GetSocket(socket_id)); } TCPSocketExtensionWithDnsLookupFunction:: - ~TCPSocketExtensionWithDnsLookupFunction() {} + ~TCPSocketExtensionWithDnsLookupFunction() = default; std::unique_ptr<SocketResourceManagerInterface> TCPSocketExtensionWithDnsLookupFunction::CreateSocketResourceManager() { @@ -118,157 +118,137 @@ return static_cast<ResumableTCPSocket*>(GetSocket(socket_id)); } -SocketsTcpCreateFunction::SocketsTcpCreateFunction() {} +SocketsTcpCreateFunction::SocketsTcpCreateFunction() = default; -SocketsTcpCreateFunction::~SocketsTcpCreateFunction() {} +SocketsTcpCreateFunction::~SocketsTcpCreateFunction() = default; -bool SocketsTcpCreateFunction::Prepare() { - params_ = sockets_tcp::Create::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpCreateFunction::Work() { + std::unique_ptr<sockets_tcp::Create::Params> params = + sockets_tcp::Create::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpCreateFunction::Work() { ResumableTCPSocket* socket = - new ResumableTCPSocket(browser_context(), extension_->id()); + new ResumableTCPSocket(browser_context(), extension_id()); - sockets_tcp::SocketProperties* properties = params_->properties.get(); + sockets_tcp::SocketProperties* properties = params->properties.get(); if (properties) { SetSocketProperties(socket, properties); } sockets_tcp::CreateInfo create_info; create_info.socket_id = AddSocket(socket); - results_ = std::make_unique<base::ListValue>( - sockets_tcp::Create::Results::Create(create_info)); + return RespondNow( + ArgumentList(sockets_tcp::Create::Results::Create(create_info))); } -SocketsTcpUpdateFunction::SocketsTcpUpdateFunction() {} +SocketsTcpUpdateFunction::SocketsTcpUpdateFunction() = default; -SocketsTcpUpdateFunction::~SocketsTcpUpdateFunction() {} +SocketsTcpUpdateFunction::~SocketsTcpUpdateFunction() = default; -bool SocketsTcpUpdateFunction::Prepare() { - params_ = sockets_tcp::Update::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpUpdateFunction::Work() { + std::unique_ptr<sockets_tcp::Update::Params> params = + sockets_tcp::Update::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpUpdateFunction::Work() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - return; + return RespondNow(Error(kSocketNotFoundError)); } - SetSocketProperties(socket, ¶ms_->properties); - results_ = - std::make_unique<base::ListValue>(sockets_tcp::Update::Results::Create()); + SetSocketProperties(socket, ¶ms->properties); + return RespondNow(NoArguments()); } -SocketsTcpSetPausedFunction::SocketsTcpSetPausedFunction() - : socket_event_dispatcher_(nullptr) {} +SocketsTcpSetPausedFunction::SocketsTcpSetPausedFunction() = default; -SocketsTcpSetPausedFunction::~SocketsTcpSetPausedFunction() {} +SocketsTcpSetPausedFunction::~SocketsTcpSetPausedFunction() = default; -bool SocketsTcpSetPausedFunction::Prepare() { - params_ = api::sockets_tcp::SetPaused::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); +ExtensionFunction::ResponseAction SocketsTcpSetPausedFunction::Work() { + std::unique_ptr<sockets_tcp::SetPaused::Params> params = + api::sockets_tcp::SetPaused::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); - socket_event_dispatcher_ = TCPSocketEventDispatcher::Get(browser_context()); - DCHECK(socket_event_dispatcher_) + TCPSocketEventDispatcher* socket_event_dispatcher = + TCPSocketEventDispatcher::Get(browser_context()); + DCHECK(socket_event_dispatcher) << "There is no socket event dispatcher. " "If this assertion is failing during a test, then it is likely that " "TestExtensionSystem is failing to provide an instance of " "TCPSocketEventDispatcher."; - return !!socket_event_dispatcher_; -} -void SocketsTcpSetPausedFunction::Work() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - return; + return RespondNow(Error(kSocketNotFoundError)); } - if (socket->paused() != params_->paused) { - socket->set_paused(params_->paused); - if (socket->IsConnected() && !params_->paused) { - socket_event_dispatcher_->OnSocketResume(extension_->id(), - params_->socket_id); + if (socket->paused() != params->paused) { + socket->set_paused(params->paused); + if (socket->IsConnected() && !params->paused) { + socket_event_dispatcher->OnSocketResume(extension_id(), + params->socket_id); } } - results_ = std::make_unique<base::ListValue>( - sockets_tcp::SetPaused::Results::Create()); + return RespondNow(NoArguments()); } -SocketsTcpSetKeepAliveFunction::SocketsTcpSetKeepAliveFunction() {} +SocketsTcpSetKeepAliveFunction::SocketsTcpSetKeepAliveFunction() = default; -SocketsTcpSetKeepAliveFunction::~SocketsTcpSetKeepAliveFunction() {} +SocketsTcpSetKeepAliveFunction::~SocketsTcpSetKeepAliveFunction() = default; -bool SocketsTcpSetKeepAliveFunction::Prepare() { - params_ = api::sockets_tcp::SetKeepAlive::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpSetKeepAliveFunction::Work() { + std::unique_ptr<sockets_tcp::SetKeepAlive::Params> params = + api::sockets_tcp::SetKeepAlive::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpSetKeepAliveFunction::AsyncWorkStart() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - results_ = std::make_unique<base::ListValue>( - sockets_tcp::SetKeepAlive::Results::Create(net::ERR_FAILED)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(net::ERR_FAILED, kSocketNotFoundError)); } - int delay = params_->delay ? *params_->delay : 0; + int delay = params->delay ? *params->delay : 0; socket->SetKeepAlive( - params_->enable, delay, + params->enable, delay, base::BindOnce(&SocketsTcpSetKeepAliveFunction::OnCompleted, this)); + return RespondLater(); } void SocketsTcpSetKeepAliveFunction::OnCompleted(bool success) { - int net_result = (success ? net::OK : net::ERR_FAILED); - results_ = std::make_unique<base::ListValue>( - sockets_tcp::SetKeepAlive::Results::Create(net_result)); - if (net_result != net::OK) - error_ = net::ErrorToString(net_result); - AsyncWorkCompleted(); + if (success) { + Respond(OneArgument(base::Value(net::OK))); + } else { + Respond( + ErrorWithCode(net::ERR_FAILED, net::ErrorToString(net::ERR_FAILED))); + } } -SocketsTcpSetNoDelayFunction::SocketsTcpSetNoDelayFunction() {} +SocketsTcpSetNoDelayFunction::SocketsTcpSetNoDelayFunction() = default; -SocketsTcpSetNoDelayFunction::~SocketsTcpSetNoDelayFunction() {} +SocketsTcpSetNoDelayFunction::~SocketsTcpSetNoDelayFunction() = default; -bool SocketsTcpSetNoDelayFunction::Prepare() { - params_ = api::sockets_tcp::SetNoDelay::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpSetNoDelayFunction::Work() { + std::unique_ptr<sockets_tcp::SetNoDelay::Params> params = + api::sockets_tcp::SetNoDelay::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpSetNoDelayFunction::AsyncWorkStart() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - results_ = std::make_unique<base::ListValue>( - sockets_tcp::SetNoDelay::Results::Create(net::ERR_FAILED)); - AsyncWorkCompleted(); - return; + return RespondNow(ErrorWithCode(net::ERR_FAILED, kSocketNotFoundError)); } socket->SetNoDelay( - params_->no_delay, + params->no_delay, base::BindOnce(&SocketsTcpSetNoDelayFunction::OnCompleted, this)); + return RespondLater(); } void SocketsTcpSetNoDelayFunction::OnCompleted(bool success) { - int net_result = (success ? net::OK : net::ERR_FAILED); - results_ = std::make_unique<base::ListValue>( - sockets_tcp::SetNoDelay::Results::Create(net_result)); - if (net_result != net::OK) - error_ = net::ErrorToString(net_result); - AsyncWorkCompleted(); + if (success) { + Respond(OneArgument(base::Value(net::OK))); + } else { + Respond( + ErrorWithCode(net::ERR_FAILED, net::ErrorToString(net::ERR_FAILED))); + } } SocketsTcpConnectFunction::SocketsTcpConnectFunction() = default; @@ -280,14 +260,11 @@ EXTENSION_FUNCTION_VALIDATE(params_.get()); socket_event_dispatcher_ = TCPSocketEventDispatcher::Get(browser_context()); - if (!socket_event_dispatcher_) { - NOTREACHED() - << "There is no socket event dispatcher. " - "If this assertion is failing during a test, then it is likely that " - "TestExtensionSystem is failing to provide an instance of " - "TCPSocketEventDispatcher."; - return RespondNow(NoArguments()); - } + DCHECK(socket_event_dispatcher_) + << "There is no socket event dispatcher. " + "If this assertion is failing during a test, then it is likely that " + "TestExtensionSystem is failing to provide an instance of " + "TCPSocketEventDispatcher."; ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); if (!socket) { @@ -329,7 +306,7 @@ void SocketsTcpConnectFunction::OnCompleted(int net_result) { if (net_result == net::OK) { - socket_event_dispatcher_->OnSocketConnect(extension_->id(), + socket_event_dispatcher_->OnSocketConnect(extension_id(), params_->socket_id); } @@ -340,51 +317,46 @@ } } -SocketsTcpDisconnectFunction::SocketsTcpDisconnectFunction() {} +SocketsTcpDisconnectFunction::SocketsTcpDisconnectFunction() = default; -SocketsTcpDisconnectFunction::~SocketsTcpDisconnectFunction() {} +SocketsTcpDisconnectFunction::~SocketsTcpDisconnectFunction() = default; -bool SocketsTcpDisconnectFunction::Prepare() { - params_ = sockets_tcp::Disconnect::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpDisconnectFunction::Work() { + std::unique_ptr<sockets_tcp::Disconnect::Params> params = + sockets_tcp::Disconnect::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpDisconnectFunction::Work() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - return; + return RespondNow(Error(kSocketNotFoundError)); } socket->Disconnect(false /* socket_destroying */); - results_ = std::make_unique<base::ListValue>( - sockets_tcp::Disconnect::Results::Create()); + return RespondNow(NoArguments()); } -SocketsTcpSendFunction::SocketsTcpSendFunction() : io_buffer_size_(0) {} +SocketsTcpSendFunction::SocketsTcpSendFunction() = default; -SocketsTcpSendFunction::~SocketsTcpSendFunction() {} +SocketsTcpSendFunction::~SocketsTcpSendFunction() = default; -bool SocketsTcpSendFunction::Prepare() { - params_ = sockets_tcp::Send::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - io_buffer_size_ = params_->data.size(); - io_buffer_ = base::MakeRefCounted<net::WrappedIOBuffer>( - reinterpret_cast<const char*>(params_->data.data())); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpSendFunction::Work() { + std::unique_ptr<sockets_tcp::Send::Params> params = + sockets_tcp::Send::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); + size_t io_buffer_size = params->data.size(); -void SocketsTcpSendFunction::AsyncWorkStart() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + scoped_refptr<net::IOBuffer> io_buffer = + base::MakeRefCounted<net::IOBuffer>(params->data.size()); + std::copy(params->data.begin(), params->data.end(), io_buffer->data()); + + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - AsyncWorkCompleted(); - return; + return RespondNow(Error(kSocketNotFoundError)); } - socket->Write(io_buffer_, io_buffer_size_, + socket->Write(io_buffer, io_buffer_size, base::BindOnce(&SocketsTcpSendFunction::OnCompleted, this)); + return RespondLater(); } void SocketsTcpSendFunction::OnCompleted(int net_result) { @@ -404,65 +376,58 @@ send_info.bytes_sent = std::make_unique<int>(bytes_sent); } - if (net_result != net::OK) - error_ = net::ErrorToString(net_result); - results_ = std::make_unique<base::ListValue>( - sockets_tcp::Send::Results::Create(send_info)); - AsyncWorkCompleted(); + auto args = sockets_tcp::Send::Results::Create(send_info); + if (net_result == net::OK) { + Respond(ArgumentList(std::move(args))); + } else { + Respond( + ErrorWithArguments(std::move(args), net::ErrorToString(net_result))); + } } -SocketsTcpCloseFunction::SocketsTcpCloseFunction() {} +SocketsTcpCloseFunction::SocketsTcpCloseFunction() = default; -SocketsTcpCloseFunction::~SocketsTcpCloseFunction() {} +SocketsTcpCloseFunction::~SocketsTcpCloseFunction() = default; -bool SocketsTcpCloseFunction::Prepare() { - params_ = sockets_tcp::Close::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpCloseFunction::Work() { + std::unique_ptr<sockets_tcp::Close::Params> params = + sockets_tcp::Close::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpCloseFunction::Work() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - return; + return RespondNow(Error(kSocketNotFoundError)); } - RemoveSocket(params_->socket_id); - results_ = - std::make_unique<base::ListValue>(sockets_tcp::Close::Results::Create()); + RemoveSocket(params->socket_id); + return RespondNow(NoArguments()); } -SocketsTcpGetInfoFunction::SocketsTcpGetInfoFunction() {} +SocketsTcpGetInfoFunction::SocketsTcpGetInfoFunction() = default; -SocketsTcpGetInfoFunction::~SocketsTcpGetInfoFunction() {} +SocketsTcpGetInfoFunction::~SocketsTcpGetInfoFunction() = default; -bool SocketsTcpGetInfoFunction::Prepare() { - params_ = sockets_tcp::GetInfo::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} +ExtensionFunction::ResponseAction SocketsTcpGetInfoFunction::Work() { + std::unique_ptr<sockets_tcp::GetInfo::Params> params = + sockets_tcp::GetInfo::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params.get()); -void SocketsTcpGetInfoFunction::Work() { - ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); + ResumableTCPSocket* socket = GetTcpSocket(params->socket_id); if (!socket) { - error_ = kSocketNotFoundError; - return; + return RespondNow(Error(kSocketNotFoundError)); } sockets_tcp::SocketInfo socket_info = - CreateSocketInfo(params_->socket_id, socket); - results_ = std::make_unique<base::ListValue>( - sockets_tcp::GetInfo::Results::Create(socket_info)); + CreateSocketInfo(params->socket_id, socket); + return RespondNow( + ArgumentList(sockets_tcp::GetInfo::Results::Create(socket_info))); } -SocketsTcpGetSocketsFunction::SocketsTcpGetSocketsFunction() {} +SocketsTcpGetSocketsFunction::SocketsTcpGetSocketsFunction() = default; -SocketsTcpGetSocketsFunction::~SocketsTcpGetSocketsFunction() {} +SocketsTcpGetSocketsFunction::~SocketsTcpGetSocketsFunction() = default; -bool SocketsTcpGetSocketsFunction::Prepare() { return true; } - -void SocketsTcpGetSocketsFunction::Work() { +ExtensionFunction::ResponseAction SocketsTcpGetSocketsFunction::Work() { std::vector<sockets_tcp::SocketInfo> socket_infos; std::unordered_set<int>* resource_ids = GetSocketIds(); if (resource_ids) { @@ -473,34 +438,23 @@ } } } - results_ = std::make_unique<base::ListValue>( - sockets_tcp::GetSockets::Results::Create(socket_infos)); + return RespondNow( + ArgumentList(sockets_tcp::GetSockets::Results::Create(socket_infos))); } -SocketsTcpSecureFunction::SocketsTcpSecureFunction() { -} +SocketsTcpSecureFunction::SocketsTcpSecureFunction() = default; -SocketsTcpSecureFunction::~SocketsTcpSecureFunction() { -} +SocketsTcpSecureFunction::~SocketsTcpSecureFunction() = default; -bool SocketsTcpSecureFunction::Prepare() { +ExtensionFunction::ResponseAction SocketsTcpSecureFunction::Work() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); params_ = api::sockets_tcp::Secure::Params::Create(*args_); EXTENSION_FUNCTION_VALIDATE(params_.get()); - return true; -} - -// Override the regular implementation, which would call AsyncWorkCompleted -// immediately after Work(). -void SocketsTcpSecureFunction::AsyncWorkStart() { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); ResumableTCPSocket* socket = GetTcpSocket(params_->socket_id); if (!socket) { - SetResult(std::make_unique<base::Value>(net::ERR_INVALID_ARGUMENT)); - error_ = kSocketNotFoundError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithCode(net::ERR_INVALID_ARGUMENT, kSocketNotFoundError)); } paused_ = socket->paused(); @@ -509,17 +463,13 @@ // Make sure it's a connected TCP client socket. Error out if it's already // secure()'d. if (socket->GetSocketType() != Socket::TYPE_TCP) { - SetResult(std::make_unique<base::Value>(net::ERR_INVALID_ARGUMENT)); - error_ = kInvalidSocketStateError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithCode(net::ERR_INVALID_ARGUMENT, kInvalidSocketStateError)); } if (!socket->IsConnected()) { - SetResult(std::make_unique<base::Value>(net::ERR_INVALID_ARGUMENT)); - error_ = kSocketNotConnectedError; - AsyncWorkCompleted(); - return; + return RespondNow( + ErrorWithCode(net::ERR_INVALID_ARGUMENT, kSocketNotConnectedError)); } // UpgradeSocketToTLS() uses the older API's SecureOptions. Copy over the @@ -541,6 +491,7 @@ socket->UpgradeToTLS( &legacy_params, base::BindOnce(&SocketsTcpSecureFunction::TlsConnectDone, this)); + return RespondLater(); } void SocketsTcpSecureFunction::TlsConnectDone( @@ -552,10 +503,7 @@ mojo::ScopedDataPipeProducerHandle send_pipe_handle) { if (result != net::OK) { RemoveSocket(params_->socket_id); - error_ = net::ErrorToString(result); - results_ = std::make_unique<base::ListValue>( - api::sockets_tcp::Secure::Results::Create(result)); - AsyncWorkCompleted(); + Respond(ErrorWithCode(result, net::ErrorToString(result))); return; } auto socket = @@ -565,9 +513,7 @@ socket->set_persistent(persistent_); socket->set_paused(paused_); ReplaceSocket(params_->socket_id, socket.release()); - results_ = std::make_unique<base::ListValue>( - api::sockets_tcp::Secure::Results::Create(result)); - AsyncWorkCompleted(); + Respond(OneArgument(base::Value(result))); } } // namespace api
diff --git a/extensions/browser/api/sockets_tcp/sockets_tcp_api.h b/extensions/browser/api/sockets_tcp/sockets_tcp_api.h index 9c47c48..277acb1 100644 --- a/extensions/browser/api/sockets_tcp/sockets_tcp_api.h +++ b/extensions/browser/api/sockets_tcp/sockets_tcp_api.h
@@ -25,9 +25,9 @@ class TCPSocketEventDispatcher; -class TCPSocketAsyncApiFunction : public SocketAsyncApiFunction { +class TCPSocketApiFunction : public SocketApiFunction { protected: - ~TCPSocketAsyncApiFunction() override; + ~TCPSocketApiFunction() override; std::unique_ptr<SocketResourceManagerInterface> CreateSocketResourceManager() override; @@ -46,7 +46,7 @@ ResumableTCPSocket* GetTcpSocket(int socket_id); }; -class SocketsTcpCreateFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpCreateFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.create", SOCKETS_TCP_CREATE) @@ -55,16 +55,14 @@ protected: ~SocketsTcpCreateFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; + // SocketApiFunction: + ResponseAction Work() override; private: FRIEND_TEST_ALL_PREFIXES(SocketsTcpUnitTest, Create); - std::unique_ptr<sockets_tcp::Create::Params> params_; }; -class SocketsTcpUpdateFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpUpdateFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.update", SOCKETS_TCP_UPDATE) @@ -73,15 +71,11 @@ protected: ~SocketsTcpUpdateFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<sockets_tcp::Update::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketsTcpSetPausedFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpSetPausedFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.setPaused", SOCKETS_TCP_SETPAUSED) @@ -90,16 +84,11 @@ protected: ~SocketsTcpSetPausedFunction() override; - // AsyncApiFunction - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<sockets_tcp::SetPaused::Params> params_; - TCPSocketEventDispatcher* socket_event_dispatcher_; + // SocketApiFunction + ResponseAction Work() override; }; -class SocketsTcpSetKeepAliveFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpSetKeepAliveFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.setKeepAlive", SOCKETS_TCP_SETKEEPALIVE) @@ -109,17 +98,14 @@ protected: ~SocketsTcpSetKeepAliveFunction() override; - // AsyncApiFunction - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction + ResponseAction Work() override; private: void OnCompleted(bool success); - - std::unique_ptr<sockets_tcp::SetKeepAlive::Params> params_; }; -class SocketsTcpSetNoDelayFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpSetNoDelayFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.setNoDelay", SOCKETS_TCP_SETNODELAY) @@ -128,14 +114,11 @@ protected: ~SocketsTcpSetNoDelayFunction() override; - // AsyncApiFunction - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction + ResponseAction Work() override; private: void OnCompleted(bool success); - - std::unique_ptr<sockets_tcp::SetNoDelay::Params> params_; }; class SocketsTcpConnectFunction @@ -162,7 +145,7 @@ TCPSocketEventDispatcher* socket_event_dispatcher_ = nullptr; }; -class SocketsTcpDisconnectFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpDisconnectFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.disconnect", SOCKETS_TCP_DISCONNECT) @@ -171,15 +154,11 @@ protected: ~SocketsTcpDisconnectFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<sockets_tcp::Disconnect::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketsTcpSendFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpSendFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.send", SOCKETS_TCP_SEND) @@ -188,20 +167,17 @@ protected: ~SocketsTcpSendFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void AsyncWorkStart() override; + // SocketApiFunction: + ResponseAction Work() override; private: void OnCompleted(int net_result); void SetSendResult(int net_result, int bytes_sent); std::unique_ptr<sockets_tcp::Send::Params> params_; - scoped_refptr<net::IOBuffer> io_buffer_; - size_t io_buffer_size_; }; -class SocketsTcpCloseFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpCloseFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.close", SOCKETS_TCP_CLOSE) @@ -210,15 +186,11 @@ protected: ~SocketsTcpCloseFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<sockets_tcp::Close::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketsTcpGetInfoFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpGetInfoFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.getInfo", SOCKETS_TCP_GETINFO) @@ -227,15 +199,11 @@ protected: ~SocketsTcpGetInfoFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; - - private: - std::unique_ptr<sockets_tcp::GetInfo::Params> params_; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketsTcpGetSocketsFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpGetSocketsFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.getSockets", SOCKETS_TCP_GETSOCKETS) @@ -244,12 +212,11 @@ protected: ~SocketsTcpGetSocketsFunction() override; - // AsyncApiFunction: - bool Prepare() override; - void Work() override; + // SocketApiFunction: + ResponseAction Work() override; }; -class SocketsTcpSecureFunction : public TCPSocketAsyncApiFunction { +class SocketsTcpSecureFunction : public TCPSocketApiFunction { public: DECLARE_EXTENSION_FUNCTION("sockets.tcp.secure", SOCKETS_TCP_SECURE) @@ -257,8 +224,7 @@ protected: ~SocketsTcpSecureFunction() override; - bool Prepare() override; - void AsyncWorkStart() override; + ResponseAction Work() override; private: void TlsConnectDone(
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc index 4a847a51..d29ec8d 100644 --- a/extensions/browser/content_verifier.cc +++ b/extensions/browser/content_verifier.cc
@@ -594,6 +594,11 @@ extension->id(), extension->version())); } +ContentVerifierKey ContentVerifier::GetContentVerifierKey() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + return delegate_->GetPublicKey(); +} + GURL ContentVerifier::GetSignatureFetchUrlForTest( const ExtensionId& extension_id, const base::Version& extension_version) { @@ -806,4 +811,9 @@ relative_unix_paths); } +void ContentVerifier::OverrideDelegateForTesting( + std::unique_ptr<ContentVerifierDelegate> delegate) { + delegate_ = std::move(delegate); +} + } // namespace extensions
diff --git a/extensions/browser/content_verifier.h b/extensions/browser/content_verifier.h index 6e707993..26592c6 100644 --- a/extensions/browser/content_verifier.h +++ b/extensions/browser/content_verifier.h
@@ -117,6 +117,10 @@ // arbitrary time, we are only allowed to do it during installation. bool ShouldComputeHashesOnInstall(const Extension& extension); + // Returns public key used to check content verification data. Normally it's + // Chrome Web Store key, but may be overridden in tests via delegate. + ContentVerifierKey GetContentVerifierKey(); + GURL GetSignatureFetchUrlForTest(const ExtensionId& extension_id, const base::Version& extension_version); @@ -140,6 +144,9 @@ const base::FilePath& extension_root, const std::set<base::FilePath>& relative_unix_paths); + void OverrideDelegateForTesting( + std::unique_ptr<ContentVerifierDelegate> delegate); + private: friend class base::RefCountedThreadSafe<ContentVerifier>; friend class HashHelper;
diff --git a/extensions/browser/content_verifier/test_utils.cc b/extensions/browser/content_verifier/test_utils.cc index dbabdf73..144c147 100644 --- a/extensions/browser/content_verifier/test_utils.cc +++ b/extensions/browser/content_verifier/test_utils.cc
@@ -202,7 +202,11 @@ } // MockContentVerifierDelegate ------------------------------------------------ -MockContentVerifierDelegate::MockContentVerifierDelegate() = default; +MockContentVerifierDelegate::MockContentVerifierDelegate() + : verifier_key_( + kWebstoreSignaturesPublicKey, + kWebstoreSignaturesPublicKey + kWebstoreSignaturesPublicKeySize) {} + MockContentVerifierDelegate::~MockContentVerifierDelegate() = default; ContentVerifierDelegate::VerifierSourceType @@ -212,8 +216,7 @@ ContentVerifierKey MockContentVerifierDelegate::GetPublicKey() { DCHECK_EQ(VerifierSourceType::SIGNED_HASHES, verifier_source_type_); - return ContentVerifierKey(kWebstoreSignaturesPublicKey, - kWebstoreSignaturesPublicKeySize); + return verifier_key_; } GURL MockContentVerifierDelegate::GetSignatureFetchUrl( @@ -244,6 +247,10 @@ verifier_source_type_ = type; } +void MockContentVerifierDelegate::SetVerifierKey(std::vector<uint8_t> key) { + verifier_key_ = std::move(key); +} + // VerifierObserver ----------------------------------------------------------- VerifierObserver::VerifierObserver() { EXPECT_TRUE( @@ -367,6 +374,11 @@ base::FilePath::StringType relative_path, std::string contents) { extension_dir_.WriteFile(relative_path, contents); + AddResource(std::move(relative_path), std::move(contents)); +} + +void TestExtensionBuilder::AddResource(base::FilePath::StringType relative_path, + std::string contents) { extension_resources_.emplace_back(base::FilePath(std::move(relative_path)), std::move(contents)); } @@ -386,10 +398,11 @@ extension_dir_.UnpackedPath()))); } -void TestExtensionBuilder::WriteVerifiedContents() { - std::unique_ptr<base::Value> payload = CreateVerifiedContents(); +std::string TestExtensionBuilder::CreateVerifiedContents() const { + std::unique_ptr<base::Value> payload = CreateVerifiedContentsPayload(); std::string payload_value; - ASSERT_TRUE(base::JSONWriter::Write(*payload, &payload_value)); + if (!base::JSONWriter::Write(*payload, &payload_value)) + return ""; std::string payload_b64; base::Base64UrlEncode( @@ -399,9 +412,10 @@ std::vector<uint8_t> signature_source(signature_sha256.begin(), signature_sha256.end()); std::vector<uint8_t> signature_value; - ASSERT_TRUE(crypto::SignatureCreator::Sign( - test_content_verifier_key_.get(), crypto::SignatureCreator::SHA256, - signature_source.data(), signature_source.size(), &signature_value)); + if (!crypto::SignatureCreator::Sign( + test_content_verifier_key_.get(), crypto::SignatureCreator::SHA256, + signature_source.data(), signature_source.size(), &signature_value)) + return ""; std::string signature_b64; base::Base64UrlEncode( @@ -430,12 +444,21 @@ .Build(); std::string json; - ASSERT_TRUE(base::JSONWriter::Write(*verified_contents, &json)); + if (!base::JSONWriter::Write(*verified_contents, &json)) + return ""; + + return json; +} + +void TestExtensionBuilder::WriteVerifiedContents() { + std::string verified_contents = CreateVerifiedContents(); + ASSERT_NE(verified_contents.size(), 0u); base::FilePath verified_contents_path = file_util::GetVerifiedContentsPath(extension_dir_.UnpackedPath()); - ASSERT_EQ(static_cast<int>(json.size()), - base::WriteFile(verified_contents_path, json.data(), json.size())); + ASSERT_EQ(static_cast<int>(verified_contents.size()), + base::WriteFile(verified_contents_path, verified_contents.data(), + verified_contents.size())); } std::vector<uint8_t> TestExtensionBuilder::GetTestContentVerifierPublicKey() { @@ -444,7 +467,8 @@ return public_key; } -std::unique_ptr<base::Value> TestExtensionBuilder::CreateVerifiedContents() { +std::unique_ptr<base::Value> +TestExtensionBuilder::CreateVerifiedContentsPayload() const { int block_size = extension_misc::kContentVerificationDefaultBlockSize; ListBuilder files;
diff --git a/extensions/browser/content_verifier/test_utils.h b/extensions/browser/content_verifier/test_utils.h index e3cbb4dd..bdc4135 100644 --- a/extensions/browser/content_verifier/test_utils.h +++ b/extensions/browser/content_verifier/test_utils.h
@@ -179,9 +179,11 @@ // Modifier. void SetVerifierSourceType(VerifierSourceType type); + void SetVerifierKey(std::vector<uint8_t> key); private: VerifierSourceType verifier_source_type_ = VerifierSourceType::SIGNED_HASHES; + std::vector<uint8_t> verifier_key_; DISALLOW_COPY_AND_ASSIGN(MockContentVerifierDelegate); }; @@ -271,13 +273,20 @@ TestExtensionBuilder(const TestExtensionBuilder&) = delete; TestExtensionBuilder& operator=(const TestExtensionBuilder&) = delete; + // Accept parameters by values since we'll store them. + void AddResource(base::FilePath::StringType relative_path, + std::string contents); + void WriteManifest(); + // Accept parameters by values since we'll store them. void WriteResource(base::FilePath::StringType relative_path, std::string contents); void WriteComputedHashes(); + std::string CreateVerifiedContents() const; + void WriteVerifiedContents(); std::vector<uint8_t> GetTestContentVerifierPublicKey(); @@ -297,7 +306,7 @@ std::string contents; }; - std::unique_ptr<base::Value> CreateVerifiedContents(); + std::unique_ptr<base::Value> CreateVerifiedContentsPayload() const; std::unique_ptr<crypto::RSAPrivateKey> test_content_verifier_key_; ExtensionId extension_id_;
diff --git a/extensions/browser/sandboxed_unpacker.cc b/extensions/browser/sandboxed_unpacker.cc index 6338be45..5b7ec4d 100644 --- a/extensions/browser/sandboxed_unpacker.cc +++ b/extensions/browser/sandboxed_unpacker.cc
@@ -169,6 +169,12 @@ std::move(callback).Run(false); } +void SandboxedUnpackerClient::GetContentVerifierKey( + base::OnceCallback<void(ContentVerifierKey)> callback) { + std::move(callback).Run(ContentVerifierKey(kWebstoreSignaturesPublicKey, + kWebstoreSignaturesPublicKeySize)); +} + SandboxedUnpacker::ScopedVerifierFormatOverrideForTest:: ScopedVerifierFormatOverrideForTest(crx_file::VerifierFormat format) { DCHECK(!g_verifier_format_override_for_test.has_value()); @@ -388,25 +394,27 @@ std::vector<uint8_t> verified_contents( result.value.value().data(), result.value.value().data() + result.value.value().size()); - if (!StoreVerifiedContentsInExtensionDir(std::move(verified_contents))) - return; - Unpack(unzip_dir); + + client_->GetContentVerifierKey( + base::BindOnce(&SandboxedUnpacker::StoreVerifiedContentsInExtensionDir, + this, unzip_dir, std::move(verified_contents))); } -bool SandboxedUnpacker::StoreVerifiedContentsInExtensionDir( - base::span<const uint8_t> verified_contents) { +void SandboxedUnpacker::StoreVerifiedContentsInExtensionDir( + const base::FilePath& unzip_dir, + base::span<const uint8_t> verified_contents, + ContentVerifierKey content_verifier_key) { DCHECK(unpacker_io_task_runner_->RunsTasksInCurrentSequence()); if (!VerifiedContents::Create( - ContentVerifierKey(kWebstoreSignaturesPublicKey, - kWebstoreSignaturesPublicKeySize), + content_verifier_key, {reinterpret_cast<const char*>(verified_contents.data()), verified_contents.size()})) { ReportFailure( SandboxedUnpackerFailureReason::MALFORMED_VERIFIED_CONTENTS, l10n_util::GetStringFUTF16(IDS_EXTENSION_PACKAGE_INSTALL_ERROR, u"MALFORMED_VERIFIED_CONTENTS")); - return false; + return; } base::FilePath metadata_path = extension_root_.Append(kMetadataFolder); @@ -415,7 +423,7 @@ SandboxedUnpackerFailureReason::COULD_NOT_CREATE_METADATA_DIRECTORY, l10n_util::GetStringFUTF16(IDS_EXTENSION_PACKAGE_INSTALL_ERROR, u"COULD_NOT_CREATE_METADATA_DIRECTORY")); - return false; + return; } base::FilePath verified_contents_path = @@ -428,10 +436,10 @@ l10n_util::GetStringFUTF16( IDS_EXTENSION_PACKAGE_INSTALL_ERROR, u"COULD_NOT_WRITE_VERIFIED_CONTENTS_INTO_FILE")); - return false; + return; } - return true; + Unpack(unzip_dir); } void SandboxedUnpacker::Unpack(const base::FilePath& directory) {
diff --git a/extensions/browser/sandboxed_unpacker.h b/extensions/browser/sandboxed_unpacker.h index 6128aeb..d763a78 100644 --- a/extensions/browser/sandboxed_unpacker.h +++ b/extensions/browser/sandboxed_unpacker.h
@@ -18,6 +18,7 @@ #include "base/values.h" #include "extensions/browser/api/declarative_net_request/index_helper.h" #include "extensions/browser/api/declarative_net_request/ruleset_install_pref.h" +#include "extensions/browser/content_verifier/content_verifier_key.h" #include "extensions/browser/crx_file_info.h" #include "extensions/browser/image_sanitizer.h" #include "extensions/browser/install/crx_install_error.h" @@ -63,6 +64,12 @@ scoped_refptr<const Extension> extension, base::OnceCallback<void(bool)> callback); + // Since data for content verification (verifier_contents.json) may be present + // in the CRX header, we need to verify it against public key. Normally it is + // Chrome Web Store public key, but may be overridden for tests. + virtual void GetContentVerifierKey( + base::OnceCallback<void(ContentVerifierKey)> callback); + // temp_dir - A temporary directory containing the results of the extension // unpacking. The client is responsible for deleting this directory. // @@ -191,8 +198,10 @@ // Verifies the decompressed verified contents fetched from the header of CRX // and stores them if the verification of these contents is successful. - bool StoreVerifiedContentsInExtensionDir( - base::span<const uint8_t> verified_contents); + void StoreVerifiedContentsInExtensionDir( + const base::FilePath& unzip_dir, + base::span<const uint8_t> verified_contents, + ContentVerifierKey content_verifier_key); // Unpacks the extension in directory and returns the manifest. void Unpack(const base::FilePath& directory);
diff --git a/extensions/renderer/scoped_web_frame.cc b/extensions/renderer/scoped_web_frame.cc index c486a7c..56f155e 100644 --- a/extensions/renderer/scoped_web_frame.cc +++ b/extensions/renderer/scoped_web_frame.cc
@@ -27,7 +27,8 @@ /*opener=*/nullptr, mojo::NullAssociatedReceiver(), *agent_group_scheduler_, - /*session_storage_namespace_id=*/base::EmptyString())), + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt)), frame_(blink::WebLocalFrame::CreateMainFrame(view_, &frame_client_, nullptr,
diff --git a/fuchsia/engine/browser/frame_impl.cc b/fuchsia/engine/browser/frame_impl.cc index d5bb190..eb0588e7 100644 --- a/fuchsia/engine/browser/frame_impl.cc +++ b/fuchsia/engine/browser/frame_impl.cc
@@ -293,6 +293,7 @@ WebContentsToFrameImplMap()[web_contents_.get()] = this; web_contents_->SetDelegate(this); + web_contents_->SetPageBaseBackgroundColor(SK_AlphaTRANSPARENT); Observe(web_contents_.get()); binding_.set_error_handler([this](zx_status_t status) {
diff --git a/fuchsia/engine/browser/frame_window_tree_host.cc b/fuchsia/engine/browser/frame_window_tree_host.cc index 41a469f7..5052120 100644 --- a/fuchsia/engine/browser/frame_window_tree_host.cc +++ b/fuchsia/engine/browser/frame_window_tree_host.cc
@@ -86,6 +86,7 @@ } void FrameWindowTreeHost::OnWindowStateChanged( + ui::PlatformWindowState old_state, ui::PlatformWindowState new_state) { // Tell the root aura::Window whether it is shown or hidden. if (new_state == ui::PlatformWindowState::kMinimized) {
diff --git a/fuchsia/engine/browser/frame_window_tree_host.h b/fuchsia/engine/browser/frame_window_tree_host.h index e4066c2..fae510c 100644 --- a/fuchsia/engine/browser/frame_window_tree_host.h +++ b/fuchsia/engine/browser/frame_window_tree_host.h
@@ -33,7 +33,8 @@ // aura::WindowTreeHostPlatform overrides. void OnActivationChanged(bool active) final; - void OnWindowStateChanged(ui::PlatformWindowState new_state) final; + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) final; void OnWindowBoundsChanged(const BoundsChange& bounds); const fuchsia::ui::views::ViewRef view_ref_;
diff --git a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc index 9e132ce5..1518639 100644 --- a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc +++ b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
@@ -137,13 +137,6 @@ void WebEngineContentRendererClient::RenderFrameCreated( content::RenderFrame* render_frame) { - // If this is a top-level frame then it should have a transparent background. - // Both the RenderView and WebView should be guaranteed to be non-null, since - // the |render_frame| was only just created. - if (render_frame->IsMainFrame()) { - render_frame->GetWebView()->SetBaseBackgroundColor(SK_AlphaTRANSPARENT); - } - // Add WebEngine services to the new RenderFrame. // The objects' lifetimes are bound to the RenderFrame's lifetime. new on_load_script_injector::OnLoadScriptInjector(render_frame);
diff --git a/gpu/command_buffer/service/shared_image_backing_d3d.cc b/gpu/command_buffer/service/shared_image_backing_d3d.cc index 36b099d..7d78452d 100644 --- a/gpu/command_buffer/service/shared_image_backing_d3d.cc +++ b/gpu/command_buffer/service/shared_image_backing_d3d.cc
@@ -449,7 +449,8 @@ texture_descriptor.format = wgpu_format; texture_descriptor.usage = GetAllowedDawnUsages(); texture_descriptor.dimension = WGPUTextureDimension_2D; - texture_descriptor.size = {size().width(), size().height(), 1}; + texture_descriptor.size = {static_cast<uint32_t>(size().width()), + static_cast<uint32_t>(size().height()), 1}; texture_descriptor.mipLevelCount = 1; texture_descriptor.sampleCount = 1;
diff --git a/gpu/command_buffer/tests/gl_program_unittest.cc b/gpu/command_buffer/tests/gl_program_unittest.cc index 284f5edc..d9737b95 100644 --- a/gpu/command_buffer/tests/gl_program_unittest.cc +++ b/gpu/command_buffer/tests/gl_program_unittest.cc
@@ -158,7 +158,7 @@ EXPECT_EQ(GL_FALSE, compile_state); // Compiling program cutting off invalid parts should succeed. - const GLint lengths[] = { valid_shader_str.length() }; + const GLint lengths[] = {static_cast<GLint>(valid_shader_str.length())}; glShaderSource(vs, 1, invalid_shader_strings, lengths); glCompileShader(vs); glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_state);
diff --git a/gpu/config/OWNERS b/gpu/config/OWNERS index 84f8217..ba5a8e32 100644 --- a/gpu/config/OWNERS +++ b/gpu/config/OWNERS
@@ -1,2 +1,6 @@ kbr@chromium.org zmo@chromium.org + +# Gpu info collection +per-file *info*=magchen@chromium.org +per-file *dx_diag*=magchen@chromium.org \ No newline at end of file
diff --git a/gpu/config/PRESUBMIT.py b/gpu/config/PRESUBMIT.py index 9b8bc15..fe51ed5 100644 --- a/gpu/config/PRESUBMIT.py +++ b/gpu/config/PRESUBMIT.py
@@ -10,6 +10,10 @@ import difflib import os.path +import io + +USE_PYTHON3 = True + def _CheckGPUWorkaroundListSorted(input_api, output_api): """Check: gpu_workaround_list.txt feature list sorted alphabetically. @@ -17,7 +21,8 @@ filename = os.path.join(input_api.PresubmitLocalPath(), 'gpu_workaround_list.txt') - workaround_list = [line.rstrip('\n') for line in open(filename)] + with io.open(filename, encoding='utf-8') as f: + workaround_list = [line.rstrip('\n') for line in f] workaround_list_sorted = sorted(workaround_list, key=lambda s: s.lower()) if workaround_list == workaround_list_sorted:
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.h b/gpu/ipc/client/command_buffer_proxy_impl.h index 8801440e..a96cd19 100644 --- a/gpu/ipc/client/command_buffer_proxy_impl.h +++ b/gpu/ipc/client/command_buffer_proxy_impl.h
@@ -35,6 +35,7 @@ #include "gpu/command_buffer/common/gpu_memory_allocation.h" #include "gpu/command_buffer/common/scheduling_priority.h" #include "gpu/gpu_export.h" +#include "gpu/ipc/client/gpu_channel_host.h" #include "gpu/ipc/common/gpu_channel.mojom.h" #include "gpu/ipc/common/surface_handle.h" #include "ipc/ipc_listener.h" @@ -157,6 +158,10 @@ const scoped_refptr<GpuChannelHost>& channel() const { return channel_; } + mojom::GpuChannel& GetGpuChannel() const { + return channel()->GetGpuChannel(); + } + const base::UnsafeSharedMemoryRegion& GetSharedStateRegion() const { return shared_state_shm_; }
diff --git a/gpu/ipc/common/gpu_channel.mojom b/gpu/ipc/common/gpu_channel.mojom index 611ef434..a65b00f 100644 --- a/gpu/ipc/common/gpu_channel.mojom +++ b/gpu/ipc/common/gpu_channel.mojom
@@ -140,6 +140,10 @@ // intentionally terminated with an exit code of 0. TerminateForTesting(); + // Returns a globally unique token which can be used by other interfaces to + // securely identify this GpuChannel endpoint within the GPU process. + [Sync] GetChannelToken() => (mojo_base.mojom.UnguessableToken token); + // A simple no-op message used as a fence to ensure all previously sent // messages have been received. //
diff --git a/gpu/ipc/common/gpu_memory_buffer_impl_dxgi.cc b/gpu/ipc/common/gpu_memory_buffer_impl_dxgi.cc index f720d09..335a839d 100644 --- a/gpu/ipc/common/gpu_memory_buffer_impl_dxgi.cc +++ b/gpu/ipc/common/gpu_memory_buffer_impl_dxgi.cc
@@ -54,8 +54,8 @@ usage == gfx::BufferUsage::SCANOUT); D3D11_TEXTURE2D_DESC desc = { - size.width(), - size.height(), + static_cast<UINT>(size.width()), + static_cast<UINT>(size.height()), 1, 1, DXGI_FORMAT_R8G8B8A8_UNORM,
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.cc b/gpu/ipc/common/gpu_memory_buffer_support.cc index 7f849a5..9615c024d 100644 --- a/gpu/ipc/common/gpu_memory_buffer_support.cc +++ b/gpu/ipc/common/gpu_memory_buffer_support.cc
@@ -88,6 +88,7 @@ case gfx::BufferUsage::SCANOUT_CPU_READ_WRITE: case gfx::BufferUsage::GPU_READ_CPU_READ_WRITE: case gfx::BufferUsage::SCANOUT_FRONT_RENDERING: + case gfx::BufferUsage::SCANOUT_VEA_CPU_READ: return format == gfx::BufferFormat::BGRA_8888 || format == gfx::BufferFormat::RGBA_8888 || format == gfx::BufferFormat::BGRX_8888 || @@ -100,7 +101,6 @@ case gfx::BufferUsage::PROTECTED_SCANOUT_VDA_WRITE: case gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE: case gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE: - case gfx::BufferUsage::SCANOUT_VEA_CPU_READ: case gfx::BufferUsage::VEA_READ_CAMERA_AND_CPU_READ_WRITE: return false; }
diff --git a/gpu/ipc/common/mock_gpu_channel.h b/gpu/ipc/common/mock_gpu_channel.h index f5e1e3c..cb8181cb 100644 --- a/gpu/ipc/common/mock_gpu_channel.h +++ b/gpu/ipc/common/mock_gpu_channel.h
@@ -19,6 +19,7 @@ // mojom::GpuChannel: MOCK_METHOD0(CrashForTesting, void()); MOCK_METHOD0(TerminateForTesting, void()); + MOCK_METHOD1(GetChannelToken, void(GetChannelTokenCallback)); MOCK_METHOD0(Flush, bool()); MOCK_METHOD1(Flush, void(FlushCallback)); MOCK_METHOD6(CreateCommandBuffer, @@ -45,21 +46,12 @@ void(std::vector<mojom::DeferredRequestPtr>)); #if defined(OS_ANDROID) MOCK_METHOD3(CreateStreamTexture, - bool(int32_t, - mojo::PendingAssociatedReceiver<mojom::StreamTexture>, - bool*)); - MOCK_METHOD3(CreateStreamTexture, void(int32_t, mojo::PendingAssociatedReceiver<mojom::StreamTexture>, CreateStreamTextureCallback)); #endif // defined(OS_ANDROID) MOCK_METHOD4(WaitForTokenInRange, - bool(int32_t, int32_t, int32_t, CommandBuffer::State*)); - MOCK_METHOD4(WaitForTokenInRange, void(int32_t, int32_t, int32_t, WaitForTokenInRangeCallback)); - MOCK_METHOD5( - WaitForGetOffsetInRange, - bool(int32_t, uint32_t, int32_t, int32_t, CommandBuffer::State*)); MOCK_METHOD5(WaitForGetOffsetInRange, void(int32_t, uint32_t,
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc index 809f123..4cf4f2f 100644 --- a/gpu/ipc/service/gpu_channel.cc +++ b/gpu/ipc/service/gpu_channel.cc
@@ -34,6 +34,7 @@ #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/process_memory_dump.h" #include "base/trace_event/trace_event.h" +#include "base/unguessable_token.h" #include "build/build_config.h" #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/service/image_factory.h" @@ -105,6 +106,7 @@ public: GpuChannelMessageFilter( gpu::GpuChannel* gpu_channel, + const base::UnguessableToken& channel_token, Scheduler* scheduler, ImageDecodeAcceleratorWorker* image_decode_accelerator_worker, scoped_refptr<base::SingleThreadTaskRunner> main_task_runner); @@ -147,6 +149,7 @@ // mojom::GpuChannel: void CrashForTesting() override; void TerminateForTesting() override; + void GetChannelToken(GetChannelTokenCallback callback) override; void Flush(FlushCallback callback) override; void CreateCommandBuffer( mojom::CreateCommandBufferParamsPtr config, @@ -222,6 +225,11 @@ // before dereferencing. gpu::GpuChannel* gpu_channel_ GUARDED_BY(gpu_channel_lock_) = nullptr; + // A token which can be retrieved by GetChannelToken to uniquely identify this + // channel. Assigned at construction time by the GpuChannelManager, where the + // token-to-GpuChannel mapping lives. + const base::UnguessableToken channel_token_; + Scheduler* scheduler_; scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; @@ -237,10 +245,12 @@ GpuChannelMessageFilter::GpuChannelMessageFilter( gpu::GpuChannel* gpu_channel, + const base::UnguessableToken& channel_token, Scheduler* scheduler, ImageDecodeAcceleratorWorker* image_decode_accelerator_worker, scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) : gpu_channel_(gpu_channel), + channel_token_(channel_token), scheduler_(scheduler), main_task_runner_(std::move(main_task_runner)), image_decode_accelerator_stub_( @@ -444,6 +454,11 @@ receiver_.ReportBadMessage("TerminateForTesting is a test-only API"); } +void GpuChannelMessageFilter::GetChannelToken( + GetChannelTokenCallback callback) { + std::move(callback).Run(channel_token_); +} + void GpuChannelMessageFilter::Flush(FlushCallback callback) { std::move(callback).Run(); } @@ -552,6 +567,7 @@ GpuChannel::GpuChannel( GpuChannelManager* gpu_channel_manager, + const base::UnguessableToken& channel_token, Scheduler* scheduler, SyncPointManager* sync_point_manager, scoped_refptr<gl::GLShareGroup> share_group, @@ -573,8 +589,9 @@ is_gpu_host_(is_gpu_host) { DCHECK(gpu_channel_manager_); DCHECK(client_id_); - filter_ = new GpuChannelMessageFilter( - this, scheduler, image_decode_accelerator_worker, task_runner); + filter_ = + new GpuChannelMessageFilter(this, channel_token, scheduler, + image_decode_accelerator_worker, task_runner); } GpuChannel::~GpuChannel() { @@ -598,6 +615,7 @@ std::unique_ptr<GpuChannel> GpuChannel::Create( GpuChannelManager* gpu_channel_manager, + const base::UnguessableToken& channel_token, Scheduler* scheduler, SyncPointManager* sync_point_manager, scoped_refptr<gl::GLShareGroup> share_group, @@ -607,11 +625,11 @@ uint64_t client_tracing_id, bool is_gpu_host, ImageDecodeAcceleratorWorker* image_decode_accelerator_worker) { - auto gpu_channel = base::WrapUnique( - new GpuChannel(gpu_channel_manager, scheduler, sync_point_manager, - std::move(share_group), std::move(task_runner), - std::move(io_task_runner), client_id, client_tracing_id, - is_gpu_host, image_decode_accelerator_worker)); + auto gpu_channel = base::WrapUnique(new GpuChannel( + gpu_channel_manager, channel_token, scheduler, sync_point_manager, + std::move(share_group), std::move(task_runner), std::move(io_task_runner), + client_id, client_tracing_id, is_gpu_host, + image_decode_accelerator_worker)); if (!gpu_channel->CreateSharedImageStub()) { LOG(ERROR) << "GpuChannel: Failed to create SharedImageStub";
diff --git a/gpu/ipc/service/gpu_channel.h b/gpu/ipc/service/gpu_channel.h index a538ed7..8264939 100644 --- a/gpu/ipc/service/gpu_channel.h +++ b/gpu/ipc/service/gpu_channel.h
@@ -20,6 +20,7 @@ #include "base/process/process.h" #include "base/single_thread_task_runner.h" #include "base/trace_event/memory_dump_provider.h" +#include "base/unguessable_token.h" #include "build/build_config.h" #include "gpu/command_buffer/common/capabilities.h" #include "gpu/command_buffer/common/context_result.h" @@ -63,6 +64,7 @@ static std::unique_ptr<GpuChannel> Create( GpuChannelManager* gpu_channel_manager, + const base::UnguessableToken& channel_token, Scheduler* scheduler, SyncPointManager* sync_point_manager, scoped_refptr<gl::GLShareGroup> share_group, @@ -213,6 +215,7 @@ private: // Takes ownership of the renderer process handle. GpuChannel(GpuChannelManager* gpu_channel_manager, + const base::UnguessableToken& channel_token, Scheduler* scheduler, SyncPointManager* sync_point_manager, scoped_refptr<gl::GLShareGroup> share_group,
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc index b6eb553..397e862c5 100644 --- a/gpu/ipc/service/gpu_channel_manager.cc +++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -419,18 +419,20 @@ return it != gpu_channels_.end() ? it->second.get() : nullptr; } -GpuChannel* GpuChannelManager::EstablishChannel(int client_id, - uint64_t client_tracing_id, - bool is_gpu_host, - bool cache_shaders_on_disk) { +GpuChannel* GpuChannelManager::EstablishChannel( + const base::UnguessableToken& channel_token, + int client_id, + uint64_t client_tracing_id, + bool is_gpu_host, + bool cache_shaders_on_disk) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (gr_shader_cache_ && cache_shaders_on_disk) gr_shader_cache_->CacheClientIdOnDisk(client_id); std::unique_ptr<GpuChannel> gpu_channel = GpuChannel::Create( - this, scheduler_, sync_point_manager_, share_group_, task_runner_, - io_task_runner_, client_id, client_tracing_id, is_gpu_host, + this, channel_token, scheduler_, sync_point_manager_, share_group_, + task_runner_, io_task_runner_, client_id, client_tracing_id, is_gpu_host, image_decode_accelerator_worker_); if (!gpu_channel)
diff --git a/gpu/ipc/service/gpu_channel_manager.h b/gpu/ipc/service/gpu_channel_manager.h index 52bf987..29f4f35 100644 --- a/gpu/ipc/service/gpu_channel_manager.h +++ b/gpu/ipc/service/gpu_channel_manager.h
@@ -18,6 +18,7 @@ #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_checker.h" +#include "base/unguessable_token.h" #include "build/build_config.h" #include "gpu/command_buffer/common/activity_flags.h" #include "gpu/command_buffer/common/constants.h" @@ -98,7 +99,8 @@ GpuChannelManagerDelegate* delegate() const { return delegate_; } GpuWatchdogThread* watchdog() const { return watchdog_; } - GpuChannel* EstablishChannel(int client_id, + GpuChannel* EstablishChannel(const base::UnguessableToken& channel_token, + int client_id, uint64_t client_tracing_id, bool is_gpu_host, bool cache_shaders_on_disk);
diff --git a/gpu/ipc/service/gpu_channel_manager_unittest.cc b/gpu/ipc/service/gpu_channel_manager_unittest.cc index 8b59b1bd..3ec6f82a 100644 --- a/gpu/ipc/service/gpu_channel_manager_unittest.cc +++ b/gpu/ipc/service/gpu_channel_manager_unittest.cc
@@ -12,6 +12,7 @@ #include "base/trace_event/trace_event_filter.h" #include "base/trace_event/trace_event_impl.h" #include "base/trace_event/trace_log.h" +#include "base/unguessable_token.h" #include "gpu/command_buffer/common/capabilities.h" #include "gpu/command_buffer/common/context_result.h" #include "gpu/command_buffer/service/memory_tracking.h" @@ -179,7 +180,8 @@ ASSERT_TRUE(channel_manager()); GpuChannel* channel = channel_manager()->EstablishChannel( - kClientId, kClientTracingId, false, true); + base::UnguessableToken::Create(), kClientId, kClientTracingId, false, + true); EXPECT_TRUE(channel); EXPECT_EQ(channel_manager()->LookupChannel(kClientId), channel); }
diff --git a/gpu/ipc/service/gpu_channel_test_common.cc b/gpu/ipc/service/gpu_channel_test_common.cc index 31a8858c..ae8495f 100644 --- a/gpu/ipc/service/gpu_channel_test_common.cc +++ b/gpu/ipc/service/gpu_channel_test_common.cc
@@ -12,6 +12,7 @@ #include "base/test/test_simple_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/memory_dump_manager.h" +#include "base/unguessable_token.h" #include "gpu/command_buffer/common/activity_flags.h" #include "gpu/command_buffer/service/scheduler.h" #include "gpu/command_buffer/service/shared_image_manager.h" @@ -112,7 +113,8 @@ bool is_gpu_host) { uint64_t kClientTracingId = 1; GpuChannel* channel = channel_manager()->EstablishChannel( - client_id, kClientTracingId, is_gpu_host, true); + base::UnguessableToken::Create(), client_id, kClientTracingId, + is_gpu_host, true); channel->InitForTesting(&sink_); base::ProcessId kProcessId = 1; channel->OnChannelConnected(kProcessId);
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc b/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc index 71830be..3d0f27c 100644 --- a/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc +++ b/gpu/ipc/service/gpu_memory_buffer_factory_dxgi.cc
@@ -56,8 +56,8 @@ usage == gfx::BufferUsage::SCANOUT); D3D11_TEXTURE2D_DESC desc = { - size.width(), - size.height(), + static_cast<UINT>(size.width()), + static_cast<UINT>(size.height()), 1, 1, dxgi_format,
diff --git a/gpu/vulkan/demo/vulkan_demo.h b/gpu/vulkan/demo/vulkan_demo.h index 811ae51..da6323c 100644 --- a/gpu/vulkan/demo/vulkan_demo.h +++ b/gpu/vulkan/demo/vulkan_demo.h
@@ -51,7 +51,8 @@ void DispatchEvent(ui::Event* event) override {} void OnCloseRequest() override; void OnClosed() override {} - void OnWindowStateChanged(ui::PlatformWindowState new_state) override {} + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override {} void OnLostCapture() override {} void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override; void OnWillDestroyAcceleratedWidget() override {}
diff --git a/gpu/vulkan/tests/native_window.cc b/gpu/vulkan/tests/native_window.cc index 7a1a634..0c07a126 100644 --- a/gpu/vulkan/tests/native_window.cc +++ b/gpu/vulkan/tests/native_window.cc
@@ -63,7 +63,8 @@ void DispatchEvent(ui::Event* event) override {} void OnCloseRequest() override {} void OnClosed() override {} - void OnWindowStateChanged(ui::PlatformWindowState new_state) override {} + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override {} void OnLostCapture() override {} void OnWillDestroyAcceleratedWidget() override {} void OnAcceleratedWidgetDestroyed() override {}
diff --git a/gpu/vulkan/vulkan_image.cc b/gpu/vulkan/vulkan_image.cc index 85d47b9..b5013df 100644 --- a/gpu/vulkan/vulkan_image.cc +++ b/gpu/vulkan/vulkan_image.cc
@@ -198,7 +198,8 @@ .flags = flags_, .imageType = VK_IMAGE_TYPE_2D, .format = format_, - .extent = {size.width(), size.height(), 1}, + .extent = {static_cast<uint32_t>(size.width()), + static_cast<uint32_t>(size.height()), 1}, .mipLevels = 1, .arrayLayers = 1, .samples = VK_SAMPLE_COUNT_1_BIT,
diff --git a/gpu/vulkan/vulkan_instance.cc b/gpu/vulkan/vulkan_instance.cc index 2d12374e..964cbf2 100644 --- a/gpu/vulkan/vulkan_instance.cc +++ b/gpu/vulkan/vulkan_instance.cc
@@ -9,6 +9,7 @@ #include "base/containers/flat_set.h" #include "base/logging.h" #include "base/macros.h" +#include "base/numerics/safe_conversions.h" #include "build/build_config.h" #include "gpu/vulkan/vulkan_crash_keys.h" #include "gpu/vulkan/vulkan_device_queue.h" @@ -178,15 +179,18 @@ } VkInstanceCreateInfo instance_create_info = { - VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType - nullptr, // pNext - 0, // flags - &app_info, // pApplicationInfo - enabled_layer_names.size(), // enableLayerCount - enabled_layer_names.data(), // ppEnabledLayerNames - vulkan_info_.enabled_instance_extensions.size(), // enabledExtensionCount - vulkan_info_.enabled_instance_extensions - .data(), // ppEnabledExtensionNames + VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType + nullptr, // pNext + 0, // flags + &app_info, // pApplicationInfo + base::checked_cast<uint32_t>(enabled_layer_names.size()), + // enableLayerCount + enabled_layer_names.data(), // ppEnabledLayerNames + base::checked_cast<uint32_t>( + vulkan_info_.enabled_instance_extensions.size()), + // enabledExtensionCount + vulkan_info_.enabled_instance_extensions.data(), + // ppEnabledExtensionNames }; result = vkCreateInstance(&instance_create_info, nullptr, &vk_instance_);
diff --git a/gpu/vulkan/vulkan_swap_chain.cc b/gpu/vulkan/vulkan_swap_chain.cc index e7d2a28..af6d9348 100644 --- a/gpu/vulkan/vulkan_swap_chain.cc +++ b/gpu/vulkan/vulkan_swap_chain.cc
@@ -178,7 +178,8 @@ .minImageCount = min_image_count, .imageFormat = surface_format.format, .imageColorSpace = surface_format.colorSpace, - .imageExtent = {image_size.width(), image_size.height()}, + .imageExtent = {static_cast<uint32_t>(image_size.width()), + static_cast<uint32_t>(image_size.height())}, .imageArrayLayers = 1, .imageUsage = image_usage_flags, .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE, @@ -362,7 +363,8 @@ VkRectLayerKHR rect_layer = { .offset = {rect.x(), rect.y()}, - .extent = {rect.width(), rect.height()}, + .extent = {static_cast<uint32_t>(rect.width()), + static_cast<uint32_t>(rect.height())}, .layer = 0, };
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 14cbe88ee..8258e68a 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -16355,7 +16355,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ToTiOS" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:1" recipe { @@ -16429,7 +16429,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ToTiOSDevice" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:1" recipe { @@ -24361,7 +24361,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-asan" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24434,7 +24434,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-device" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24507,7 +24507,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24580,7 +24580,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-code-coverage" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" dimensions: "ssd:1" recipe { @@ -24655,7 +24655,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-cronet" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24728,7 +24728,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-full-configs" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24801,7 +24801,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-multi-window" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24874,7 +24874,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-noncq" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -24947,7 +24947,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-webkit-tot" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -25020,7 +25020,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios14-beta-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -25093,7 +25093,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios14-sdk-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -25166,7 +25166,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios15-beta-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -25239,7 +25239,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios15-sdk-device" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -25312,7 +25312,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios15-sdk-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.ci" recipe { name: "chromium" @@ -34843,7 +34843,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -34910,7 +34910,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -34977,7 +34977,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -35044,7 +35044,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -35111,7 +35111,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -35182,7 +35182,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37087,7 +37087,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37164,7 +37164,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37241,7 +37241,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37317,7 +37317,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37393,7 +37393,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37470,7 +37470,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37547,7 +37547,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37624,7 +37624,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37701,7 +37701,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37778,7 +37778,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37855,7 +37855,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -37932,7 +37932,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38009,7 +38009,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38085,7 +38085,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38163,7 +38163,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38241,7 +38241,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38318,7 +38318,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38395,7 +38395,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38472,7 +38472,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38549,7 +38549,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38626,7 +38626,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38703,7 +38703,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38780,7 +38780,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38858,7 +38858,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -38936,7 +38936,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39012,7 +39012,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39089,7 +39089,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39166,7 +39166,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39243,7 +39243,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39320,7 +39320,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39397,7 +39397,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39474,7 +39474,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39551,7 +39551,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39628,7 +39628,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39705,7 +39705,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39782,7 +39782,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39859,7 +39859,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -39936,7 +39936,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40013,7 +40013,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40090,7 +40090,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40167,7 +40167,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40243,7 +40243,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40319,7 +40319,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40396,7 +40396,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40473,7 +40473,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40550,7 +40550,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40627,7 +40627,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40704,7 +40704,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40780,7 +40780,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40857,7 +40857,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -40934,7 +40934,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41010,7 +41010,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41087,7 +41087,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41164,7 +41164,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41240,7 +41240,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41317,7 +41317,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41390,7 +41390,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41468,7 +41468,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41544,7 +41544,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41621,7 +41621,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41697,7 +41697,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41774,7 +41774,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41851,7 +41851,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -41928,7 +41928,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42004,7 +42004,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42081,7 +42081,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42157,7 +42157,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42234,7 +42234,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42310,7 +42310,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42387,7 +42387,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42464,7 +42464,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42543,7 +42543,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42618,7 +42618,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42697,7 +42697,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42776,7 +42776,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42855,7 +42855,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -42934,7 +42934,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43013,7 +43013,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43089,7 +43089,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43165,7 +43165,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43242,7 +43242,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43319,7 +43319,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43396,7 +43396,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43473,7 +43473,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43550,7 +43550,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43627,7 +43627,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43704,7 +43704,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43781,7 +43781,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43858,7 +43858,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -43934,7 +43934,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44010,7 +44010,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44086,7 +44086,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44162,7 +44162,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44235,7 +44235,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44308,7 +44308,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44381,7 +44381,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44454,7 +44454,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44527,7 +44527,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44600,7 +44600,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44673,7 +44673,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44746,7 +44746,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44819,7 +44819,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44892,7 +44892,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -44965,7 +44965,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45038,7 +45038,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45111,7 +45111,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45184,7 +45184,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45257,7 +45257,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45330,7 +45330,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45403,7 +45403,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45476,7 +45476,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45549,7 +45549,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45622,7 +45622,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45695,7 +45695,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45768,7 +45768,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45841,7 +45841,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45914,7 +45914,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -45987,7 +45987,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46060,7 +46060,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46136,7 +46136,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46212,7 +46212,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46288,7 +46288,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46364,7 +46364,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46440,7 +46440,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46516,7 +46516,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46592,7 +46592,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46668,7 +46668,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46744,7 +46744,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46820,7 +46820,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46896,7 +46896,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -46972,7 +46972,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47048,7 +47048,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47125,7 +47125,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47202,7 +47202,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47279,7 +47279,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47356,7 +47356,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47433,7 +47433,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47510,7 +47510,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47587,7 +47587,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47664,7 +47664,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47741,7 +47741,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47818,7 +47818,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47895,7 +47895,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -47972,7 +47972,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48049,7 +48049,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48122,7 +48122,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48195,7 +48195,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48268,7 +48268,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48344,7 +48344,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48420,7 +48420,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48497,7 +48497,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48578,7 +48578,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48617,7 +48617,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-device" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -48662,7 +48662,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48701,7 +48701,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -48747,7 +48747,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48786,7 +48786,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-cronet" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -48831,7 +48831,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48870,7 +48870,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-full-configs" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -48916,7 +48916,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -48955,7 +48955,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-inverse-fieldtrials-fyi" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49000,7 +49000,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49039,7 +49039,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-multi-window" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49084,7 +49084,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49123,7 +49123,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-noncq" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49168,7 +49168,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49207,7 +49207,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios-simulator-rts" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49253,7 +49253,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49292,7 +49292,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios14-beta-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49337,7 +49337,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49376,7 +49376,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios14-sdk-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-11|Mac-10.16" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49421,7 +49421,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49460,7 +49460,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios15-beta-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49505,7 +49505,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49544,7 +49544,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios15-sdk-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac-10.15|Mac-11" + dimensions: "os:Mac-11" dimensions: "pool:luci.chromium.try" recipe { name: "chromium_trybot" @@ -49589,7 +49589,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49665,7 +49665,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49741,7 +49741,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49818,7 +49818,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49895,7 +49895,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -49972,7 +49972,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50048,7 +50048,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50124,7 +50124,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50200,7 +50200,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50277,7 +50277,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50354,7 +50354,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50431,7 +50431,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50508,7 +50508,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50585,7 +50585,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50662,7 +50662,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50739,7 +50739,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50816,7 +50816,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50893,7 +50893,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -50970,7 +50970,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51047,7 +51047,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51123,7 +51123,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51200,7 +51200,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51277,7 +51277,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51355,7 +51355,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51432,7 +51432,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51509,7 +51509,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51586,7 +51586,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51661,7 +51661,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51738,7 +51738,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51815,7 +51815,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51892,7 +51892,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -51968,7 +51968,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52045,7 +52045,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52122,7 +52122,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52199,7 +52199,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52276,7 +52276,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52353,7 +52353,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52429,7 +52429,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52506,7 +52506,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52583,7 +52583,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52660,7 +52660,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52736,7 +52736,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52813,7 +52813,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52890,7 +52890,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -52968,7 +52968,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53046,7 +53046,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53124,7 +53124,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53201,7 +53201,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53275,7 +53275,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53349,7 +53349,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53423,7 +53423,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53497,7 +53497,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53574,7 +53574,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53651,7 +53651,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53728,7 +53728,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53805,7 +53805,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53882,7 +53882,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -53959,7 +53959,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54036,7 +54036,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54113,7 +54113,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54189,7 +54189,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54266,7 +54266,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54343,7 +54343,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54420,7 +54420,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54497,7 +54497,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54574,7 +54574,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54651,7 +54651,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54728,7 +54728,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54805,7 +54805,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54882,7 +54882,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -54962,7 +54962,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55039,7 +55039,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55120,7 +55120,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55197,7 +55197,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55273,7 +55273,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55349,7 +55349,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55426,7 +55426,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55503,7 +55503,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55580,7 +55580,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55657,7 +55657,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55734,7 +55734,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55810,7 +55810,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55886,7 +55886,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -55963,7 +55963,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56042,7 +56042,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56121,7 +56121,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56201,7 +56201,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56280,7 +56280,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56360,7 +56360,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56439,7 +56439,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56519,7 +56519,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56600,7 +56600,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56681,7 +56681,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56757,7 +56757,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56836,7 +56836,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56915,7 +56915,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -56995,7 +56995,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57075,7 +57075,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57155,7 +57155,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57235,7 +57235,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57315,7 +57315,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57395,7 +57395,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57475,7 +57475,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57555,7 +57555,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57635,7 +57635,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57715,7 +57715,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57795,7 +57795,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57875,7 +57875,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -57955,7 +57955,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58035,7 +58035,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58115,7 +58115,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58195,7 +58195,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58274,7 +58274,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58353,7 +58353,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58432,7 +58432,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58509,7 +58509,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58586,7 +58586,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58663,7 +58663,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58740,7 +58740,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58817,7 +58817,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58897,7 +58897,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -58977,7 +58977,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59057,7 +59057,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59137,7 +59137,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59218,7 +59218,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59299,7 +59299,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59384,7 +59384,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59463,7 +59463,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59543,7 +59543,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59624,7 +59624,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59702,7 +59702,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59780,7 +59780,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59858,7 +59858,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -59936,7 +59936,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60014,7 +60014,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60092,7 +60092,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60170,7 +60170,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60251,7 +60251,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60332,7 +60332,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60413,7 +60413,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60494,7 +60494,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60574,7 +60574,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60655,7 +60655,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60737,7 +60737,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60817,7 +60817,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60898,7 +60898,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -60979,7 +60979,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61060,7 +61060,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61141,7 +61141,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61222,7 +61222,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61303,7 +61303,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61384,7 +61384,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61465,7 +61465,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61546,7 +61546,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61627,7 +61627,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61708,7 +61708,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61787,7 +61787,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms" @@ -61868,7 +61868,7 @@ } experiments { key: "luci.buildbucket.use_bbagent" - value: 10 + value: 20 } experiments { key: "luci.use_realms"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index ff521b9..92202d0 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -91,11 +91,7 @@ MAC_10_13 = os_enum("Mac-10.13", os_category.MAC), MAC_10_14 = os_enum("Mac-10.14", os_category.MAC), MAC_10_15 = os_enum("Mac-10.15", os_category.MAC), - # Staged switch to Mac 11: we can gradually shift the matching capacity - # towards Mac 11 and the builder will continue to run on whatever is - # available - MAC_10_15_OR_11 = os_enum("Mac-10.15|Mac-11", os_category.MAC), - MAC_11 = os_enum("Mac-11|Mac-10.16", os_category.MAC), + MAC_11 = os_enum("Mac-11", os_category.MAC), MAC_DEFAULT = os_enum("Mac-10.15", os_category.MAC), MAC_ANY = os_enum("Mac", os_category.MAC), WINDOWS_7 = os_enum("Windows-7", os_category.WINDOWS),
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index 188f042..bd1dd08 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -441,7 +441,7 @@ name, executable = "recipe:chromium", goma_backend = builders.goma.backend.RBE_PROD, - os = builders.os.MAC_10_15_OR_11, + os = builders.os.MAC_11, xcode = builders.xcode.x12d4e, **kwargs): return fyi_builder( @@ -643,7 +643,7 @@ name, executable = "recipe:chromium", goma_backend = builders.goma.backend.RBE_PROD, - os = builders.os.MAC_10_15_OR_11, + os = builders.os.MAC_11, xcode = builders.xcode.x12d4e, **kwargs): return mac_builder(
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star index 2304715..cc7b655 100644 --- a/infra/config/lib/try.star +++ b/infra/config/lib/try.star
@@ -124,7 +124,7 @@ experiments.setdefault("chromium.resultdb.result_sink.junit_tests", 100) # Migrate executable to bbagent incrementally. - experiments.setdefault("luci.buildbucket.use_bbagent", 10) + experiments.setdefault("luci.buildbucket.use_bbagent", 20) merged_resultdb_bigquery_exports = [ resultdb.export_test_results( @@ -340,7 +340,7 @@ name, executable = "recipe:chromium_trybot", goma_backend = builders.goma.backend.RBE_PROD, - os = builders.os.MAC_10_15_OR_11, + os = builders.os.MAC_11, xcode = builders.xcode.x12d4e, **kwargs): return try_builder(
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index a177541..3688a71 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -2337,7 +2337,7 @@ short_name = "sim", ), cores = None, - os = os.MAC_10_15_OR_11, + os = os.MAC_11, ssd = True, xcode = xcode.x12d4e, ) @@ -2350,7 +2350,7 @@ short_name = "dev", ), cores = None, - os = os.MAC_10_15_OR_11, + os = os.MAC_11, ssd = True, xcode = xcode.x12d4e, ) @@ -4083,7 +4083,7 @@ short_name = "ios", ), cores = None, - os = os.MAC_10_15_OR_11, + os = os.MAC_11, use_clang_coverage = True, coverage_exclude_sources = "ios_test_files_and_test_utils", coverage_test_types = ["overall", "unit"],
diff --git a/ios/PRESUBMIT.py b/ios/PRESUBMIT.py index 8fdaae9..6c76d51 100644 --- a/ios/PRESUBMIT.py +++ b/ios/PRESUBMIT.py
@@ -10,6 +10,8 @@ import os +USE_PYTHON3 = True + NULLABILITY_PATTERN = r'(nonnull|nullable|_Nullable|_Nonnull)' TODO_PATTERN = r'TO[D]O\(([^\)]*)\)' CRBUG_PATTERN = r'crbug\.com/\d+$'
diff --git a/ios/build/bots/scripts/shard_util.py b/ios/build/bots/scripts/shard_util.py index b4c76d6d..8a4aa6c6 100644 --- a/ios/build/bots/scripts/shard_util.py +++ b/ios/build/bots/scripts/shard_util.py
@@ -7,6 +7,7 @@ import os import re import subprocess + import test_runner as tr LOGGER = logging.getLogger(__name__) @@ -129,7 +130,11 @@ Returns: (list) a list of (TestCase, testMethod), containing disabled tests. """ - test_names = TEST_NAMES_DEBUG_APP_PATTERN.findall(stdout.decode("utf-8")) + test_names = TEST_NAMES_DEBUG_APP_PATTERN.findall(stdout.decode('utf-8')) + test_names = list( + map( + lambda test_name: (test_name[0].encode('utf-8'), test_name[1].encode( + 'utf-8')), test_names)) return list( filter(lambda test_name: test_name[0] not in IGNORED_CLASSES, test_names))
diff --git a/ios/build/bots/scripts/xcode_log_parser.py b/ios/build/bots/scripts/xcode_log_parser.py index 8a02623..329ce20b 100644 --- a/ios/build/bots/scripts/xcode_log_parser.py +++ b/ios/build/bots/scripts/xcode_log_parser.py
@@ -52,7 +52,9 @@ for test_line in output: m_test = passed_test_regex.search(test_line.decode("utf-8")) if m_test: - passed_tests.append('%s/%s' % (m_test.group(1), m_test.group(2))) + passed_tests.append( + '%s/%s' % + (m_test.group(1).encode('utf-8'), m_test.group(2).encode('utf-8'))) LOGGER.info('%d passed tests for interrupted build.' % len(passed_tests)) return passed_tests
diff --git a/ios/build/bots/scripts/xcodebuild_runner.py b/ios/build/bots/scripts/xcodebuild_runner.py index ebe41818..61c6a41a 100644 --- a/ios/build/bots/scripts/xcodebuild_runner.py +++ b/ios/build/bots/scripts/xcodebuild_runner.py
@@ -10,6 +10,7 @@ from multiprocessing import pool import os import subprocess +import sys import time import file_util @@ -461,7 +462,17 @@ for attempt, attempt_results in enumerate(shard_attempts): for test in attempt_results['failed'].keys(): - output.mark_failed(test, test_log='\n'.join(self.logs.get(test, []))) + # TODO(crbug.com/1178923): Remove unicode check when it's figured out + # where unicode is introduced. + log_lines = [] + for line in self.logs.get(test, []): + if sys.version_info.major == 2: + if isinstance(line, unicode): + LOGGER.warning('Unicode string: %s' % line) + line = line.encode('utf-8') + log_lines.append(line) + + output.mark_failed(test, test_log='\n'.join(log_lines)) # 'aborted tests' in logs is an array of strings, each string defined # as "{TestCase}/{testMethod}"
diff --git a/ios/chrome/app/main_application_delegate.mm b/ios/chrome/app/main_application_delegate.mm index c43aa40..711aa8a2 100644 --- a/ios/chrome/app/main_application_delegate.mm +++ b/ios/chrome/app/main_application_delegate.mm
@@ -51,7 +51,7 @@ // Helper to open new tabs. id<TabOpening> _tabOpener; // Handles tab switcher. - id<TabSwitching> _tabSwitcherProtocol; + id<TabSwitching> _tabSwitcher; } // The state representing the only "scene" on iOS 12. On iOS 13, only created @@ -94,7 +94,7 @@ [[SceneController alloc] initWithSceneState:_sceneState]; _sceneState.controller = _sceneController; - _tabSwitcherProtocol = _sceneController; + _tabSwitcher = _sceneController; _tabOpener = _sceneController; } } @@ -171,7 +171,7 @@ if (!base::ios::IsSceneStartupSupported()) { [_appState resumeSessionWithTabOpener:_tabOpener - tabSwitcher:_tabSwitcherProtocol + tabSwitcher:_tabSwitcher connectionInformation:self.sceneController]; } } @@ -260,11 +260,19 @@ - (void)sceneWillConnect:(NSNotification*)notification { DCHECK(base::ios::IsSceneStartupSupported()); if (@available(iOS 13, *)) { - UIWindowScene* scene = (UIWindowScene*)notification.object; - SceneDelegate* sceneDelegate = (SceneDelegate*)scene.delegate; - SceneController* sceneController = sceneDelegate.sceneController; + UIWindowScene* scene = + base::mac::ObjCCastStrict<UIWindowScene>(notification.object); + SceneDelegate* sceneDelegate = + base::mac::ObjCCastStrict<SceneDelegate>(scene.delegate); - _tabSwitcherProtocol = sceneController; + // Under some iOS 15 betas, Chrome gets scene connection events for some + // system scene connections. To handle this, early return if the connecting + // scene doesn't have a valid delegate. (See crbug.com/1217461) + if (!sceneDelegate) + return; + + SceneController* sceneController = sceneDelegate.sceneController; + _tabSwitcher = sceneController; _tabOpener = sceneController; // TODO(crbug.com/1060645): This should be called later, or this flow should
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 4043f89f..c178c5d 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1637,6 +1637,18 @@ <message name="IDS_IOS_READING_LIST_CANCEL_BUTTON" desc="Label of the button to stop editing the reading list entries (delete, mark as read/unread) [Length: 25em]" meaning="Stop editing. [Length: 25em]"> Cancel </message> + <message name="IDS_IOS_READING_LIST_MESSAGES_MAIN_ACTION" desc="Button text to indicate the user to add this page to Reading List [iOS only]"> + Add + </message> + <message name="IDS_IOS_READING_LIST_MESSAGES_MODAL_DESCRIPTION" desc="Informational text explaining the utility of Reading List. [iOS only]"> + You can save pages to read later or offline. Chrome will ask if you want to save long pages. + </message> + <message name="IDS_IOS_READING_LIST_MESSAGES_MODAL_NEVER_ASK" desc="Button text to indicate the user wants to be never shown the Add to Reading List prompt [iOS only]"> + Never Ask + </message> + <message name="IDS_IOS_READING_LIST_MESSAGES_MODAL_TITLE" desc="Title of the Add to Reading List Messages Modal [Length: 25em] [iOS only]"> + Add to Reading List + </message> <message name="IDS_IOS_SCANNER_ALERT_CANCEL" desc="Title for a button to cancel a Scanner error dialog. The dialog will be dismissed and no action will be taken. [Length: 20em] [iOS only]" meaning="A button to cancel a Scanner error dialog."> Cancel </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MAIN_ACTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MAIN_ACTION.png.sha1 new file mode 100644 index 0000000..1ceed7f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MAIN_ACTION.png.sha1
@@ -0,0 +1 @@ +5c5430c60938c4de0475ba3c5d1786af9e755742 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_DESCRIPTION.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..1ceed7f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +5c5430c60938c4de0475ba3c5d1786af9e755742 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_NEVER_ASK.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_NEVER_ASK.png.sha1 new file mode 100644 index 0000000..1ceed7f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_NEVER_ASK.png.sha1
@@ -0,0 +1 @@ +5c5430c60938c4de0475ba3c5d1786af9e755742 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_TITLE.png.sha1 new file mode 100644 index 0000000..1ceed7f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_READING_LIST_MESSAGES_MODAL_TITLE.png.sha1
@@ -0,0 +1 @@ +5c5430c60938c4de0475ba3c5d1786af9e755742 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb index 02ec4f3a..f36f090 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
@@ -52,7 +52,7 @@ <translation id="5308226104666789935">Chromium жаңа нұсқалардың бар-жоғын тексере алмайды.</translation> <translation id="5396916991083608703">Chromium-ді әдепкі браузер ретінде орнату керек пе?</translation> <translation id="5521125884468363740">Chromium браузерін кез келген жерде пайдаланғанда, қойындыларды көру үшін есептік жазбаға кіріп, синхрондауды қосыңыз.</translation> -<translation id="5573014823074921752">Chromium кеңесі. Қосымша қойынды опциялары үшін экранның төменгі не жоғарғы жағындағы құралдар тақтасындағы "Қойындыларды көрсету" түймесін түртіп, ұстап тұрыңыз.</translation> +<translation id="5573014823074921752">Chromium кеңесі. Қосымша қойынды опциялары үшін экранның төменгі не жоғарғы жағындағы құралдар тақтасындағы "Қойындыларды көрсету" түймесін басып тұрыңыз.</translation> <translation id="5700709190537129682">Chromium құпия сөздеріңізді тексере алмайды.</translation> <translation id="5715349567881822785">Chromium браузерімен көп жұмыс тындырыңыз</translation> <translation id="5742135483959137648">Сілтемелерді ашу үшін Chromium браузерін пайдаланыңыз</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb index 13adb31..669dc43 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_kk.xtb
@@ -46,7 +46,7 @@ <translation id="4099578267706723511">Пайдалану статистикасы мен жаңылыс туралы есептерді Google компаниясына жіберу арқылы Chrome қызметін жақсартуға көмектесіңіз.</translation> <translation id="417201473131094001">Chrome Canary-де қолдау көрсетілмейді.</translation> <translation id="424864128008805179">Chrome жүйесінен шығасыз ба?</translation> -<translation id="4249068189593983585">Chrome кеңесі. Қосымша қойынды опциялары үшін экранның төменгі не жоғарғы жағындағы құралдар тақтасындағы "Қойындыларды көрсету" түймесін түртіп, ұстап тұрыңыз.</translation> +<translation id="4249068189593983585">Chrome кеңесі. Қосымша қойынды опциялары үшін экранның төменгі не жоғарғы жағындағы құралдар тақтасындағы "Қойындыларды көрсету" түймесін басып тұрыңыз.</translation> <translation id="4523886039239821078">Кейбір қондырмалар Chrome браузерінің бұзылуына себеп болады. Жойыңыз:</translation> <translation id="4633328489441962921">Chrome жаңа нұсқалардың бар-жоғын тексере алмайды.</translation> <translation id="4698415050768537821">Chrome барлық құпия сөзді тексере алмады. Ертең қайталап көріңіз немесе <ph name="BEGIN_LINK" />құпия сөздерді Google есептік жазбасында тексеріңіз<ph name="END_LINK" />.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 3d8dfe4..3731f22e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Meld aan …</translation> <translation id="2149973817440762519">Wysig boekmerk</translation> <translation id="2175927920773552910">QR-kode</translation> -<translation id="2198757192731523470">Google sal dalk jou geskiedenis gebruik om Search, advertensies en ander Google-dienste te personaliseer.</translation> <translation id="2218443599109088993">Zoem uit</translation> <translation id="2230173723195178503">Webblad is gelaai</translation> <translation id="2239626343334228536">Vee blaaierdata uit …</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Soek in bladsy</translation> <translation id="4049507953662678203">Maak seker jy het 'n netwerkverbinding en probeer weer.</translation> <translation id="4079195788735381731">Jou organisasie het jou afgemeld</translation> -<translation id="4082688844002261427">Beheer hoe jou blaaigeskiedenis gebruik word om Search, advertensies en meer te personaliseer</translation> <translation id="408404951701638773">Soekbalk kan nou makliker bereik word</translation> <translation id="411254640334432676">Kon nie aflaai nie.</translation> <translation id="4112644173421521737">Soek</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Jy kan hiermee relevante webbladsye op grond van jou omgewing ontdek.</translation> <translation id="5758631781033351321">Jy sal jou leeslys hier kry</translation> <translation id="5782227691023083829">Vertaal tans …</translation> -<translation id="5797070761912323120">Google kan jou geskiedenis gebruik om Search, advertensies en ander Google-dienste te personaliseer</translation> <translation id="5803566855766646066">Is jy seker jy wil hierdie nuwe kaart weggooi?</translation> <translation id="5812974770859303494">Voeg by …</translation> <translation id="5816228676161003208">Dit laat jou vinniger soek met jou stem.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ongeleesde artikels.</translation> <translation id="7412027924265291969">Gaan voort</translation> <translation id="7425346204213733349">Veranderinge aan jou boekmerke, geskiedenis, wagwoorde en ander instellings sal nie meer met jou Google-rekening gesinkroniseer word nie. Jou bestaande data sal egter in jou Google-rekening geberg bly.</translation> +<translation id="7431991332293347422">Beheer hoe jou blaaigeskiedenis gebruik word om Search en meer te personaliseer</translation> <translation id="7435356471928173109">Afgeskakel deur jou administrateur</translation> <translation id="7454057999980797137">Staat / Distrik</translation> <translation id="7456847797759667638">Maak ligging oop …</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 8390b2a..12cdcefe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ግባ…</translation> <translation id="2149973817440762519">እልባት አርትዕ</translation> <translation id="2175927920773552910">የQR ኮድ</translation> -<translation id="2198757192731523470">Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ሲል ታሪክዎን ሊጠቀም ይችላል።</translation> <translation id="2218443599109088993">አሳንስ</translation> <translation id="2230173723195178503">ድረ-ገጽ ተጭኗል</translation> <translation id="2239626343334228536">የአሰሳ ውሂብን በማጽዳት ላይ...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">በዚህ ገጽ ውስጥ አግኝ</translation> <translation id="4049507953662678203">የአውታረ መረብ ግንኙነት እንዳለዎት ያረጋግጡና እንደገና ይሞክሩ።</translation> <translation id="4079195788735381731">የእርስዎ ድርጅት ዘግቶ አስወጥተዎታል።</translation> -<translation id="4082688844002261427">ፍለጋን፣ ማስታወቂያዎችን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> <translation id="408404951701638773">የፍለጋ አሞሌ አሁን ለማግኘት ይበልጥ ይቀልላል</translation> <translation id="411254640334432676">ማውረድ አልተሳካም።</translation> <translation id="4112644173421521737">ፍለጋ</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">ይህ በእርስዎ ያሉበት ስፍራ አካባቢ ላይ በመመርኮዝ ተዛማጅነት ያላቸው የድር ገጾችን እንዲያገኙ ያስችልዎታል።</translation> <translation id="5758631781033351321">የእርስዎን ንባብ ዝርዝር እዚህ ያገኛሉ</translation> <translation id="5782227691023083829">በመተረጎም ላይ...</translation> -<translation id="5797070761912323120">Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ የእርስዎን ታሪክ ሊጠቀም ይችላል</translation> <translation id="5803566855766646066">እርግጠኛ ነዎት ይህን አዲስ ካርድ ማስወገድ ይፈልጋሉ?</translation> <translation id="5812974770859303494">አክል ወደ...</translation> <translation id="5816228676161003208">ይህ እርስዎ ድምፅዎን ተጠቅመው በበለጠ ፍጥነት እንዲፈልጉ ያስችልዎታል።</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ያልተነበቡ ጽሑፎች።</translation> <translation id="7412027924265291969">ቀጥል</translation> <translation id="7425346204213733349">በእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ላይ የተደረጉ ለውጦች ከአሁን በኋላ ከእርስዎ የGoogle መለያ ጋር አይሠምሩም። ሆኖም ግን ነባር ውሂብዎ በእርስዎ የGoogle መለያ ላይ እንደተከማቸ ይቆያል።</translation> +<translation id="7431991332293347422">ፍለጋን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation> <translation id="7435356471928173109">በአስተዳዳሪዎ ጠፍቷል</translation> <translation id="7454057999980797137">ግዛት / አውራጃ</translation> <translation id="7456847797759667638">የተቀመጠበትን ቦታ ክፈት…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 17e9cfd..4bca26f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">تسجيل الدخول…</translation> <translation id="2149973817440762519">تعديل الإشارة</translation> <translation id="2175927920773552910">رمز الاستجابة السريعة</translation> -<translation id="2198757192731523470">قد تستخدم Google السجلّ لتخصيص "بحث Google" والإعلانات وخدمات Google الأخرى.</translation> <translation id="2218443599109088993">تصغير</translation> <translation id="2230173723195178503">تم تحميل الصفحة المطلوبة</translation> <translation id="2239626343334228536">جارٍ محو بيانات التصفُّح...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">البحث في الصفحة</translation> <translation id="4049507953662678203">تأكد من اتصالك بالشبكة، وأعد المحاولة.</translation> <translation id="4079195788735381731">أزالت مؤسستك إذنك بتسجيل الدخول.</translation> -<translation id="4082688844002261427">التحكُّم في كيفية استخدام سجلّ التصفُّح لتخصيص البحث والإعلانات والمزيد</translation> <translation id="408404951701638773">أصبح الوصول إلى شريط البحث أسهل الآن</translation> <translation id="411254640334432676">فشلت عملية التنزيل</translation> <translation id="4112644173421521737">بحث</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">يتيح لك هذا اكتشاف صفحات الويب ذات الصلة حسب الأشياء المحيطة بك.</translation> <translation id="5758631781033351321">ستظهر لك "قائمة القراءة" هنا</translation> <translation id="5782227691023083829">جارٍ ترجمة...</translation> -<translation id="5797070761912323120">قد تستخدم Google سجلّك لتخصيص البحث والإعلانات وخدمات Google الأخرى.</translation> <translation id="5803566855766646066">هل تريد فعلاً تجاهل هذه البطاقة الجديدة؟</translation> <translation id="5812974770859303494">إضافة إلى...</translation> <translation id="5816228676161003208">هذا يتيح لك البحث بشكلٍ أسرع باستخدام صوتك.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> مقالة غير مقروءة</translation> <translation id="7412027924265291969">متابعة</translation> <translation id="7425346204213733349">لن تتم بعد الآن مزامنة التغييرات التي تطرأ على الإشارات المرجعية والسجلّ وكلمات المرور وغيرها من الإعدادات مع حسابك على Google، ولكن ستظل بياناتك الحالية مخزّنة في حسابك على Google.</translation> +<translation id="7431991332293347422">التحكُّم في كيفية استخدامنا لسِجل التصفُّح لتخصيص البحث والمزيد</translation> <translation id="7435356471928173109">أوقَف المشرف وضع "التصفُّح الآمن".</translation> <translation id="7454057999980797137">الولاية/المقاطعة</translation> <translation id="7456847797759667638">فتح موقع...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index c0bd61a..c94db6c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ছাইন ইন কৰক…</translation> <translation id="2149973817440762519">বুকমার্ক সম্পাদনা কৰক</translation> <translation id="2175927920773552910">কিউআৰ ক’ড</translation> -<translation id="2198757192731523470">Googleএ Search, বিজ্ঞাপন আৰু অন্য Google সেৱা ব্যক্তিকৃত কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস ব্যৱহাৰ কৰিব পাৰে।</translation> <translation id="2218443599109088993">জুম আউট কৰক</translation> <translation id="2230173723195178503">ৱেবপৃষ্ঠা ল’ড হ’ল</translation> <translation id="2239626343334228536">ব্ৰাউজিঙৰ ডেটা মচি থকা হৈছে...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">পৃষ্ঠাত বিচাৰক</translation> <translation id="4049507953662678203">আপোনাৰ নেটৱৰ্ক সংযোগ থকাটো নিশ্চিত কৰি আকৌ চেষ্টা কৰক।</translation> <translation id="4079195788735381731">আপোনাৰ প্ৰতিষ্ঠানে আপোনাক ছাইন আউট কৰিছে</translation> -<translation id="4082688844002261427">Search, বিজ্ঞাপন আৰু অন্য সুবিধাসমূহ ব্যক্তিকৃত কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস কেনেদৰে ব্যৱহাৰ কৰা হয় সেয়া নিয়ন্ত্ৰণ কৰক</translation> <translation id="408404951701638773">সন্ধান বাৰডাল বিচাৰি পোৱাটো এতিয়া সহজ</translation> <translation id="411254640334432676">ডাউনল’ড কৰিব পৰা নগ’ল।</translation> <translation id="4112644173421521737">Search</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">ই আপোনাক আপোনাৰ চৌপাশৰ ঠাইৰ ওপৰত ভিত্তি কৰি প্ৰাসংগিক ৱেব পৃষ্ঠা সন্ধান কৰিবলৈ দিয়ে।</translation> <translation id="5758631781033351321">ইয়াত আপুনি নিজৰ পঢ়াৰ সূচীখন বিচাৰি পাব</translation> <translation id="5782227691023083829">অনুবাদ কাৰ্য্য চলি আছে...</translation> -<translation id="5797070761912323120">Googleএ Search, বিজ্ঞাপন আৰু অন্য Google সেৱা ব্যক্তিকৃত কৰিবলৈ আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস ব্যৱহাৰ কৰিব পাৰে</translation> <translation id="5803566855766646066">আপুনি এই নতুন কাৰ্ডখন প্ৰত্যাখ্যান কৰিব বিচাৰে বুলি নিশ্চিতনে?</translation> <translation id="5812974770859303494">ইয়াত যোগ দিয়ক...</translation> <translation id="5816228676161003208">এই সুবিধাই আপোনাক নিজৰ কণ্ঠস্বৰ ব্যৱহাৰ কৰি ক্ষিপ্ৰভাৱে সন্ধান কৰিবলৈ দিয়ে।</translation> @@ -648,6 +645,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" />টা নপঢ়া প্ৰবন্ধ।</translation> <translation id="7412027924265291969">অব্যাহত ৰাখক</translation> <translation id="7425346204213733349">আপোনাৰ বুকমাৰ্ক, ইতিহাস, পাছৱৰ্ড আৰু অন্য ছেটিংসমূহত কৰা সলনি কার্যসমূহ আপোনাৰ Google একাউণ্টত আৰু ছিংক কৰা নহয়। তথাপিও, আপোনাৰ পূর্বে থকা ডেটাসমূহ নিজৰ Google একাউণ্টত সঞ্চিত হৈ থাকিব।</translation> +<translation id="7431991332293347422">আপোনাক Search আৰু অন্য সেৱাসমূহত ব্যক্তিগতকৰণ কৰা অভিজ্ঞতা প্ৰদান কৰিবলৈ কেনেকৈ আপোনাৰ ব্ৰাউজিংৰ ইতিহাস ব্যৱহাৰ কৰা হয় সেয়া নিয়ন্ত্ৰণ কৰক</translation> <translation id="7435356471928173109">আপোনাৰ প্ৰশাসকে অফ কৰিছে</translation> <translation id="7454057999980797137">ৰাজ্য / দেশ</translation> <translation id="7456847797759667638">অৱস্থান খোলক...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 769f05cf..fad7bff 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Giriş…</translation> <translation id="2149973817440762519">Əlfəcinə düzəliş edin</translation> <translation id="2175927920773552910">QR Kod</translation> -<translation id="2198757192731523470">Google axtarış, reklam və digər Google xidmətlərini fərdiləşdirmək üçün tarixçənizi istifadə edə bilər.</translation> <translation id="2218443599109088993">Kiçildin</translation> <translation id="2230173723195178503">Veb səhifə yükləndi</translation> <translation id="2239626343334228536">Brauzinq datası silinir...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Səhifədə tapın</translation> <translation id="4049507953662678203">Şəbəkə bağlantısının olmasına əmin olun və yenidən cəhd edin.</translation> <translation id="4079195788735381731">Təşkilatınız sizi hesabdan çıxardı</translation> -<translation id="4082688844002261427">Axtarış, reklamlar və s. fərdiləşdirmək üçün brauzer tarixçəsinin necə istifadə edildiyinə nəzarət edin</translation> <translation id="408404951701638773">İndi axtarış panelinə daxil olmaq daha asandır</translation> <translation id="411254640334432676">Endirmə uğursuz oldu.</translation> <translation id="4112644173421521737">Axtarın</translation> @@ -407,6 +405,7 @@ <translation id="5197255632782567636">internet</translation> <translation id="5210365745912300556">Paneli qapadın</translation> <translation id="5228579091201413441">Sinxronizasiyanı aktiv edin</translation> +<translation id="5232485538978018676">İdarə olunan hesab ilə daxil olun</translation> <translation id="5234764350956374838">Kənarlaşdırın</translation> <translation id="5245322853195994030">Sinxronizasiyanı Ləğv Edin</translation> <translation id="5271549068863921519">Şifrəni yadda saxlayın</translation> @@ -452,7 +451,6 @@ <translation id="5738887413654608789">Ətrafınızda uyğun veb səhifələri kəşf etməyə imkan verir.</translation> <translation id="5758631781033351321">Oxu siyahısını burada tapa bilərsiniz</translation> <translation id="5782227691023083829">Tərcümə edilir...</translation> -<translation id="5797070761912323120">Axtarış, reklam və digər Google xidmətlərini fərdiləşdirmək üçün Google tarixçədən istifadə edə bilər</translation> <translation id="5803566855766646066">Bu yeni kartı silmək istədiyinizə əminsiniz?</translation> <translation id="5812974770859303494">Buraya əlavə edin:</translation> <translation id="5816228676161003208">Səsinizi istifadə edərək daha sürətli axtarış etməyə icazə verir.</translation> @@ -649,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> oxunmamış məqalə.</translation> <translation id="7412027924265291969">Davam edin</translation> <translation id="7425346204213733349">Əlfəcin, tarixçə, parol və digər ayarlarınızdakı dəyişikliklər artıq Google Hesabınıza sinxronizasiya olunmayacaq. Buna baxmayaraq, mövcud datanız Google hesabınızın yaddaşında qalacaq.</translation> +<translation id="7431991332293347422">Axtarış tarixçəsinin Axtarış və sairəni necə fərdiləşdirdiyinə nəzarət edin</translation> <translation id="7435356471928173109">Administratorunuz tərəfindən deaktiv edilib</translation> <translation id="7454057999980797137">Ştat/Ölkə</translation> <translation id="7456847797759667638">Məkanı Açın...</translation> @@ -723,6 +722,7 @@ <translation id="8206354486702514201">Bu ayar administratorunuz tərəfindən icra olunur.</translation> <translation id="8225985093977202398">Keşlənmiş Şəkillər və Fayllar</translation> <translation id="8261506727792406068">Silin</translation> +<translation id="8271720166617117963">Qəbul edin və daxil olun</translation> <translation id="8281781826761538115">Defolt - <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">Keçin</translation> <translation id="8283172974887967105">Ayarlayın:</translation> @@ -765,6 +765,7 @@ <translation id="8654802032646794042">Ləğv edin</translation> <translation id="8668210798914567634">Bu səhifə Oxu Siyahısında yadda saxlanılmışdır.</translation> <translation id="8680787084697685621">Hesaba avtomatik giriş detallarının vaxtı keçib.</translation> +<translation id="8691262314411702087">Nəyi sinxronizasiya edilcəyini seçin</translation> <translation id="8693663554456874301">{count,plural, =1{Tabı bağlayın}other{Tabları bağlayın}}</translation> <translation id="8706588385081740091">Parollar</translation> <translation id="8717864919010420084">Linki Kopyalayın</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index e3a69e9..c2a6076 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Увайсці…</translation> <translation id="2149973817440762519">Рэдагаваць закладку</translation> <translation id="2175927920773552910">QR-код</translation> -<translation id="2198757192731523470">Google можа выкарыстоўваць вашу гісторыю, каб персаналізаваць пошук, паказ рэкламы і іншыя сэрвісы Google.</translation> <translation id="2218443599109088993">Паменшыць</translation> <translation id="2230173723195178503">Вэб-старонка загружана</translation> <translation id="2239626343334228536">Ідзе ачыстка даных прагляду...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Знайсці на старонцы</translation> <translation id="4049507953662678203">Праверце, ці ёсць у вас падключэнне да сеткі, і паўтарыце спробу.</translation> <translation id="4079195788735381731">Выхад за вас выканала ваша арганізацыя</translation> -<translation id="4082688844002261427">Кіраванне тым, як гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку, рэкламы і інш.</translation> <translation id="408404951701638773">Панэллю пошуку цяпер карыстацца лягчэй</translation> <translation id="411254640334432676">Збой спампоўкі.</translation> <translation id="4112644173421521737">Пошук</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Гэта дазваляе на аснове даных пра наваколле знаходзіць адпаведныя вэб-старонкі.</translation> <translation id="5758631781033351321">Ваш спіс чытання знаходзіцца тут</translation> <translation id="5782227691023083829">Ідзе пераклад...</translation> -<translation id="5797070761912323120">Google можа выкарыстоўваць вашу гісторыю, каб персаналізаваць пошук, паказ рэкламы і іншыя сэрвісы Google</translation> <translation id="5803566855766646066">Сапраўды адхіліць гэту новую картку?</translation> <translation id="5812974770859303494">Дадаць у...</translation> <translation id="5816228676161003208">Гэта дазваляе паскорыць пошук пры выкарыстанні голасу.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Непрачытаных артыкулаў: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Працягнуць</translation> <translation id="7425346204213733349">Змены ў закладках, гісторыі, паролях і іншых наладах больш не будуць сінхранізавацца з Уліковым запісам Google. Але існуючыя даныя застануцца ва Уліковым запісе Google.</translation> +<translation id="7431991332293347422">Кіраванне тым, як ваша гісторыя прагляду сайтаў выкарыстоўваецца для персаналізацыі пошуку і ў іншых мэтах</translation> <translation id="7435356471928173109">Выключаны адміністратарам</translation> <translation id="7454057999980797137">Штат/акруга</translation> <translation id="7456847797759667638">Адкрыць размяшчэнне...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 426f787..3e22b77 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Вход…</translation> <translation id="2149973817440762519">Редактиране на отметката</translation> <translation id="2175927920773552910">Код за бърза реакция</translation> -<translation id="2198757192731523470">Възможно е да използваме историята ви, за да персонализираме търсенето, рекламите и други услуги на Google.</translation> <translation id="2218443599109088993">Отдалечаване</translation> <translation id="2230173723195178503">Уеб страницата се зареди</translation> <translation id="2239626343334228536">Данните за сърфирането се изчистват...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Търсене в страницата</translation> <translation id="4049507953662678203">Уверете се, че сте свързани с мрежа, и опитайте отново.</translation> <translation id="4079195788735381731">Излязохте от профила си заради правилата на организацията ви</translation> -<translation id="4082688844002261427">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето, рекламите и др.</translation> <translation id="408404951701638773">До лентата за търсене вече се стига по-лесно</translation> <translation id="411254640334432676">Изтеглянето не бе успешно.</translation> <translation id="4112644173421521737">Търсене</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Това ви позволява да откривате подходящи уеб страници въз основа на заобикалящата ви среда.</translation> <translation id="5758631781033351321">Тук ще се показва списъкът ви за четене</translation> <translation id="5782227691023083829">Превежда се...</translation> -<translation id="5797070761912323120">Възможно е да използваме историята ви, за да персонализираме търсенето, рекламите и други услуги на Google</translation> <translation id="5803566855766646066">Наистина ли искате да отхвърлите тази нова карта?</translation> <translation id="5812974770859303494">Добавяне към...</translation> <translation id="5816228676161003208">Това ви позволява да търсите по-бързо посредством гласа си.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> непрочетени статии.</translation> <translation id="7412027924265291969">Напред</translation> <translation id="7425346204213733349">Промените в отметките, историята, паролите и другите ви настройки вече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него.</translation> +<translation id="7431991332293347422">Контролирайте начина, по който историята ви на сърфиране се използва за персонализиране на търсенето и др.</translation> <translation id="7435356471928173109">Изключено от администратора ви</translation> <translation id="7454057999980797137">Щат/държава</translation> <translation id="7456847797759667638">Отваряне на местоположение...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index a722c7e..a5747ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">সাইন-ইন করুন…</translation> <translation id="2149973817440762519">বুকমার্ক সম্পাদনা করুন</translation> <translation id="2175927920773552910">QR কোড</translation> -<translation id="2198757192731523470">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে।</translation> <translation id="2218443599109088993">ছোট করে দেখুন</translation> <translation id="2230173723195178503">Webpage loaded</translation> <translation id="2239626343334228536">ব্রাউজিং ডেটা মোছা হচ্ছে…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">পৃষ্ঠাতে খুঁজুন</translation> <translation id="4049507953662678203">আপনি একটি নেটওয়ার্ক সংযোগে আছেন কিনা তা নিশ্চিত করুন এবং আবার চেষ্টা করুন।</translation> <translation id="4079195788735381731">আপনার সংস্থা আপনাকে সাইন-আউট করে দিয়েছে</translation> -<translation id="4082688844002261427">সার্চ, বিজ্ঞাপন এবং আরও অনেক কিছু নিজের মতো করে সাজিয়ে নেওয়ার জন্য আপনার ব্রাউজিং এর ইতিহাস কীভাবে ব্যবহার হবে তা নিয়ন্ত্রণ করুন</translation> <translation id="408404951701638773">সার্চ বারে কাজ করা এখন সহজ</translation> <translation id="411254640334432676">ডাউনলোড করা যায়নি।</translation> <translation id="4112644173421521737">Search</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">এই আদেশটি আপনার পারিপার্শ্বিক পরিবেশের উপর নির্ভর করে ওয়েব পৃষ্ঠার খোঁজ করতে দেয়।</translation> <translation id="5758631781033351321">আপনি নিজের পড়ার তালিকা এখানে খুঁজে পাবেন</translation> <translation id="5782227691023083829">অনুবাদ হচ্ছে...</translation> -<translation id="5797070761912323120">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে</translation> <translation id="5803566855766646066">আপনি কি সত্যিই এই নতুন কার্ড বাতিল করতে চান?</translation> <translation id="5812974770859303494">এতে যোগ করুন...</translation> <translation id="5816228676161003208">এটি আপনাকে আপনার ভয়েস ব্যবহার করে আরও দ্রুত সার্চ করতে দেয়।</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">পড়া হয়নি এমন <ph name="UNREAD_COUNT" />টি নিবন্ধ।</translation> <translation id="7412027924265291969">চালিয়ে যান</translation> <translation id="7425346204213733349">আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংসে করা পরিবর্তন আর আপনার Google অ্যাকাউন্টের সাথে সিঙ্ক করা হবে না। অবশ্য, আপনার বিদ্যমান ডেটা আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে।</translation> +<translation id="7431991332293347422">সার্চ এবং আরও অনেক কিছু নিজের মত করে সাজিয়ে নেওয়ার জন্য আপনার ব্রাউজিং ইতিহাস কীভাবে ব্যবহার হবে তা নিয়ন্ত্রণ করুন</translation> <translation id="7435356471928173109">আপনার অ্যাডমিনিস্ট্রেটর বন্ধ করে দিয়েছে</translation> <translation id="7454057999980797137">রাজ্য / দেশ</translation> <translation id="7456847797759667638">লোকেশন খুলুন...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index eb77ec4..ea5e5b3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Prijava…</translation> <translation id="2149973817440762519">Uredi oznaku</translation> <translation id="2175927920773552910">QR kôd</translation> -<translation id="2198757192731523470">Google može koristiti vašu historiju za personalizaciju Pretraživanja, oglasa i drugih Googleovih usluga.</translation> <translation id="2218443599109088993">Umanji</translation> <translation id="2230173723195178503">Web lokacija je učitana</translation> <translation id="2239626343334228536">Brisanje podataka pregledanja...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Pronađi na ovoj stranici</translation> <translation id="4049507953662678203">Provjerite imate li mrežnu vezu i pokušajte ponovo.</translation> <translation id="4079195788735381731">Vaša organizacija vas je odjavila</translation> -<translation id="4082688844002261427">Kontrolirajte način na koji se historija pregledanja koristi za personalizaciju Pretraživanja, oglasa i još mnogo toga</translation> <translation id="408404951701638773">Sada je lakše prići traci za pretraživanje</translation> <translation id="411254640334432676">Preuzimanje nije uspjelo.</translation> <translation id="4112644173421521737">Pretraži</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Ovako možete otkriti relevantne web lokacije na osnovu vašeg okruženja.</translation> <translation id="5758631781033351321">Listu za čitanje ćete pronaći ovdje</translation> <translation id="5782227691023083829">Prevođenje...</translation> -<translation id="5797070761912323120">Google može koristiti vašu historiju za personalizaciju Pretraživanja, oglasa i drugih Googleovih usluga</translation> <translation id="5803566855766646066">Jeste li sigurni da želite odbaciti novu karticu?</translation> <translation id="5812974770859303494">Dodaj u...</translation> <translation id="5816228676161003208">To vam omogućava brže pretraživanje pomoću glasa.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Broj nepročitanih članaka: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Nastavi</translation> <translation id="7425346204213733349">Promjene vaših oznaka, historije, lozinki i drugih postavki neće se više sinhronizirati s vašim Google računom. Međutim, vaši postojeći podaci će ostati pohranjeni na vašem Google računu.</translation> +<translation id="7431991332293347422">Kontrolirajte kako se koristi vaša historija pregledanja za personalizaciju Pretraživanja i još mnogo toga</translation> <translation id="7435356471928173109">Funkciju je isključio vaš administrator</translation> <translation id="7454057999980797137">Zemlja / Okrug</translation> <translation id="7456847797759667638">Otvori lokaciju...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 34088d83..48c912c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Inicia la sessió…</translation> <translation id="2149973817440762519">Edita l'adreça d'interès</translation> <translation id="2175927920773552910">Codi QR</translation> -<translation id="2198757192731523470">És possible que Google utilitzi el teu historial per personalitzar la Cerca, els anuncis i altres serveis de Google.</translation> <translation id="2218443599109088993">Redueix</translation> <translation id="2230173723195178503">La pàgina web s'ha carregat</translation> <translation id="2239626343334228536">S'estan esborrant les dades de navegació...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Cerca a la pàgina</translation> <translation id="4049507953662678203">Assegureu-vos que teniu una connexió a la xarxa i torneu-ho a provar.</translation> <translation id="4079195788735381731">La teva organització t'ha tancat la sessió</translation> -<translation id="4082688844002261427">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca, els anuncis i molt més</translation> <translation id="408404951701638773">Ara és més fàcil accedir a la barra de cerca</translation> <translation id="411254640334432676">S'ha produït un error durant la baixada.</translation> <translation id="4112644173421521737">Cerca</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Això et permet detectar pàgines web rellevants del teu entorn.</translation> <translation id="5758631781033351321">Trobaràs la llista de lectura aquí</translation> <translation id="5782227691023083829">S'està traduint...</translation> -<translation id="5797070761912323120">És possible que Google utilitzi el teu historial per personalitzar la Cerca, els anuncis i altres serveis de Google</translation> <translation id="5803566855766646066">Confirmes que vols descartar aquesta targeta nova?</translation> <translation id="5812974770859303494">Afegeix a...</translation> <translation id="5816228676161003208">Això et permet fer cerques més de pressa amb la veu.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> articles sense llegir.</translation> <translation id="7412027924265291969">Continua</translation> <translation id="7425346204213733349">Els canvis que es facin a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el Compte de Google. No obstant això, les dades actuals hi continuaran emmagatzemades.</translation> +<translation id="7431991332293347422">Controla com s'utilitza l'historial de navegació per personalitzar la Cerca i més</translation> <translation id="7435356471928173109">Desactivada per l'administrador</translation> <translation id="7454057999980797137">Província</translation> <translation id="7456847797759667638">Obre la ubicació...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 4a552732..7d9c834 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Přihlásit se…</translation> <translation id="2149973817440762519">Upravit záložku</translation> <translation id="2175927920773552910">QR kód</translation> -<translation id="2198757192731523470">Google vaši historii může používat k personalizaci Vyhledávání, reklam a dalších služeb Google.</translation> <translation id="2218443599109088993">Oddálit</translation> <translation id="2230173723195178503">Webová stránka byla načtena</translation> <translation id="2239626343334228536">Mazání údajů o prohlížení...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Najít na stránce</translation> <translation id="4049507953662678203">Zkontrolujte, zda jste připojeni k síti a zkuste to znovu.</translation> <translation id="4079195788735381731">Vaše organizace vás odhlásila</translation> -<translation id="4082688844002261427">Nastavte, jak se má vaše historie prohlížení používat k personalizaci Vyhledávání, reklam a dalších služeb</translation> <translation id="408404951701638773">Vyhledávací pole je teď snáze dostupné</translation> <translation id="411254640334432676">Stahování se nezdařilo.</translation> <translation id="4112644173421521737">Hledat</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Umožňuje vám objevovat relevantní webové stránky na základě vašeho okolí.</translation> <translation id="5758631781033351321">Zde najdete svůj seznam četby</translation> <translation id="5782227691023083829">Překládání...</translation> -<translation id="5797070761912323120">Google vaši historii může používat k personalizaci Vyhledávání, reklam a dalších služeb Google</translation> <translation id="5803566855766646066">Opravdu tuto novou kartu chcete zahodit?</translation> <translation id="5812974770859303494">Přidat do…</translation> <translation id="5816228676161003208">Toto umožňuje vyhledávat rychleji hlasem.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Nepřečtené články: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Pokračovat</translation> <translation id="7425346204213733349">Změny záložek, historie, hesel a dalších nastavení se již nebudou synchronizovat do vašeho účtu Google. Vaše existující data však v účtu Google uložena zůstanou.</translation> +<translation id="7431991332293347422">Nastavte, jak se má vaše historie prohlížení používat k personalizaci Vyhledávání a dalších služeb</translation> <translation id="7435356471928173109">Vypnuto administrátorem</translation> <translation id="7454057999980797137">Stát / země</translation> <translation id="7456847797759667638">Otevřít umístění...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index d865800f..9fb78c8a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Log ind…</translation> <translation id="2149973817440762519">Rediger bogmærke</translation> <translation id="2175927920773552910">QR-kode</translation> -<translation id="2198757192731523470">Google kan bruge din historik til at tilpasse Søgning, annoncer og andre Google-tjenester.</translation> <translation id="2218443599109088993">Zoom ud</translation> <translation id="2230173723195178503">Websiden er indlæst</translation> <translation id="2239626343334228536">Browserdata ryddes...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Find på siden</translation> <translation id="4049507953662678203">Sørg for, at du har forbindelse til et netværk, og prøv igen.</translation> <translation id="4079195788735381731">Din organisation loggede dig ud</translation> -<translation id="4082688844002261427">Bestem, hvordan din browserhistorik anvendes til at tilpasse søgeresultater, annoncer og meget mere</translation> <translation id="408404951701638773">Nu er det nemmere at bruge søgefeltet</translation> <translation id="411254640334432676">Download mislykkedes.</translation> <translation id="4112644173421521737">Søg</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Dette giver dig mulighed for at opdage relevante websider baseret på dine omgivelser.</translation> <translation id="5758631781033351321">Her finder du din læseliste</translation> <translation id="5782227691023083829">Oversætter ...</translation> -<translation id="5797070761912323120">Google kan bruge din historik til at tilpasse Søgning, annoncer og andre Google-tjenester</translation> <translation id="5803566855766646066">Er du sikker på, at du vil kassere dette nye kort?</translation> <translation id="5812974770859303494">Føj til...</translation> <translation id="5816228676161003208">Dette gør søgning ved hjælp af din stemme hurtigere.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ulæste artikler.</translation> <translation id="7412027924265291969">Fortsæt</translation> <translation id="7425346204213733349">Ændringer af dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres ikke længere til din Google-konto. Dine eksisterende data er dog stadig gemt på din Google-konto.</translation> +<translation id="7431991332293347422">Bestem selv, hvordan din browserhistorik skal bruges til at tilpasse søgeresultater m.m.</translation> <translation id="7435356471928173109">Deaktiveret af din administrator</translation> <translation id="7454057999980797137">Delstat/amt</translation> <translation id="7456847797759667638">Åbn placering...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 3e45f9b..e39abcda 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Anmelden…</translation> <translation id="2149973817440762519">Lesezeichen bearbeiten</translation> <translation id="2175927920773552910">QR-Code</translation> -<translation id="2198757192731523470">Mithilfe Ihres Verlaufs kann Google die Google Suche, Werbung und andere Google-Dienste personalisieren.</translation> <translation id="2218443599109088993">Herauszoomen</translation> <translation id="2230173723195178503">Webseite geladen</translation> <translation id="2239626343334228536">Browserdaten werden gelöscht…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Auf Seite suchen</translation> <translation id="4049507953662678203">Überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es noch einmal.</translation> <translation id="4079195788735381731">Ihre Organisation hat Sie abgemeldet</translation> -<translation id="4082688844002261427">Legen Sie fest, wie Ihr Browserverlauf zur Personalisierung verwendet wird, z. B. bei der Suche und bei Werbung</translation> <translation id="408404951701638773">Auf die Suchleiste kann jetzt noch einfacher zugegriffen werden</translation> <translation id="411254640334432676">Fehler beim Download</translation> <translation id="4112644173421521737">Suche</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Dann können Sie relevante Webseiten zu Objekten in Ihrer Umgebung entdecken.</translation> <translation id="5758631781033351321">Hier wird Ihre Leseliste angezeigt</translation> <translation id="5782227691023083829">Wird übersetzt...</translation> -<translation id="5797070761912323120">Anhand Ihres Verlaufs kann Google die Google Suche, Werbung und andere Google-Dienste personalisieren</translation> <translation id="5803566855766646066">Möchten Sie diese neue Karte wirklich verwerfen?</translation> <translation id="5812974770859303494">Hinzufügen zu…</translation> <translation id="5816228676161003208">Per Spracheingabe können Sie noch schneller suchen.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ungelesene Artikel.</translation> <translation id="7412027924265291969">Weiter</translation> <translation id="7425346204213733349">Änderungen an Ihren Lesezeichen, Ihrem Verlauf, Ihren Passwörtern und anderen Einstellungen werden nicht mehr mit Ihrem Google-Konto synchronisiert. Ihre vorhandenen Daten bleiben aber in Ihrem Google-Konto gespeichert.</translation> +<translation id="7431991332293347422">Legen Sie fest, wie Ihr Browserverlauf zur Personalisierung der Google Suche verwendet wird</translation> <translation id="7435356471928173109">Von Ihrem Administrator deaktiviert</translation> <translation id="7454057999980797137">Bundesl./Landkr.</translation> <translation id="7456847797759667638">Adresse öffnen...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index a3a99437..d9ef736b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Σύνδεση…</translation> <translation id="2149973817440762519">Επεξεργασία σελιδοδείκτη</translation> <translation id="2175927920773552910">Κωδικός QR</translation> -<translation id="2198757192731523470">Η Google μπορεί να χρησιμοποιεί το ιστορικό σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google.</translation> <translation id="2218443599109088993">Σμίκρυνση</translation> <translation id="2230173723195178503">Η ιστοσελίδα φορτώθηκε</translation> <translation id="2239626343334228536">Διαγραφή δεδομένων περιήγησης…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Εύρεση στη σελίδα</translation> <translation id="4049507953662678203">Βεβαιωθείτε ότι έχετε μια σύνδεση δικτύου και δοκιμάστε ξανά.</translation> <translation id="4079195788735381731">Ο οργανισμός σας σάς αποσύνδεσε</translation> -<translation id="4082688844002261427">Ελέγξτε τον τρόπο με τον οποίο χρησιμοποιείται το ιστορικό περιήγησής σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων στοιχείων</translation> <translation id="408404951701638773">Η πρόσβαση στη γραμμή αναζήτησης είναι πλέον πιο εύκολη</translation> <translation id="411254640334432676">Αποτυχία λήψης.</translation> <translation id="4112644173421521737">Αναζήτηση</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Αυτό σας επιτρέπει να ανακαλύψετε σχετικές ιστοσελίδες βάσει του περιβάλλοντός σας.</translation> <translation id="5758631781033351321">Εδώ θα βρείτε τη λίστα ανάγνωσής σας</translation> <translation id="5782227691023083829">Μετάφραση...</translation> -<translation id="5797070761912323120">Η Google μπορεί να χρησιμοποιήσει το ιστορικό σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google</translation> <translation id="5803566855766646066">Είστε βέβαιοι ότι θέλετε να απορρίψετε αυτήν τη νέα κάρτα;</translation> <translation id="5812974770859303494">Προσθήκη σε…</translation> <translation id="5816228676161003208">Σας επιτρέπει να πραγματοποιείτε ταχύτερη αναζήτηση με φωνητικές εντολές.</translation> @@ -651,6 +648,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> μη αναγνωσμένα άρθρα.</translation> <translation id="7412027924265291969">Συνέχεια</translation> <translation id="7425346204213733349">Οι αλλαγές στους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και σε άλλες ρυθμίσεις δεν θα συγχρονίζονται πλέον με το Λογαριασμό σας Google. Ωστόσο, τα υπάρχοντα δεδομένα σας θα παραμείνουν αποθηκευμένα στο Λογαριασμό σας Google.</translation> +<translation id="7431991332293347422">Ελέγξτε τον τρόπο με τον οποίο χρησιμοποιείται το ιστορικό περιήγησής σας για την εξατομίκευση της Αναζήτησης και άλλων λειτουργιών</translation> <translation id="7435356471928173109">Απενεργοποιήθηκε από τον διαχειριστή σας.</translation> <translation id="7454057999980797137">Νομός/Επαρχία</translation> <translation id="7456847797759667638">Άνοιγμα Τοποθεσίας...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 33c8e3b..b43b7bf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Sign in…</translation> <translation id="2149973817440762519">Edit Bookmark</translation> <translation id="2175927920773552910">QR code</translation> -<translation id="2198757192731523470">Google may use your history to personalise Search, ads and other Google services.</translation> <translation id="2218443599109088993">Zoom out</translation> <translation id="2230173723195178503">Web page loaded</translation> <translation id="2239626343334228536">Clearing browsing data…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Find in Page</translation> <translation id="4049507953662678203">Make sure you have a network connection, and try again.</translation> <translation id="4079195788735381731">Your organisation signed you out</translation> -<translation id="4082688844002261427">Control how your browsing history is used to personalise Search, ads and more</translation> <translation id="408404951701638773">Search bar is now easier to reach</translation> <translation id="411254640334432676">Download failed.</translation> <translation id="4112644173421521737">Search</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">This lets you discover relevant web pages based on your surroundings.</translation> <translation id="5758631781033351321">You'll find your reading list here</translation> <translation id="5782227691023083829">Translating...</translation> -<translation id="5797070761912323120">Google may use your history to personalise Search, ads and other Google services</translation> <translation id="5803566855766646066">Are you sure that you want to discard this new card?</translation> <translation id="5812974770859303494">Add to…</translation> <translation id="5816228676161003208">This lets you search faster using your voice.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> unread articles.</translation> <translation id="7412027924265291969">Continue</translation> <translation id="7425346204213733349">Changes to your bookmarks, history, passwords and other settings will no longer be synced to your Google Account. However, your existing data will remain stored in your Google Account.</translation> +<translation id="7431991332293347422">Control how your browsing history is used to personalise Search and more</translation> <translation id="7435356471928173109">Turned off by your administrator</translation> <translation id="7454057999980797137">State / County</translation> <translation id="7456847797759667638">Open Location...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index fefc801..180d871 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Acceder…</translation> <translation id="2149973817440762519">Editar marcador</translation> <translation id="2175927920773552910">Código QR</translation> -<translation id="2198757192731523470">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google.</translation> <translation id="2218443599109088993">Alejar</translation> <translation id="2230173723195178503">Se cargó la página web</translation> <translation id="2239626343334228536">Borrando datos de navegación…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Buscar en la página</translation> <translation id="4049507953662678203">Asegúrate de tener una conexión de red y vuelve a intentarlo.</translation> <translation id="4079195788735381731">Tu organización te hizo salir de tu cuenta</translation> -<translation id="4082688844002261427">Controla cómo se usa tu historial de navegación para personalizar la Búsqueda, los anuncios y mucho más</translation> <translation id="408404951701638773">La barra de búsqueda ahora está al alcance de la mano</translation> <translation id="411254640334432676">Se produjo un error durante la descarga.</translation> <translation id="4112644173421521737">Buscar</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Esta capacidad te permite descubrir páginas web relevantes en función de tu entorno.</translation> <translation id="5758631781033351321">Aquí encontrarás tu lista de lectura</translation> <translation id="5782227691023083829">Traduciendo...</translation> -<translation id="5797070761912323120">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="5803566855766646066">¿Confirmas que quieres descartar esta tarjeta nueva?</translation> <translation id="5812974770859303494">Agregar a…</translation> <translation id="5816228676161003208">Te permite realizar búsquedas más rápidas con tu voz.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artículos sin leer.</translation> <translation id="7412027924265291969">Continuar</translation> <translation id="7425346204213733349">Los cambios de tus favoritos, historial, contraseñas y otras opciones de configuración ya no se sincronizarán con tu cuenta de Google. Sin embargo, los datos existentes permanecerán almacenados en tu cuenta de Google.</translation> +<translation id="7431991332293347422">Controla cómo se usa tu historial de navegación para personalizar la Búsqueda y mucho más</translation> <translation id="7435356471928173109">El administrador desactivó la función</translation> <translation id="7454057999980797137">Estado/condado</translation> <translation id="7456847797759667638">Abrir ubicación...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 3f828ea..944dea2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Iniciar sesión…</translation> <translation id="2149973817440762519">Editar marcador</translation> <translation id="2175927920773552910">Código QR</translation> -<translation id="2198757192731523470">Es posible que se utilice tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google.</translation> <translation id="2218443599109088993">Reducir</translation> <translation id="2230173723195178503">Página web cargada</translation> <translation id="2239626343334228536">Borrando datos de navegación...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Buscar en página</translation> <translation id="4049507953662678203">Comprueba que tienes una conexión de red y vuelve a intentarlo.</translation> <translation id="4079195788735381731">Tu organización ha cerrado tu sesión</translation> -<translation id="4082688844002261427">Controla cómo se utiliza el historial de navegación para personalizar la Búsqueda, los anuncios y mucho más</translation> <translation id="408404951701638773">Ahora es más fácil ir a la barra de búsqueda</translation> <translation id="411254640334432676">Error de descarga.</translation> <translation id="4112644173421521737">Buscar</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Esto te permite descubrir páginas web relevantes según lo que te rodea.</translation> <translation id="5758631781033351321">Aquí verás tu lista de lectura</translation> <translation id="5782227691023083829">Traduciendo...</translation> -<translation id="5797070761912323120">Es posible que Google utilice tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation> <translation id="5803566855766646066">¿Seguro que quieres descartar esta nueva tarjeta?</translation> <translation id="5812974770859303494">Añadir a...</translation> <translation id="5816228676161003208">Esto te permite hacer búsquedas más rápido con tu voz.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artículos no leídos.</translation> <translation id="7412027924265291969">Continuar</translation> <translation id="7425346204213733349">Los cambios que hagas en los marcadores, el historial, las contraseñas y otras opciones no se sincronizarán con tu cuenta de Google. Sin embargo, tus datos actuales seguirán almacenados en tu cuenta.</translation> +<translation id="7431991332293347422">Controla cómo se usa el historial de navegación para personalizar la Búsqueda y más</translation> <translation id="7435356471928173109">Desactivada por tu administrador</translation> <translation id="7454057999980797137">Región</translation> <translation id="7456847797759667638">Abrir ubicación...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 447af2e..1e252f7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Logige sisse …</translation> <translation id="2149973817440762519">Muuda järjehoidjat</translation> <translation id="2175927920773552910">QR-kood</translation> -<translation id="2198757192731523470">Google võib kasutada teie ajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks.</translation> <translation id="2218443599109088993">Suumi välja</translation> <translation id="2230173723195178503">Veebileht laaditi</translation> <translation id="2239626343334228536">Sirvimisandmete kustutamine …</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Otsi lehelt</translation> <translation id="4049507953662678203">Veenduge, et oleksite võrguga ühendatud, ja proovige uuesti.</translation> <translation id="4079195788735381731">Teie organisatsioon logis teid välja</translation> -<translation id="4082688844002261427">Juhtige, kuidas teie sirvimisajalugu kasutatakse otsingu, reklaamide ja muu isikupärastamiseks</translation> <translation id="408404951701638773">Otsinguriba aktiveerimine on nüüd lihtsam</translation> <translation id="411254640334432676">Allalaadimine ebaõnnestus.</translation> <translation id="4112644173421521737">Otsi</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">See võimaldab teil ümbruskonna järgi asjakohaseid veebilehti avastada.</translation> <translation id="5758631781033351321">Oma lugemisloendi leiate siit</translation> <translation id="5782227691023083829">Tõlkimine...</translation> -<translation id="5797070761912323120">Google võib kasutada teie ajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks</translation> <translation id="5803566855766646066">Kas soovite kindlasti sellest uuest kaardist loobuda?</translation> <translation id="5812974770859303494">Lisa …</translation> <translation id="5816228676161003208">See võimaldab häälkäskluste abil kiiremini otsida.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> lugemata artiklit.</translation> <translation id="7412027924265291969">Jätka</translation> <translation id="7425346204213733349">Järjehoidjates, ajaloos, paroolides ja muudes seadetes tehtud muudatusi ei sünkroonita enam teie Google'i kontoga. Teie olemasolevad andmed jäävad siiski teie Google'i kontole.</translation> +<translation id="7431991332293347422">Juhtige, kuidas kasutatakse teie sirvimisajalugu otsingu ja muu isikupärastamiseks</translation> <translation id="7435356471928173109">Administraator on välja lülitanud</translation> <translation id="7454057999980797137">Osariik/maakond</translation> <translation id="7456847797759667638">Ava asukoht...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 7e8fb339..cdb8259c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Hasi saioa…</translation> <translation id="2149973817440762519">Editatu laster-marka</translation> <translation id="2175927920773552910">QR kodea</translation> -<translation id="2198757192731523470">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko.</translation> <translation id="2218443599109088993">Txikitu</translation> <translation id="2230173723195178503">Kargatu da webgunea</translation> <translation id="2239626343334228536">Arakatze-datuak garbitzen…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Bilatu orrian</translation> <translation id="4049507953662678203">Ziurtatu sarera konektatuta zaudela eta saiatu berriro.</translation> <translation id="4079195788735381731">Erakundeak saioa amaitu dizu</translation> -<translation id="4082688844002261427">Kontrolatu nola erabiltzen den arakatze-historia Bilaketa, iragarkiak eta beste pertsonalizatzeko</translation> <translation id="408404951701638773">Orain, errazagoa da bilaketa-barra erabiltzea</translation> <translation id="411254640334432676">Ezin izan da deskargatu.</translation> <translation id="4112644173421521737">Bilatu</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Honi esker, inguruan duzunaren arabera interesa dakizkizukeen web-orri aipagarriak aurkituko dituzu.</translation> <translation id="5758631781033351321">Irakurketa-zerrenda aurkituko duzu hemen</translation> <translation id="5782227691023083829">Itzultzen…</translation> -<translation id="5797070761912323120">Baliteke Google-k historia erabiltzea Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="5803566855766646066">Ziur txartel berri hau baztertu nahi duzula?</translation> <translation id="5812974770859303494">Gehitu…</translation> <translation id="5816228676161003208">Honi esker, bizkorrago bilatu ahal izango dituzu gauzak ahotsaren bidez.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Irakurri gabeko <ph name="UNREAD_COUNT" /> artikulu.</translation> <translation id="7412027924265291969">Egin aurrera</translation> <translation id="7425346204213733349">Aurrerantzean, ez dira Google-ko kontuarekin sinkronizatuko laster-marketan, historian, pasahitzetan eta bestelako ezarpenetan egiten dituzun aldaketak. Hala ere, orain arteko datuak Google-ko kontuan izaten jarraituko duzu.</translation> +<translation id="7431991332293347422">Kontrolatu arakatze-historia nola erabiltzen den Bilaketa eta beste zerbitzu batzuk pertsonalizatzeko</translation> <translation id="7435356471928173109">Administratzaileak desaktibatu du</translation> <translation id="7454057999980797137">Probintzia</translation> <translation id="7456847797759667638">Ireki kokapena…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 5f99cb5..aaa167f3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ورود به سیستم…</translation> <translation id="2149973817440762519">ویرایش نشانک</translation> <translation id="2175927920773552910">رمزینه پاسخسریع</translation> -<translation id="2198757192731523470">Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو، آگهیها، و سایر سرویسهای Google استفاده کند.</translation> <translation id="2218443599109088993">کوچک کردن</translation> <translation id="2230173723195178503">صفحه وب بار شد</translation> <translation id="2239626343334228536">درحال پاک کردن دادههای محصول مرور…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">یافتن در صفحه</translation> <translation id="4049507953662678203">مطمئن شوید اتصال شبکه دارید و دوباره امتحان کنید.</translation> <translation id="4079195788735381731">سازمانتان شما را از سیستم خارج کرده است</translation> -<translation id="4082688844002261427">کنترل نحوه استفاده از سابقه مرور برای شخصیسازی «جستجو»، آگهیها و موارد دیگر</translation> <translation id="408404951701638773">اکنون دسترسی به نوار جستجو آسانتر است</translation> <translation id="411254640334432676">بارگیری نشد.</translation> <translation id="4112644173421521737">جستجو</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">با این کار میتوانید صفحههای وب مرتبط را براساس محیط اطرافتان کاوش کنید.</translation> <translation id="5758631781033351321">فهرست مطالعه را اینجا خواهید دید</translation> <translation id="5782227691023083829">در حال ترجمه...</translation> -<translation id="5797070761912323120">Google ممکن است از سابقه مرور شما برای شخصی کردن جستجو، آگهیها و سایر سرویسهای Google استفاده کند</translation> <translation id="5803566855766646066">مطمئنید میخواهید از این کارت جدید صرفنظر کنید؟</translation> <translation id="5812974770859303494">افزودن به…</translation> <translation id="5816228676161003208">این کار به شما اجازه میدهد با استفاده از صدایتان سریعتر جستجو کنید.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> مقاله خواندهنشده.</translation> <translation id="7412027924265291969">ادامه</translation> <translation id="7425346204213733349">تغییرات در نشانکها، سابقه، گذرواژه و سایر تنظیمات دیگر با حساب Google شما همگامسازی نخواهند شد. با این حال، دادههای موجودتان در حساب Google شما باقی خواهند ماند.</translation> +<translation id="7431991332293347422">کنترل نحوه استفاده از سابقه مرور برای شخصیسازی «جستجو» و موارد دیگر</translation> <translation id="7435356471928173109">سرپرستتان آن را خاموش کرده است</translation> <translation id="7454057999980797137">ایالت / استان</translation> <translation id="7456847797759667638">باز کردن مکان...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 6bae946..5770e65 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Kirjaudu sisään…</translation> <translation id="2149973817440762519">Muokkaa kirjanmerkkiä</translation> <translation id="2175927920773552910">QR-koodi</translation> -<translation id="2198757192731523470">Google voi muokata Hakua, mainoksia ja muita Googlen palveluita historiasi perusteella.</translation> <translation id="2218443599109088993">Loitonna</translation> <translation id="2230173723195178503">Verkkosivu ladattiin.</translation> <translation id="2239626343334228536">Selaustietoja poistetaan…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Hae sivulta</translation> <translation id="4049507953662678203">Varmista, että käytössäsi on verkkoyhteys, ja yritä uudelleen.</translation> <translation id="4079195788735381731">Organisaatiosi on kirjannut sinut ulos</translation> -<translation id="4082688844002261427">Määritä, miten selaushistoria personoi hakua, mainoksia ja muita</translation> <translation id="408404951701638773">Hakukenttä on nyt helpommin käytettävissä</translation> <translation id="411254640334432676">Lataus epäonnistui.</translation> <translation id="4112644173421521737">Haku</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Tämän avulla voit löytää sinua ympäröiviin asioihin liittyviä verkkosivuja.</translation> <translation id="5758631781033351321">Näet lukulistasi täällä</translation> <translation id="5782227691023083829">Käännetään...</translation> -<translation id="5797070761912323120">Google voi muokata Hakua, mainoksia ja muita Googlen palveluita historiasi perusteella</translation> <translation id="5803566855766646066">Haluatko varmasti hylätä tämän uuden kortin?</translation> <translation id="5812974770859303494">Lisää…</translation> <translation id="5816228676161003208">Tämän avulla voit hakea tietoja nopeammin puhumalla.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> lukematonta artikkelia</translation> <translation id="7412027924265291969">Jatka</translation> <translation id="7425346204213733349">Kirjanmerkkeihin, historiaan, salasanoihin ja muihin asetuksiin tehtäviä muutoksia ei enää synkronoida Google-tilillesi. Olemassa olevia tietojasi säilytetään kuitenkin Google-tililläsi.</translation> +<translation id="7431991332293347422">Määritä, miten selaushistoria personoi Hakua ja muita</translation> <translation id="7435356471928173109">Järjestelmänvalvojasi on ottanut tämän pois päältä</translation> <translation id="7454057999980797137">Alue/maa</translation> <translation id="7456847797759667638">Avaa sijainti...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index de590ed..330e3b5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Mag-sign In…</translation> <translation id="2149973817440762519">I-edit ang Bookmark</translation> <translation id="2175927920773552910">QR Code</translation> -<translation id="2198757192731523470">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google.</translation> <translation id="2218443599109088993">Zoom Out</translation> <translation id="2230173723195178503">Na-load na ang webpage</translation> <translation id="2239626343334228536">Kini-clear ang data sa pag-browse...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Hanapin sa Page</translation> <translation id="4049507953662678203">Tiyaking mayroon kang koneksyon sa network, at subukang muli.</translation> <translation id="4079195788735381731">Na-sign out ka ng iyong organisasyon</translation> -<translation id="4082688844002261427">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap, mga ad, at higit pa</translation> <translation id="408404951701638773">Mas madali nang puntahan ang search bar</translation> <translation id="411254640334432676">Hindi na-download.</translation> <translation id="4112644173421521737">Maghanap</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Nagbibigay-daan ito sa iyo na tumuklas ng mga nauugnay na web page batay sa iyong paligid.</translation> <translation id="5758631781033351321">Makikita mo rito ang iyong listahan ng babasahin</translation> <translation id="5782227691023083829">Tina-translate...</translation> -<translation id="5797070761912323120">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation> <translation id="5803566855766646066">Sigurado ka bang gusto mong i-discard ang bagong card na ito?</translation> <translation id="5812974770859303494">Idagdag Sa...</translation> <translation id="5816228676161003208">Binibigyang-daan ka nito upang mas mabilis na makapaghanap gamit ang iyong boses.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> (na) hindi pa nababasang artikulo.</translation> <translation id="7412027924265291969">Magpatuloy</translation> <translation id="7425346204213733349">Hindi na masi-sync sa Google Account mo ang mga pagbabago sa iyong mga bookmark, history, password, at iba pang setting. Gayunpaman, mananatiling naka-store sa Google account mo ang iyong kasalukuyang data.</translation> +<translation id="7431991332293347422">Kontrolin kung paano ginagamit ang iyong history ng pag-browse para i-personalize ang Paghahanap at higit pa</translation> <translation id="7435356471928173109">Na-off ng iyong administrator</translation> <translation id="7454057999980797137">Estado / County</translation> <translation id="7456847797759667638">Buksan ang Lokasyon...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 3f2a3edd..b813ca9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Connexion…</translation> <translation id="2149973817440762519">Modifier le favori</translation> <translation id="2175927920773552910">Code QR</translation> -<translation id="2198757192731523470">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google.</translation> <translation id="2218443599109088993">Zoom arrière</translation> <translation id="2230173723195178503">Page Web chargée</translation> <translation id="2239626343334228536">Effacement des données de navigation en cours…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Rechercher dans la page</translation> <translation id="4049507953662678203">Assurez-vous d'avoir une connexion réseau et réessayez.</translation> <translation id="4079195788735381731">Votre organisation vous a déconnecté</translation> -<translation id="4082688844002261427">Gérez la façon dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces et plus encore</translation> <translation id="408404951701638773">La barre de recherche est désormais plus facile à atteindre</translation> <translation id="411254640334432676">Échec du téléchargement.</translation> <translation id="4112644173421521737">Rechercher</translation> @@ -407,6 +405,7 @@ <translation id="5197255632782567636">Internet</translation> <translation id="5210365745912300556">Fermer l'onglet</translation> <translation id="5228579091201413441">Activer la synchronisation</translation> +<translation id="5232485538978018676">Se connecter avec un compte géré</translation> <translation id="5234764350956374838">Fermer</translation> <translation id="5245322853195994030">Annuler la synchronisation</translation> <translation id="5271549068863921519">Enregistrer le mot de passe</translation> @@ -452,7 +451,6 @@ <translation id="5738887413654608789">Cela vous permet de découvrir des pages Web pertinentes en fonction de votre environnement.</translation> <translation id="5758631781033351321">Vous trouverez votre liste de lecture ici</translation> <translation id="5782227691023083829">Traduction en cours…</translation> -<translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> <translation id="5803566855766646066">Voulez-vous vraiment supprimer cette nouvelle carte?</translation> <translation id="5812974770859303494">Ajouter à…</translation> <translation id="5816228676161003208">Ceci vous permet d'effectuer des recherches plus rapides en utilisant votre voix.</translation> @@ -649,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> articles non lus.</translation> <translation id="7412027924265291969">Continuer</translation> <translation id="7425346204213733349">Les modifications apportées à vos favoris, à votre historique, à vos mots de passe et aux autres paramètres ne seront plus synchronisées avec votre compte Google. Cependant, vos données actuelles resteront stockées dans votre compte Google.</translation> +<translation id="7431991332293347422">Gérez la façon dont votre historique de navigation est utilisé pour personnaliser, entre autres, la recherche</translation> <translation id="7435356471928173109">Désactivée par votre administrateur</translation> <translation id="7454057999980797137">État / Comté</translation> <translation id="7456847797759667638">Ouvrir une adresse...</translation> @@ -723,6 +722,7 @@ <translation id="8206354486702514201">Votre administrateur impose la valeur associée à ce paramètre.</translation> <translation id="8225985093977202398">Images/fich. en cache</translation> <translation id="8261506727792406068">Supprimer</translation> +<translation id="8271720166617117963">Accepter et se connecter</translation> <translation id="8281781826761538115">Paramètres régionaux par défaut - <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">Passer</translation> <translation id="8283172974887967105">Définir…</translation> @@ -765,6 +765,7 @@ <translation id="8654802032646794042">Annuler</translation> <translation id="8668210798914567634">Cette page a été enregistrée dans votre liste de lecture.</translation> <translation id="8680787084697685621">L'information de connexion au compte n'est plus à jour.</translation> +<translation id="8691262314411702087">Choisir les éléments à synchroniser</translation> <translation id="8693663554456874301">{count,plural, =1{Fermer l'onglet}one{Fermer l'onglet}other{Fermer les onglets}}</translation> <translation id="8706588385081740091">Mots de passe</translation> <translation id="8717864919010420084">Copier le lien</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 2232fe8e..cbf86f6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Connectez-vous…</translation> <translation id="2149973817440762519">Modifier le favori</translation> <translation id="2175927920773552910">Code QR</translation> -<translation id="2198757192731523470">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google.</translation> <translation id="2218443599109088993">Zoom arrière</translation> <translation id="2230173723195178503">Page Web chargée</translation> <translation id="2239626343334228536">Effacement des données de navigation…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Rechercher sur la page</translation> <translation id="4049507953662678203">Vérifiez si vous disposez bien d'une connexion réseau, puis réessayez.</translation> <translation id="4079195788735381731">Votre organisation vous a déconnecté</translation> -<translation id="4082688844002261427">Contrôler la manière dont votre historique de navigation est utilisé pour personnaliser la recherche, les annonces et plus encore</translation> <translation id="408404951701638773">La barre de recherche est désormais accessible plus facilement</translation> <translation id="411254640334432676">Échec du téléchargement.</translation> <translation id="4112644173421521737">Rechercher</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Vous permet de découvrir les pages Web pertinentes en fonction de votre environnement.</translation> <translation id="5758631781033351321">Votre liste de lecture s'affichera ici</translation> <translation id="5782227691023083829">Traduction en cours...</translation> -<translation id="5797070761912323120">Google peut utiliser votre historique pour personnaliser la recherche, les annonces et d'autres services Google</translation> <translation id="5803566855766646066">Voulez-vous vraiment supprimer cette nouvelle carte ?</translation> <translation id="5812974770859303494">Ajouter à…</translation> <translation id="5816228676161003208">Cela vous permet d'effectuer des recherches plus rapidement en utilisant la recherche vocale.</translation> @@ -651,6 +648,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> articles non lus.</translation> <translation id="7412027924265291969">Continuer</translation> <translation id="7425346204213733349">Les modifications apportées à vos favoris, votre historique, vos mots de passe et d'autres paramètres ne seront plus synchronisées avec votre compte Google. Vos données seront cependant maintenues sur votre compte Google.</translation> +<translation id="7431991332293347422">Contrôler la manière dont votre historique de navigation est utilisé pour personnaliser la recherche et plus encore</translation> <translation id="7435356471928173109">Mode désactivé par votre administrateur</translation> <translation id="7454057999980797137">État/Comté</translation> <translation id="7456847797759667638">Ouvrir une adresse</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index bc1f2c9..47ca4ed 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Iniciar sesión…</translation> <translation id="2149973817440762519">Editar marcador</translation> <translation id="2175927920773552910">Código QR</translation> -<translation id="2198757192731523470">Google pode utilizar o teu historial para personalizar a Busca, os anuncios e outros servizos seus.</translation> <translation id="2218443599109088993">Afastar</translation> <translation id="2230173723195178503">Cargouse a páxina web</translation> <translation id="2239626343334228536">Borrando datos de navegación…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Buscar na páxina</translation> <translation id="4049507953662678203">Asegúrate de ter conexión de rede e téntao de novo.</translation> <translation id="4079195788735381731">A túa organización pechou a túa sesión</translation> -<translation id="4082688844002261427">Controla como se utiliza o historial de navegación para personalizar a Busca, os anuncios e moito máis</translation> <translation id="408404951701638773">Agora é máis fácil acceder á barra de busca</translation> <translation id="411254640334432676">Erro na descarga.</translation> <translation id="4112644173421521737">Buscar</translation> @@ -407,6 +405,7 @@ <translation id="5197255632782567636">Internet</translation> <translation id="5210365745912300556">Pechar pestana</translation> <translation id="5228579091201413441">Activar sincronización</translation> +<translation id="5232485538978018676">Iniciar sesión cunha conta xestionada</translation> <translation id="5234764350956374838">Rexeitar</translation> <translation id="5245322853195994030">Cancelar sincronización</translation> <translation id="5271549068863921519">Gardar contrasinal</translation> @@ -452,7 +451,6 @@ <translation id="5738887413654608789">Así poderás descubrir páxinas web relevantes en función do que te rodea.</translation> <translation id="5758631781033351321">Aquí atoparás a túa lista de lecturas</translation> <translation id="5782227691023083829">Traducindo…</translation> -<translation id="5797070761912323120">Google pode utilizar o teu historial para personalizar a Busca, os anuncios e outros servizos seus.</translation> <translation id="5803566855766646066">Seguro que queres descartar esta tarxeta nova?</translation> <translation id="5812974770859303494">Engadir a…</translation> <translation id="5816228676161003208">Permite que busques de forma máis rápida usando a voz.</translation> @@ -649,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artigos non lidos.</translation> <translation id="7412027924265291969">Continuar</translation> <translation id="7425346204213733349">Os cambios nos marcadores, no historial, nos contrasinais e noutras opcións de configuración deixarán de sincronizarse coa túa conta de Google. Non obstante, os teus datos actuais permanecerán almacenados na túa conta de Google.</translation> +<translation id="7431991332293347422">Controla como se utiliza o historial de navegación para personalizar a Busca e moito máis</translation> <translation id="7435356471928173109">Desactivada polo teu administrador</translation> <translation id="7454057999980797137">Estado/provin.</translation> <translation id="7456847797759667638">Abrir localización...</translation> @@ -723,6 +722,7 @@ <translation id="8206354486702514201">O administrador aplica esta configuración.</translation> <translation id="8225985093977202398">Imaxes e ficheiros en caché</translation> <translation id="8261506727792406068">Eliminar</translation> +<translation id="8271720166617117963">Aceptar e iniciar sesión</translation> <translation id="8281781826761538115">Idioma predeterminado: <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">Omitir</translation> <translation id="8283172974887967105">Definir…</translation> @@ -765,6 +765,7 @@ <translation id="8654802032646794042">Cancelar</translation> <translation id="8668210798914567634">Gardouse esta páxina na túa lista de lectura.</translation> <translation id="8680787084697685621">Os detalles de inicio de sesión da conta están caducados.</translation> +<translation id="8691262314411702087">Seleccionar que sincronizar</translation> <translation id="8693663554456874301">{count,plural, =1{Pechar pestana}other{Pechar pestanas}}</translation> <translation id="8706588385081740091">Contrasinais</translation> <translation id="8717864919010420084">Copiar ligazón</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index d017371..a8af31f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">સાઇન ઇન કરો…</translation> <translation id="2149973817440762519">બુકમાર્કમાં ફેરફાર કરો</translation> <translation id="2175927920773552910">QR કોડ</translation> -<translation id="2198757192731523470">શોધ, જાહેરાતો અને અન્ય Google સેવાઓને મનગમતી બનાવવા માટે Google, તમારા ઇતિહાસનો ઉપયોગ કરી શકે છે.</translation> <translation id="2218443599109088993">નાનું કરો</translation> <translation id="2230173723195178503">વેબપેજ લોડ કર્યું</translation> <translation id="2239626343334228536">બ્રાઉઝિંગ ડેટા સાફ થઈ રહ્યો છે...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">પેજમાં શોધો</translation> <translation id="4049507953662678203">તમારી પાસે નેટવર્ક કનેક્શન છે તેની ખાતરી કરો અને ફરીથી પ્રયાસ કરો.</translation> <translation id="4079195788735381731">તમારી સંસ્થા દ્વારા તમને સાઇન આઉટ કરવામાં આવ્યા છે</translation> -<translation id="4082688844002261427">શોધ, જાહેરાતો અને વધુ સુવિધાને વ્યક્તિગત કરવા માટે તમારા બ્રાઉઝિંગ ઇતિહાસને કેવી રીતે ઉપયોગમાં લેવાય તેનું નિયંત્રણ કરો</translation> <translation id="408404951701638773">શોધ બાર સુધી પહોંચવું હવે વધુ સરળ છે</translation> <translation id="411254640334432676">ડાઉનલોડ નિષ્ફળ થયું.</translation> <translation id="4112644173421521737">શોધો</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">આ તમને તમારી આસપાસના વાતાવરણના આધારે સંગત વેબ પૃષ્ઠોની શોધ કરવા દે છે.</translation> <translation id="5758631781033351321">તમને તમારી વાંચન સૂચિ અહીં મળશે</translation> <translation id="5782227691023083829">ભાષાંતર કરી રહ્યું છે...</translation> -<translation id="5797070761912323120">Google, શોધ, જાહેરાતો અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા ઇતિહાસનો ઉપયોગ કરી શકે છે</translation> <translation id="5803566855766646066">શું તમે ખરેખર આ નવું કાર્ડ કાઢી નાખવા માગો છો?</translation> <translation id="5812974770859303494">આમાં ઉમેરો...</translation> <translation id="5816228676161003208">આ તમને તમારા અવાજનો ઉપયોગ કરીને વધુ ઝડપથી શોધવા દે છે.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> વાંચ્યા વગરના લેખ.</translation> <translation id="7412027924265291969">ચાલુ રાખો</translation> <translation id="7425346204213733349">તમારા બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને બીજા સેટિંગમાં ફેરફારને હવે તમારા Google એકાઉન્ટ પર સિંક કરવામાં આવશે નહિ. જોકે, તમારો અસ્તિત્વમાંનો ડેટા તમારા Google એકાઉન્ટમાં સ્ટોર રહેશે.</translation> +<translation id="7431991332293347422">શોધ અને અન્ય બાબતોને તમને મનગમતી બનાવવા માટે તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરવાની રીત નિયંત્રિત કરો</translation> <translation id="7435356471928173109">તમારા વ્યવસ્થાપક દ્વારા આ સુવિધા બંધ કરવામાં આવી છે</translation> <translation id="7454057999980797137">રાજ્ય / કાઉન્ટી</translation> <translation id="7456847797759667638">સ્થાન ખોલો...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index fc7c770..1e81ede 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">साइन इन करें…</translation> <translation id="2149973817440762519">बुकमार्क में बदलाव करें</translation> <translation id="2175927920773552910">क्यूआर कोड</translation> -<translation id="2198757192731523470">खोज, विज्ञापन, और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए Google आपके इतिहास का इस्तेमाल कर सकता है.</translation> <translation id="2218443599109088993">ज़ूम घटाएं</translation> <translation id="2230173723195178503">वेबपेज लोड हो गया है</translation> <translation id="2239626343334228536">ब्राउज़िंग डेटा साफ़ हो रहा है...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">'पेज में ढूंढें'</translation> <translation id="4049507953662678203">पक्का करें कि आपके पास नेटवर्क कनेक्शन है और फिर से प्रयास करें.</translation> <translation id="4079195788735381731">आपके संगठन ने आपको साइन आउट कर दिया है</translation> -<translation id="4082688844002261427">यह नियंत्रित करें कि खोज, विज्ञापनों वगैरह को मनमुताबिक बनाने के लिए आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे किया जाए</translation> <translation id="408404951701638773">अब सर्च बार पर आसानी से पहुंच सकते हैं</translation> <translation id="411254640334432676">डाउनलोड विफल रहा.</translation> <translation id="4112644173421521737">Search</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">इससे आप अपने आस-पास की चीज़ों पर आधारित वेब पृष्ठों की खोज कर सकते हैं.</translation> <translation id="5758631781033351321">आपको अपनी, पढ़ने की चीज़ों की सूची यहां मिलेगी</translation> <translation id="5782227691023083829">अनुवाद हो रहा है...</translation> -<translation id="5797070761912323120">खोज, विज्ञापन, और दूसरी Google सेवाओं को मनमुताबिक बनाने के लिए, Google आपके इतिहास का इस्तेमाल कर सकता है</translation> <translation id="5803566855766646066">क्या आप वाकई इस नए कार्ड को खारिज करना चाहते हैं?</translation> <translation id="5812974770859303494">इनमें शामिल करें...</translation> <translation id="5816228676161003208">इससे आप अपनी आवाज़ का उपयोग करके तेज़ी से खोज सकते हैं.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> लेख पढ़े नहीं गए हैं.</translation> <translation id="7412027924265291969">जारी रखें</translation> <translation id="7425346204213733349">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में सिंक नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहित रहेगा.</translation> +<translation id="7431991332293347422">यह नियंत्रित करें कि खोज वगैरह को मनमुताबिक बनाने के लिए आपके ब्राउज़िंग इतिहास का इस्तेमाल कैसे किया जाए</translation> <translation id="7435356471928173109">आपके एडमिन ने ये सुविधा बंद की हुई है</translation> <translation id="7454057999980797137">राज्य / देश</translation> <translation id="7456847797759667638">स्थान खोलें...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index d1fa5ea..4dd8485 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Prijavite se…</translation> <translation id="2149973817440762519">Uredi oznaku</translation> <translation id="2175927920773552910">QR kôd</translation> -<translation id="2198757192731523470">Google može upotrebljavati vašu povijest za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga.</translation> <translation id="2218443599109088993">Smanji</translation> <translation id="2230173723195178503">Web-stranica učitana</translation> <translation id="2239626343334228536">Brisanje podataka o pregledavanju...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Traži na stranici</translation> <translation id="4049507953662678203">Provjerite mrežnu vezu i pokušajte ponovo.</translation> <translation id="4079195788735381731">Vaša organizacija vas je odjavila</translation> -<translation id="4082688844002261427">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja, oglasa i drugog</translation> <translation id="408404951701638773">Traku za pretraživanje sada je lakše dohvatiti</translation> <translation id="411254640334432676">Preuzimanje nije uspjelo.</translation> <translation id="4112644173421521737">Pretraži</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">To vam omogućuje da otkrijete relevantne web-stranice na temelju svojeg okruženja.</translation> <translation id="5758631781033351321">Ovdje ćete pronaći svoj popis za čitanje</translation> <translation id="5782227691023083829">Prijevod u tijeku...</translation> -<translation id="5797070761912323120">Google može upotrebljavati vašu povijest za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga</translation> <translation id="5803566855766646066">Jeste li sigurni da želite odbaciti ovu novu karticu?</translation> <translation id="5812974770859303494">Dodaj na...</translation> <translation id="5816228676161003208">To vam omogućuje brže pretraživanje uz upotrebu glasa.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Nepročitanih članaka: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Nastavi</translation> <translation id="7425346204213733349">Promjene oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši postojeći podaci ostat će pohranjeni na vašem Google računu.</translation> +<translation id="7431991332293347422">Odredite na koji će se način vaša povijest pregledavanja upotrebljavati za prilagodbu Pretraživanja i drugih značajki</translation> <translation id="7435356471928173109">Isključio vaš administrator</translation> <translation id="7454057999980797137">Županija</translation> <translation id="7456847797759667638">Otvori lokaciju...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index b941b748..ecb7bdd6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Bejelentkezés…</translation> <translation id="2149973817440762519">Könyvjelző szerkesztése</translation> <translation id="2175927920773552910">QR-kód</translation> -<translation id="2198757192731523470">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására.</translation> <translation id="2218443599109088993">Kicsinyítés</translation> <translation id="2230173723195178503">A weboldal betöltött</translation> <translation id="2239626343334228536">Böngészési adatok törlése…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Keresés az oldalon</translation> <translation id="4049507953662678203">Győződjön meg róla, hogy rendelkezik hálózati kapcsolattal, majd próbálja újra.</translation> <translation id="4079195788735381731">Szervezete kijelentkeztette</translation> -<translation id="4082688844002261427">Annak beállítása, hogy a rendszer hogyan szabja személyre a Keresést, a hirdetéseket és egyebeket a böngészési előzmények alapján</translation> <translation id="408404951701638773">Mostantól egyszerűbb a keresés a keresősávban</translation> <translation id="411254640334432676">A letöltés sikertelen.</translation> <translation id="4112644173421521737">Keresés</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Lehetővé teszi a felhasználó számára, hogy közvetlen környezete alapján fedezzen fel releváns weboldalakat.</translation> <translation id="5758631781033351321">Itt láthatja majd az olvasólistáját</translation> <translation id="5782227691023083829">A fordítás folyamatban...</translation> -<translation id="5797070761912323120">A Google felhasználhatja az Ön előzményeit a Kereső, a hirdetések és más Google-szolgáltatások személyre szabására</translation> <translation id="5803566855766646066">Biztosan elveti ezt az új kártyát?</translation> <translation id="5812974770859303494">Hozzáadás…</translation> <translation id="5816228676161003208">Lehetővé teszi a gyorsabb keresést a hangalapú keresés használatával.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> olvasatlan cikk.</translation> <translation id="7412027924265291969">Tovább</translation> <translation id="7425346204213733349">Könyvjelzői, előzményei, jelszavai és más beállításai a továbbiakban már nem lesznek szinkronizálva Google-fiókjával. Meglévő adatait azonban továbbra is tárolni fogja a fiók.</translation> +<translation id="7431991332293347422">Beállíthatja, hogy a rendszer hogyan szabja személyre a Keresést és egyebeket a böngészési előzmények alapján</translation> <translation id="7435356471928173109">A rendszergazda kikapcsolta</translation> <translation id="7454057999980797137">Állam/megye</translation> <translation id="7456847797759667638">Hely megnyitása...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 029fb1f..89589d0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Մտնել…</translation> <translation id="2149973817440762519">Փոփոխել էջանիշը</translation> <translation id="2175927920773552910">QR կոդ</translation> -<translation id="2198757192731523470">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել` Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար:</translation> <translation id="2218443599109088993">Փոքրացնել</translation> <translation id="2230173723195178503">Կայքէջը բեռնվեց</translation> <translation id="2239626343334228536">Այցելությունների պատմությունը ջնջվում է…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Գտնել էջում</translation> <translation id="4049507953662678203">Համոզվեք, որ կապակցված եք համացանցին և փորձեք նորից:</translation> <translation id="4079195788735381731">Կազմակերպության կանոնի համաձայն՝ դուք դուրս եք եկել հաշվից</translation> -<translation id="4082688844002261427">Կառավարեք ձեր այցելությունների պատմության օգտագործումը՝ Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> <translation id="408404951701638773">Որոնման տողից այժմ ավելի հեշտ է օգտվել</translation> <translation id="411254640334432676">Ներբեռնումը չհաջողվեց:</translation> <translation id="4112644173421521737">Որոնել</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Թույլ է տալիս գտնել ձեր տեղադրությանը համապատասխանող վեբ էջեր:</translation> <translation id="5758631781033351321">Ձեր ընթերցանության ցանկը կգտնեք այստեղ</translation> <translation id="5782227691023083829">Թարգմանվում է...</translation> -<translation id="5797070761912323120">Google-ը կարող է ձեր այցելությունների պատմությունն օգտագործել` Որոնումը, գովազդն ու Google-ի մյուս ծառայություններն անհատականացնելու համար</translation> <translation id="5803566855766646066">Հեռացնե՞լ նոր քարտը</translation> <translation id="5812974770859303494">Ավելացնել…</translation> <translation id="5816228676161003208">Թույլ է տալիս արագ որոնել ձայնի միջոցով:</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> չընթերցված հոդված</translation> <translation id="7412027924265291969">Շարունակել</translation> <translation id="7425346204213733349">Ձեր էջանիշների, այցելությունների պատմության, գաղտնաբառերի և այլ կարգավորումների փոփոխությունները չեն համաժամացվի ձեր Google հաշվի հետ: Այդուհանդերձ, ձեր առկա տվյալները կպահվեն ձեր Google հաշվում:</translation> +<translation id="7431991332293347422">Կառավարեք ձեր այցելությունների պատմության օգտագործումը՝ Որոնումը և այլ ծառայություններ անհատականացնելու համար</translation> <translation id="7435356471928173109">Անջատվել է ադմինիստրատորի կողմից</translation> <translation id="7454057999980797137">Նահանգ/շրջան</translation> <translation id="7456847797759667638">Open Location...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 7cc1c67..53b8d29 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Login …</translation> <translation id="2149973817440762519">Edit Bookmark</translation> <translation id="2175927920773552910">Kode QR</translation> -<translation id="2198757192731523470">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya.</translation> <translation id="2218443599109088993">Perkecil</translation> <translation id="2230173723195178503">Halaman web dimuat</translation> <translation id="2239626343334228536">Menghapus data browsing...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Cari di Halaman</translation> <translation id="4049507953662678203">Pastikan Anda memiliki koneksi jaringan dan coba lagi.</translation> <translation id="4079195788735381731">Organisasi membuat Anda logout</translation> -<translation id="4082688844002261427">Kontrol cara histori penjelajahan digunakan untuk mempersonalisasi Penelusuran, iklan, dan lainnya</translation> <translation id="408404951701638773">Kotak penelusuran kini lebih mudah dijangkau</translation> <translation id="411254640334432676">Download gagal.</translation> <translation id="4112644173421521737">Telusuri</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Hal ini memungkinkan Anda menemukan halaman web yang relevan berdasarkan berbagai hal di sekitar.</translation> <translation id="5758631781033351321">Daftar bacaan Anda akan ditampilkan di sini</translation> <translation id="5782227691023083829">Menerjemahkan...</translation> -<translation id="5797070761912323120">Google dapat menggunakan histori Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya</translation> <translation id="5803566855766646066">Yakin ingin menghapus kartu baru ini?</translation> <translation id="5812974770859303494">Tambahkan ke ...</translation> <translation id="5816228676161003208">Hal ini memungkinkan Anda menelusuri lebih cepat menggunakan suara.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artikel belum dibaca.</translation> <translation id="7412027924265291969">Lanjutkan</translation> <translation id="7425346204213733349">Perubahan pada bookmark, histori, sandi, dan setelan lainnya tidak akan disinkronkan lagi dengan Akun Google. Namun, data yang sudah ada akan tetap disimpan di Akun Google Anda.</translation> +<translation id="7431991332293347422">Kontrol cara histori browsing digunakan untuk mempersonalisasi Penelusuran dan lainnya</translation> <translation id="7435356471928173109">Dinonaktifkan oleh administrator Anda</translation> <translation id="7454057999980797137">Prov./County</translation> <translation id="7456847797759667638">Buka Lokasi...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index decc9f6..35b866e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Skrá inn…</translation> <translation id="2149973817440762519">Breyta bókamerki</translation> <translation id="2175927920773552910">QR-kóði</translation> -<translation id="2198757192731523470">Google notar hugsanlega ferilinn þinn til að sérsníða leitina, auglýsingar og aðra þjónustu Google.</translation> <translation id="2218443599109088993">Minnka aðdrátt</translation> <translation id="2230173723195178503">Vefsíða sótt</translation> <translation id="2239626343334228536">Hreinsar vefskoðunargögn...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Finna á síðu</translation> <translation id="4049507953662678203">Gakktu úr skugga um að þú sért tengd(ur) netinu og reyndu svo aftur.</translation> <translation id="4079195788735381731">Fyrirtækið þitt skráði þig út</translation> -<translation id="4082688844002261427">Stjórnaðu því hvernig vafraferillinn þinn er notaður til að sérsníða leit, auglýsingar og fleira</translation> <translation id="408404951701638773">Nú er auðveldara að nálgast leitarstikuna</translation> <translation id="411254640334432676">Niðurhal mistókst.</translation> <translation id="4112644173421521737">Leita</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Þetta gerir þér kleift að finna viðeigandi vefsíður út frá nánasta umhverfi þínu.</translation> <translation id="5758631781033351321">Þú finnur leslistann þinn hér</translation> <translation id="5782227691023083829">Þýðir...</translation> -<translation id="5797070761912323120">Google notar hugsanlega ferilinn þinn til að sérsníða leitina, auglýsingar og aðra þjónustu Google</translation> <translation id="5803566855766646066">Ertu viss um að þú viljir fleygja þessu nýja korti?</translation> <translation id="5812974770859303494">Bæta við...</translation> <translation id="5816228676161003208">Með þessu móti geturðu notað röddina til að leita hraðar.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ólesnar greinar.</translation> <translation id="7412027924265291969">Halda áfram</translation> <translation id="7425346204213733349">Breytingar á bókamerkjunum þínum, ferlinum, aðgangsorðunum og öðrum stillingum verða ekki lengur samstilltar við Google reikninginn þinn. Þau gögn sem fyrir eru verða þó áfram vistuð á Google reikningnum þínum.</translation> +<translation id="7431991332293347422">Stjórnaðu því hvernig vefskoðunarferillinn þinn er notaður til að sérsníða leit og fleira</translation> <translation id="7435356471928173109">Kerfisstjórinn slökkti á þessu</translation> <translation id="7454057999980797137">Ríki/sýsla</translation> <translation id="7456847797759667638">Opna staðsetningu...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index e17efe8..49364eb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Accedi…</translation> <translation id="2149973817440762519">Modifica Preferito</translation> <translation id="2175927920773552910">Codice QR</translation> -<translation id="2198757192731523470">Google può utilizzare la tua cronologia per personalizzare la Ricerca, gli annunci e altri servizi Google.</translation> <translation id="2218443599109088993">Diminuisci lo zoom</translation> <translation id="2230173723195178503">Pagina web caricata</translation> <translation id="2239626343334228536">Cancellazione dati di navigazione…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Trova nella pagina</translation> <translation id="4049507953662678203">Controlla la connessione di rete e riprova.</translation> <translation id="4079195788735381731">La tua organizzazione ha disconnesso il tuo account</translation> -<translation id="4082688844002261427">Gestisci la modalità di utilizzo della cronologia di navigazione per personalizzare la Ricerca, gli annunci e non solo</translation> <translation id="408404951701638773">Ora è più facile raggiungere la barra di ricerca</translation> <translation id="411254640334432676">Download non riuscito.</translation> <translation id="4112644173421521737">Cerca</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Puoi trovare pagine web pertinenti basate sui dintorni.</translation> <translation id="5758631781033351321">Qui troverai il tuo elenco di lettura</translation> <translation id="5782227691023083829">Traduzione in corso...</translation> -<translation id="5797070761912323120">Google può utilizzare la tua cronologia per personalizzare la Ricerca, gli annunci e altri servizi Google</translation> <translation id="5803566855766646066">Vuoi eliminare questa nuova carta?</translation> <translation id="5812974770859303494">Aggiungi a…</translation> <translation id="5816228676161003208">In questo modo puoi eseguire ricerche più veloci con la voce.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> articoli da leggere.</translation> <translation id="7412027924265291969">Continua</translation> <translation id="7425346204213733349">Le modifiche ai preferiti, alla cronologia, alle password e ad altre impostazioni non verranno più sincronizzate con il tuo Account Google. Tuttavia, i dati esistenti rimarranno memorizzati.</translation> +<translation id="7431991332293347422">Controlla la modalità di utilizzo della cronologia di navigazione per personalizzare la Ricerca e non solo</translation> <translation id="7435356471928173109">Disattivata dall'amministratore</translation> <translation id="7454057999980797137">Stato/contea</translation> <translation id="7456847797759667638">Apri percorso...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 6912d84..f6f89925 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">כניסה…</translation> <translation id="2149973817440762519">עריכת סימניות</translation> <translation id="2175927920773552910">קוד QR</translation> -<translation id="2198757192731523470">Google תוכל להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים.</translation> <translation id="2218443599109088993">התרחקות</translation> <translation id="2230173723195178503">דף האינטרנט נטען</translation> <translation id="2239626343334228536">ניקוי נתוני הגלישה מתבצע…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">חיפוש בדף</translation> <translation id="4049507953662678203">צריך לוודא שיש חיבור לרשת ולנסות שוב.</translation> <translation id="4079195788735381731">הארגון שלך הוציא אותך מהחשבון</translation> -<translation id="4082688844002261427">שליטה באופן שבו היסטוריית הגלישה משמשת להתאמה אישית של החיפוש, המודעות ועוד</translation> <translation id="408404951701638773">עכשיו קל יותר להגיע אל סרגל החיפוש</translation> <translation id="411254640334432676">ההורדה נכשלה.</translation> <translation id="4112644173421521737">חיפוש</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">תקשורת Bluetooth מאפשרת לך למצוא אתרי אינטרנט רלוונטיים לפי המיקום שלך.</translation> <translation id="5758631781033351321">רשימת הקריאה זמינה כאן</translation> <translation id="5782227691023083829">מתבצע תרגום...</translation> -<translation id="5797070761912323120">Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים</translation> <translation id="5803566855766646066">הכרטיס החדש יימחק. להמשיך?</translation> <translation id="5812974770859303494">הוספה אל…</translation> <translation id="5816228676161003208">אישור זה מאפשר לך לחפש מהר יותר בעזרת דיבור.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> מאמרים שלא נקראו.</translation> <translation id="7412027924265291969">המשך</translation> <translation id="7425346204213733349">שינויים בסימניות, בהיסטוריה, בסיסמאות ובהגדרות נוספות לא יסונכרנו עוד עם חשבון Google שלך. עם זאת, הנתונים הקיימים עדיין יאוחסנו בחשבון Google שלך.</translation> +<translation id="7431991332293347422">קביעת אופן השימוש בהיסטוריית הגלישה להתאמה אישית של החיפוש ועוד</translation> <translation id="7435356471928173109">מנהל המערכת כיבה את התכונה הזו</translation> <translation id="7454057999980797137">מדינה / ארץ</translation> <translation id="7456847797759667638">פתיחת מיקום...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index bb7a2a5..75bd285 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ログイン…</translation> <translation id="2149973817440762519">ブックマークを編集</translation> <translation id="2175927920773552910">QR コード</translation> -<translation id="2198757192731523470">検索、広告、その他の Google サービスをカスタマイズする目的で、Google が履歴を使用することがあります。</translation> <translation id="2218443599109088993">縮小</translation> <translation id="2230173723195178503">ウェブページを読み込みました</translation> <translation id="2239626343334228536">閲覧データを削除しています...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ページ内を検索</translation> <translation id="4049507953662678203">ネットワークに接続していることを確認してから、もう一度お試しください。</translation> <translation id="4079195788735381731">組織によってログアウトされました</translation> -<translation id="4082688844002261427">検索、広告などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="408404951701638773">検索バーをより手軽に使用できるようになりました</translation> <translation id="411254640334432676">ダウンロードできませんでした。</translation> <translation id="4112644173421521737">検索</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">この機能を使用すると、周囲で発信されているデータを受信して関連のあるウェブページを表示することができます。</translation> <translation id="5758631781033351321">リーディング リストはここに表示されます</translation> <translation id="5782227691023083829">翻訳しています...</translation> -<translation id="5797070761912323120">検索、広告、その他の Google サービスをカスタマイズするために、Google で履歴が使用されることがあります</translation> <translation id="5803566855766646066">この新しいカードを破棄してもよろしいですか?</translation> <translation id="5812974770859303494">追加先…</translation> <translation id="5816228676161003208">音声を使ってより速く検索できます。</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> 件の未読記事があります。</translation> <translation id="7412027924265291969">続行</translation> <translation id="7425346204213733349">今後、ブックマーク、履歴、パスワード、その他の設定に行った変更は Google アカウントに同期されません。ただし、既存のデータは Google アカウントに保存されたままとなります。</translation> +<translation id="7431991332293347422">検索などのカスタマイズを目的とした閲覧履歴の使用方法を設定</translation> <translation id="7435356471928173109">管理者によってオフにされています</translation> <translation id="7454057999980797137">州/都道府県</translation> <translation id="7456847797759667638">場所を開く...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index a8e1ce0..880b957 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">შესვლა…</translation> <translation id="2149973817440762519">სანიშნის რედაქტირება</translation> <translation id="2175927920773552910">QR კოდი</translation> -<translation id="2198757192731523470">Google-ს თქვენი ისტორიის გამოყენება შეუძლია Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად.</translation> <translation id="2218443599109088993">მასშტაბის შემცირება</translation> <translation id="2230173723195178503">ვებგვერდი ჩაიტვირთა</translation> <translation id="2239626343334228536">მიმდინარეობს დათვალიერების მონაცემების გასუფთავება…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ძიება გვერდზე</translation> <translation id="4049507953662678203">დარწმუნდით, რომ დაკავშირებული ხართ ქსელთან და ხელახლა ცადეთ.</translation> <translation id="4079195788735381731">თქვენმა ორგანიზაციამ სისტემიდან გამოგიყვანათ</translation> -<translation id="4082688844002261427">მართეთ, თუ როგორ გამოიყენება თქვენი დათვალიერების ისტორია Search-ის, რეკლამისა და სხვა სერვისების პერსონალიზებისთვის</translation> <translation id="408404951701638773">ახლა უფრო მარტივად შეგიძლიათ წვდომა ძიების ზოლზე</translation> <translation id="411254640334432676">ჩამოტვირთვა ვერ მოხერხდა.</translation> <translation id="4112644173421521737">ძიება</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">საშუალებას გაძლევთ, აღმოაჩინოთ თქვენს გარშემო არსებულ ობიექტებთან დაკავშირებული ვებგვერდები.</translation> <translation id="5758631781033351321">აქ თქვენს საკითხავ სიას იპოვით</translation> <translation id="5782227691023083829">მიმდინარეობს თარგმნა...</translation> -<translation id="5797070761912323120">Google-მა შეიძლება გამოიყენოს თქვენი ისტორია Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation> <translation id="5803566855766646066">ნამდვილად გსურთ ამ ახალი ბარათის გაუქმება?</translation> <translation id="5812974770859303494">დამატება...</translation> <translation id="5816228676161003208">საშუალებას გაძლევთ, უფრო სწრაფად განახორციელოთ ძიება ხმის მეშვეობით.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> წაუკითხავი სტატია.</translation> <translation id="7412027924265291969">გაგრძელება</translation> <translation id="7425346204213733349">თქვენი სანიშნეების, ისტორიის, პაროლებისა და სხვა პარამეტრების ცვლილებების სინქრონიზაცია თქვენს Google ანგარიშთან აღარ მოხდება. თუმცა არსებული მონაცემები კვლავ შეინახება თქვენს Google ანგარიშში.</translation> +<translation id="7431991332293347422">მართეთ თქვენი დათვალიერების ისტორიის გამოყენების ხერხები Search-ისა და სხვა სერვისების პერსონალიზებისთვის</translation> <translation id="7435356471928173109">გამორთულია თქვენი ადმინისტრატორის მიერ</translation> <translation id="7454057999980797137">შტატი/ოლქი</translation> <translation id="7456847797759667638">მდებარეობის გახსნა…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 2e0ab4e..8646802 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Кіру…</translation> <translation id="2149973817440762519">Бетбелгіні өзгерту</translation> <translation id="2175927920773552910">QR коды</translation> -<translation id="2198757192731523470">Search, жарнамалар және басқа да Google қызметтерін жеке қажеттеліктерге бейімдеу үшін интернетті шолу тарихы пайдаланылуы мүмкін.</translation> <translation id="2218443599109088993">Кішірейту</translation> <translation id="2230173723195178503">Веббет жүктелді</translation> <translation id="2239626343334228536">Браузерді пайдалану деректері тазалануда...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Беттен табу</translation> <translation id="4049507953662678203">Желімен байланысты тексеріп, әрекетті қайталап көріңіз.</translation> <translation id="4079195788735381731">Ұйымыңыз сізді есептік жазбадан шығарып жіберді</translation> -<translation id="4082688844002261427">Іздеу, жарнама қызметтерін, т.б. жекелендіру үшін браузерді қолдану тарихын қалай пайдалану керектігін көрсетіңіз.</translation> <translation id="408404951701638773">Іздеу жолағын пайдалану енді бұрынғыдан да оңай</translation> <translation id="411254640334432676">Жүктеу сәтсіз аяқталды.</translation> <translation id="4112644173421521737">Іздеу</translation> @@ -407,6 +405,7 @@ <translation id="5197255632782567636">Интернет</translation> <translation id="5210365745912300556">Қойындыны жабу</translation> <translation id="5228579091201413441">Синхрондауды қосу</translation> +<translation id="5232485538978018676">Қызметтік есептік жазбаға кіру</translation> <translation id="5234764350956374838">Жабу</translation> <translation id="5245322853195994030">Синхрондаудан бас тарту</translation> <translation id="5271549068863921519">Құпия сөзді сақтау</translation> @@ -452,7 +451,6 @@ <translation id="5738887413654608789">Бұл – айналаңыздың негізінде сәйкес веббеттерді анықтауға мүмкіндік береді.</translation> <translation id="5758631781033351321">Оқу тізімі осы жерге шығады</translation> <translation id="5782227691023083829">Аударылуда...</translation> -<translation id="5797070761912323120">Search, жарнамалар және басқа да Google қызметтерін жеке қажеттеліктерге бейімдеу үшін Google интернеттегі әрекеттеріңізді пайдалануы мүмкін.</translation> <translation id="5803566855766646066">Осы жаңа картаны шынымен де жабу керек пе?</translation> <translation id="5812974770859303494">Қосу...</translation> <translation id="5816228676161003208">Дауыспен жылдамырақ іздеуге мүмкіндік береді.</translation> @@ -649,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> мақала оқылмаған.</translation> <translation id="7412027924265291969">Жалғастыру</translation> <translation id="7425346204213733349">Бетбелгілерге, тарихқа, құпия сөздерге және басқа параметрлерге енгізілген өзгертулер бұдан әрі Google есептік жазбасымен синхрондалмайды. Дегенмен, бұрыннан бар деректер Google есептік жазбасында сақтаулы қалады.</translation> +<translation id="7431991332293347422">Search және т.б. қызметтерді жекелендіру үшін шолу тарихын қалай пайдалану керектігін көрсетіңіз</translation> <translation id="7435356471928173109">Әкімші өшіріп қойған.</translation> <translation id="7454057999980797137">Мемлекет / округ</translation> <translation id="7456847797759667638">Орынды ашу…</translation> @@ -723,6 +722,7 @@ <translation id="8206354486702514201">Бұл параметрді әкімші күштеп орнатқан.</translation> <translation id="8225985093977202398">Кэштелген кескіндер мен файлдар</translation> <translation id="8261506727792406068">Жою</translation> +<translation id="8271720166617117963">Қабылдау және кіру</translation> <translation id="8281781826761538115">Әдепкі - <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">Өткізіп жіберу</translation> <translation id="8283172974887967105">Орнату…</translation> @@ -730,7 +730,7 @@ <translation id="8299613349954694191">Инкогнито қойындысын ашып, интернетті құпия пайдаланыңыз.</translation> <translation id="83100941411593607">Кіру параметрі өшірулі</translation> <translation id="8319076807703933069">Жаңа іздеу</translation> -<translation id="8323906514956095947">Қосымша қойынды опциялары үшін түртіп, ұстап тұрыңыз.</translation> +<translation id="8323906514956095947">Қосымша қойынды опциялары үшін басып тұрыңыз.</translation> <translation id="8328777765163860529">Барлығын жабу</translation> <translation id="8386068868580335421">Бастапқы күйге қайтару</translation> <translation id="8407669440184693619">Бұл сайт үшін ешқандай құпия сөз табылмады.</translation> @@ -765,6 +765,7 @@ <translation id="8654802032646794042">Бас тарту</translation> <translation id="8668210798914567634">Бұл бет оқу тізіміне сақталды.</translation> <translation id="8680787084697685621">Есептік жазбаның кіру мәліметтері ескірген.</translation> +<translation id="8691262314411702087">Синхрондалатын деректерді таңдау</translation> <translation id="8693663554456874301">{count,plural, =1{Қойындыны жабу}other{Қойындыларды жабу}}</translation> <translation id="8706588385081740091">Құпия сөздер</translation> <translation id="8717864919010420084">Сілтемені көшіру</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 1fe5b3c..97261faa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ចូលគណនី…</translation> <translation id="2149973817440762519">កែប្រែចំណាំ</translation> <translation id="2175927920773552910">កូដ QR</translation> -<translation id="2198757192731523470">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក។</translation> <translation id="2218443599109088993">បង្រួម</translation> <translation id="2230173723195178503">បានផ្ទុកគេហទំព័រ</translation> <translation id="2239626343334228536">កំពុងសម្អាតទិន្នន័យរុករក...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ស្វែងរកក្នុងទំព័រ</translation> <translation id="4049507953662678203">សូមប្រាកដថាអ្នកមានការតភ្ជាប់បណ្តាញ ហើយសូមព្យាយាមម្តងទៀត។</translation> <translation id="4079195788735381731">ស្ថាប័នរបស់អ្នកបាននាំអ្នកចេញពីគណនី</translation> -<translation id="4082688844002261427">គ្រប់គ្រងរបៀបដែលប្រវត្តិរុករករបស់អ្នកត្រូវបានប្រើ ដើម្បីកំណត់ឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងអ្វីៗជាច្រើនទៀតស្របនឹងអ្នក</translation> <translation id="408404951701638773">ឥឡូវនេះ របារស្វែងរកផ្ដល់ភាពងាយស្រួលក្នុងការចូលប្រើជាងមុន</translation> <translation id="411254640334432676">ការទាញយកបានបរាជ័យ។</translation> <translation id="4112644173421521737">ស្វែងរក</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">វាអនុញ្ញាតឲ្យអ្នករកមើលគេហទំព័រដែលពាក់ព័ន្ធដោយផ្អែកលើរបស់ជុំវិញខ្លួនអ្នក។</translation> <translation id="5758631781033351321">អ្នកនឹងឃើញបញ្ជីអានរបស់អ្នកនៅទីនេះ</translation> <translation id="5782227691023083829">កំពុងបកប្រែ...</translation> -<translation id="5797070761912323120">Google អាចនឹងប្រើប្រវត្តិរបស់អ្នក ដើម្បីធ្វើឱ្យការស្វែងរក ការផ្សាយពាណិជ្ជកម្ម និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក</translation> <translation id="5803566855766646066">តើអ្នកពិតជាចង់លុបកាតថ្មីនេះមែនឬ?</translation> <translation id="5812974770859303494">បញ្ចូលទៅ...</translation> <translation id="5816228676161003208">វាអនុញ្ញាតឲ្យអ្នកធ្វើការស្វែងរកលឿនជាងមុនដោយប្រើសំឡេងរបស់អ្នក។</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">អត្ថបទមិនទាន់អាន <ph name="UNREAD_COUNT" />។</translation> <translation id="7412027924265291969">បន្ត</translation> <translation id="7425346204213733349">ការផ្លាស់ប្តូរចំពោះចំណាំ ប្រវត្តិ ពាក្យសម្ងាត់ និងការកំណត់ផ្សេងទៀតរបស់អ្នកនឹងមិនត្រូវបានធ្វើសមកាលកម្មជាមួយគណនី Google របស់អ្នកទៀតទេ។ ទោះបីជាយ៉ាងណាក៏ដោយ ទិន្នន័យដែលមានសម្រាប់របស់អ្នកនឹងនៅតែផ្ទុកក្នុងគណនី Google របស់អ្នកដដែល។</translation> +<translation id="7431991332293347422">គ្រប់គ្រងរបៀបដែលប្រវត្តិរុករករបស់អ្នកត្រូវបានប្រើប្រាស់ ដើម្បីកំណត់ឱ្យការស្វែងរក និងអ្វីៗជាច្រើនទៀតស្របនឹងអ្នក</translation> <translation id="7435356471928173109">បានបិទដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> <translation id="7454057999980797137">រដ្ឋ / ប្រទេស</translation> <translation id="7456847797759667638">បើកទីតាំង...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 03f4207f..90a79c3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ಸೈನ್ ಇನ್…</translation> <translation id="2149973817440762519">ಬುಕ್ಮಾರ್ಕ್ ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="2175927920773552910">QR ಕೋಡ್</translation> -<translation id="2198757192731523470">Google ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ಬಳಸಬಹುದು.</translation> <translation id="2218443599109088993">ಝೂಮ್ ಔಟ್</translation> <translation id="2230173723195178503">ವೆಬ್ಪುಟ ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="2239626343334228536">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ಪುಟದಲ್ಲಿ ಹುಡುಕಿ</translation> <translation id="4049507953662678203">ನೀವು ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="4079195788735381731">ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನಿಮ್ಮನ್ನು ಸೈನ್ ಔಟ್ ಮಾಡಿದೆ</translation> -<translation id="4082688844002261427">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು, ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="408404951701638773">ಇದೀಗ ಹುಡುಕಾಟ ಪಟ್ಟಿಯನ್ನು ತಲುಪುವುದು ಸುಲಭವಾಗಿದೆ</translation> <translation id="411254640334432676">ಡೌನ್ಲೋಡ್ ವಿಫಲವಾಗಿದೆ.</translation> <translation id="4112644173421521737">ಹುಡುಕಿ</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">ನಿಮ್ಮ ಸುತ್ತಲಿನಲ್ಲಿರುವುದನ್ನು ಆಧರಿಸಿ, ಸಂಬಂಧಿಸಿದ ವೆಬ್ ಪುಟಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಇದು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.</translation> <translation id="5758631781033351321">ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿಯನ್ನು ಇಲ್ಲಿ ಕಾಣಬಹುದು</translation> <translation id="5782227691023083829">ಅನುವಾದ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> -<translation id="5797070761912323120">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು</translation> <translation id="5803566855766646066">ಈ ಹೊಸ ಕಾರ್ಡ್ ಅನ್ನು ತ್ಯಜಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?</translation> <translation id="5812974770859303494">ಇದಕ್ಕೆ ಸೇರಿಸಿ...</translation> <translation id="5816228676161003208">ಇದು ನಿಮ್ಮ ಧ್ವನಿ ಬಳಸಿಕೊಂಡು ವೇಗವಾಗಿ ಹುಡುಕಲು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ಓದದಿರುವ ಲೇಖನಗಳು.</translation> <translation id="7412027924265291969">ಮುಂದುವರಿಸಿ</translation> <translation id="7425346204213733349">ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಮಾಡಲಾಗುವ ಬದಲಾವಣೆಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಿಂಕ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಆದಾಗ್ಯೂ, ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿಯೇ ಇರುತ್ತದೆ.</translation> +<translation id="7431991332293347422">ಹುಡುಕಾಟ ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಹೇಗೆ ಬಳಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="7435356471928173109">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಆಫ್ ಮಾಡಿದ್ದಾರೆ</translation> <translation id="7454057999980797137">ರಾಜ್ಯ / ಕೌಂಟಿ</translation> <translation id="7456847797759667638">ಸ್ಥಳವನ್ನು ತೆರೆ...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index a8ba6f37..7a35692 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">로그인…</translation> <translation id="2149973817440762519">북마크 수정</translation> <translation id="2175927920773552910">QR 코드</translation> -<translation id="2198757192731523470">Google에서 검색, 광고 및 다른 Google 서비스를 맞춤설정하기 위하여 내 방문 기록을 사용할 수 있습니다.</translation> <translation id="2218443599109088993">축소</translation> <translation id="2230173723195178503">웹페이지 로드됨</translation> <translation id="2239626343334228536">인터넷 사용 기록 삭제 중...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">페이지에서 찾기</translation> <translation id="4049507953662678203">네트워크에 연결되었는지 확인한 후 다시 시도해 주세요.</translation> <translation id="4079195788735381731">조직에서 나를 로그아웃시킴</translation> -<translation id="4082688844002261427">Google 검색, 광고 등을 맞춤설정하는 데 인터넷 방문 기록이 사용되는 방식 관리</translation> <translation id="408404951701638773">검색창을 사용하기가 더욱 쉬워졌습니다.</translation> <translation id="411254640334432676">다운로드에 실패했습니다.</translation> <translation id="4112644173421521737">검색</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">이를 통해 사용자의 주변 환경을 토대로 관련 웹 페이지를 발견할 수 있습니다.</translation> <translation id="5758631781033351321">여기에서 읽기 목록을 확인할 수 있습니다</translation> <translation id="5782227691023083829">번역 중...</translation> -<translation id="5797070761912323120">Google에서 내 방문 기록을 사용하여 Google 검색, 광고 및 다른 Google 서비스를 맞춤설정할 수 있습니다.</translation> <translation id="5803566855766646066">새 카드를 삭제하시겠습니까?</translation> <translation id="5812974770859303494">추가할 위치…</translation> <translation id="5816228676161003208">액세스를 허용하면 음성으로 더 빨리 검색할 수 있습니다.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">읽지 않은 기사 <ph name="UNREAD_COUNT" />개 있음</translation> <translation id="7412027924265291969">계속</translation> <translation id="7425346204213733349">북마크, 방문 기록, 비밀번호, 기타 설정이 더 이상 Google 계정에 동기화되지 않습니다. 하지만 기존 데이터는 Google 계정에 계속 저장됩니다.</translation> +<translation id="7431991332293347422">검색 등을 맞춤설정하는 데 인터넷 방문 기록이 사용되는 방식 관리</translation> <translation id="7435356471928173109">관리자가 사용 중지했습니다.</translation> <translation id="7454057999980797137">도/군</translation> <translation id="7456847797759667638">위치 열기...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index a71d12c..57c1a0d7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Кирүү…</translation> <translation id="2149973817440762519">Кыстарманы түзөтүү</translation> <translation id="2175927920773552910">QR коду</translation> -<translation id="2198757192731523470">Издөө, жарнама жана башка Google кызматтарын жекечелештирүү үчүн, Google таржымалыңызды колдонушу мүмкүн.</translation> <translation id="2218443599109088993">Кичирейтүү</translation> <translation id="2230173723195178503">Веб баракча жүктөлдү</translation> <translation id="2239626343334228536">Серептөө дайындары тазаланууда…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Барактан табуу</translation> <translation id="4049507953662678203">Тармакка туташып турганыңызды текшерип, кайталап көрүңүз.</translation> <translation id="4079195788735381731">Уюмуңуздун саясатынан улам аккаунтуңуздан чыгып калдыңыз</translation> -<translation id="4082688844002261427">Издөөнү, жарнамаларды жана башка кызматтарды жекечелештирүү үчүн серептөө таржымалыңыз кандайча пайдаланыларын көзөмөлдөңүз</translation> <translation id="408404951701638773">Издөө тилкесине өтүү оңой болуп калды</translation> <translation id="411254640334432676">Жүктөлүп алынбай калды.</translation> <translation id="4112644173421521737">Издөө</translation> @@ -407,6 +405,7 @@ <translation id="5197255632782567636">Интернет</translation> <translation id="5210365745912300556">Өтмөктү жабуу</translation> <translation id="5228579091201413441">Шайкештирүүнү иштетүү</translation> +<translation id="5232485538978018676">Башкарылган аккаунт менен кирүү</translation> <translation id="5234764350956374838">Этибарга албоо</translation> <translation id="5245322853195994030">Шайкештештирүүнү жокко чыгаруу</translation> <translation id="5271549068863921519">Сырсөздү сактоо</translation> @@ -452,7 +451,6 @@ <translation id="5738887413654608789">Бул айланаңыздагы колдонмолордун негизинде ылайыктуу веб беттерди таап берет.</translation> <translation id="5758631781033351321">Окула тургандардын тизмесин ушул жерден табасыз</translation> <translation id="5782227691023083829">Которулууда...</translation> -<translation id="5797070761912323120">Издөө, жарнама жана башка Google кызматтарын жекечелештирүү үчүн, Google таржымалыңызды колдонушу мүмкүн</translation> <translation id="5803566855766646066">Бул жаңы картаны чын эле өчүрөсүзбү?</translation> <translation id="5812974770859303494">Төмөнкүгө кошуу...</translation> <translation id="5816228676161003208">Бул үнүңүз менен издөөнү тездетүүгө жол ачат.</translation> @@ -649,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> окула элек макала.</translation> <translation id="7412027924265291969">Улантуу</translation> <translation id="7425346204213733349">Кыстармаларыңызга, таржымалыңызга, сырсөздөрүңүзгө жана башка жөндөөлөргө киргизилген өзгөрүүлөр Google Аккаунтуңуз менен шайкештирилбейт. Ал эми учурдагы дайын-даректериңиз Google Аккаунтуңузде сакталып кала берет.</translation> +<translation id="7431991332293347422">Издөөнү жана башка кызматтарды жекечелештирүү үчүн серептөө таржымалыңыз кандайча пайдаланыларын көзөмөлдөңүз</translation> <translation id="7435356471928173109">Администраторуңуз өчүрүп койду</translation> <translation id="7454057999980797137">Өлкө/Округ</translation> <translation id="7456847797759667638">Жайгашкан жерди ачуу…</translation> @@ -723,6 +722,7 @@ <translation id="8206354486702514201">Бул жөндөөнү администраторуңуз күчүнө киргизген.</translation> <translation id="8225985093977202398">Кештелген сүрөттөр жана файлдар</translation> <translation id="8261506727792406068">Жок кылуу</translation> +<translation id="8271720166617117963">Кабыл алуу жана кирүү</translation> <translation id="8281781826761538115">Демейки - <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">Өткөрүп жиберүү</translation> <translation id="8283172974887967105">Коюу…</translation> @@ -765,6 +765,7 @@ <translation id="8654802032646794042">Жокко чыгаруу</translation> <translation id="8668210798914567634">Бул барак Окуу тизмеңизге сакталды.</translation> <translation id="8680787084697685621">Аккаунтка кирүү чоо-жайлары эскирип калды.</translation> +<translation id="8691262314411702087">Шайкештештириле турган нерселерди тандоо</translation> <translation id="8693663554456874301">{count,plural, =1{Өтмөктү жабуу}other{Өтмөктөрдү жабуу}}</translation> <translation id="8706588385081740091">Сырсөздөр</translation> <translation id="8717864919010420084">Шилтемени көчүрүү</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index c1c21a0..e8e34a8c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ເຂົ້າສູ່ລະບົບ…</translation> <translation id="2149973817440762519">ແກ້ໄຂບຸກມາກສ໌</translation> <translation id="2175927920773552910">ລະຫັດ QR</translation> -<translation id="2198757192731523470">Google ອາດຈະໃຊ້ປະຫວັດຂອງທ່ານເພື່ອປັບແຕ່ງການຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນຂອງ Google.</translation> <translation id="2218443599109088993">ຊູມອອກ</translation> <translation id="2230173723195178503">ໂຫຼດໜ້າເວັບແລ້ວ</translation> <translation id="2239626343334228536">ກຳລັງລຶບລ້າງຂໍ້ມູນທ່ອງເວັບ...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ຊອກຫາໃນໜ້າ</translation> <translation id="4049507953662678203">ກະລຸນາກວດສອບວ່າທ່ານມີການເຊື່ອມຕໍ່ເຄືອຂ່າຍ ແລ້ວລອງອີກຄັ້ງ.</translation> <translation id="4079195788735381731">ອົງການຂອງທ່ານໄດ້ນຳທ່ານອອກຈາກລະບົບແລ້ວ</translation> -<translation id="4082688844002261427">ຄວບຄຸມວ່າຈະໃຫ້ໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານແນວໃດເພື່ອປັບແຕ່ງການຊອກຫາ, ໂຄສະນາ ແລະ ອື່ນໆອີກໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="408404951701638773">ດຽວນີ້ເຂົ້າຫາແຖບຊອກຫາໄດ້ງ່າຍກວ່າ</translation> <translation id="411254640334432676">ດາວໂຫລດບໍ່ສໍາເລັດ.</translation> <translation id="4112644173421521737">ຊອກຫາ</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">ນີ້ໃຫ້ທ່ານຄົ້ນພົບໜ້າເວັບທີ່ກ່ຽວຂ້ອງອີງຕາມສິ່ງທີ່ຢູ່ອ້ອມຮອບຕົວທ່ານ.</translation> <translation id="5758631781033351321">ທ່ານຈະເຫັນລາຍການອື່ນຂອງທ່ານຢູ່ບ່ອນນີ້</translation> <translation id="5782227691023083829">ກໍາລັງແປ...</translation> -<translation id="5797070761912323120">Google ອາດຈະໃຊ້ປະຫວັດຂອງທ່ານເພື່ອປັບແຕ່ງຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນຂອງ Google</translation> <translation id="5803566855766646066">ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການປະຖິ້ມບັດໃໝ່ນີ້?</translation> <translation id="5812974770859303494">ເພີ່ມໃສ່...</translation> <translation id="5816228676161003208">ນີ້ອະນຸຍາດໃຫ້ທ່ານຊອກຫາໄດ້ໄວຂຶ້ນໂດຍໃຊ້ສຽງຂອງທ່ານ.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ບົດຄວາມທີ່ຍັງບໍ່ໄດ້ອ່ານ.</translation> <translation id="7412027924265291969">ສືບຕໍ່</translation> <translation id="7425346204213733349">ການປ່ຽນແປງຕໍ່ກັບບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ການຕັ້ງຄ່າອື່ນຂອງທ່ານຈະບໍ່ຖືກຊິ້ງກັບບັນຊີ Google ຂອງທ່ານອີກຕໍ່ໄປ. ແນວໃດກໍຕາມ, ຂໍ້ມູນທີ່ມີຢູ່ຂອງທ່ານຈະຍັງຄົງເກັບຮັກສາໄວ້ໃນບັນຊີ Google ຂອງທ່ານ.</translation> +<translation id="7431991332293347422">ຄວບຄຸມວ່າຈະໃຫ້ໃຊ້ປະຫວັດການທ່ອງເວັບຂອງທ່ານແນວໃດເພື່ອປັບແຕ່ງການຊອກຫາ ແລະ ອື່ນໆອີກໃຫ້ເປັນແບບສ່ວນຕົວ</translation> <translation id="7435356471928173109">ປິດໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ</translation> <translation id="7454057999980797137">ລັດ / ຄາວຕີ້</translation> <translation id="7456847797759667638">ເປີດສະຖານທີ່...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 208b1b2..04e9bf8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Prisijungti…</translation> <translation id="2149973817440762519">Redaguoti žymes</translation> <translation id="2175927920773552910">QR kodas</translation> -<translation id="2198757192731523470">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas.</translation> <translation id="2218443599109088993">Tolinti</translation> <translation id="2230173723195178503">TInklalapis įkeltas</translation> <translation id="2239626343334228536">Išvalomi naršymo duomenis...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Rasti puslapyje</translation> <translation id="4049507953662678203">Įsitikinkite, kad yra tinklo ryšys ir bandykite dar kartą.</translation> <translation id="4079195788735381731">Jūsų organizacija jus atjungė</translation> -<translation id="4082688844002261427">Naršymo istorijos naudojimo paieškai, skelbimams ir kitoms funkcijoms suasmeninti valdymas</translation> <translation id="408404951701638773">Dabar paieškos juostą pasiekti lengviau</translation> <translation id="411254640334432676">Nepavyko atsisiųsti.</translation> <translation id="4112644173421521737">Ieškoti</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Tai naudodami galite atrasti aktualių tinklalapių, kurie teikiami atsižvelgiant į aplinką.</translation> <translation id="5758631781033351321">Čia rasite skaitymo sąrašą</translation> <translation id="5782227691023083829">Verčiama...</translation> -<translation id="5797070761912323120">„Google“ gali naudoti jūsų istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas</translation> <translation id="5803566855766646066">Ar tikrai norite atmesti šią naują kortelę?</translation> <translation id="5812974770859303494">Pridėjimas prie...</translation> <translation id="5816228676161003208">Galite ieškoti greičiau balsu.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Neskaitytų straipsnių: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Tęsti</translation> <translation id="7425346204213733349">Žymių, istorijos, slaptažodžių ir kitų nustatymų pakeitimai nebebus sinchronizuojami su „Google“ paskyra. Tačiau esami duomenys ir toliau bus saugomi „Google“ paskyroje.</translation> +<translation id="7431991332293347422">Naršymo istorijos naudojimo paieškai ir kitoms funkcijoms suasmeninti valdymas</translation> <translation id="7435356471928173109">Išjungė jūsų administratorius</translation> <translation id="7454057999980797137">Valst. / apyg.</translation> <translation id="7456847797759667638">Atidaryti vietą...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index be05b1f..c68a25a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Pierakstīties…</translation> <translation id="2149973817440762519">Rediģēt grāmatzīmes</translation> <translation id="2175927920773552910">QR kods</translation> -<translation id="2198757192731523470">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus.</translation> <translation id="2218443599109088993">Tālināt</translation> <translation id="2230173723195178503">Tīmekļa lapa ielādēta</translation> <translation id="2239626343334228536">Notiek pārlūkošanas datu notīrīšana…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Atrast lapā</translation> <translation id="4049507953662678203">Pārbaudiet, vai ir izveidots tīkla savienojums, un mēģiniet vēlreiz.</translation> <translation id="4079195788735381731">Jūs izrakstīja jūsu organizācija</translation> -<translation id="4082688844002261427">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota, lai personalizētu meklēšanu, reklāmas un citu saturu</translation> <translation id="408404951701638773">Tagad meklēšanas josla ir ērtāk sasniedzama</translation> <translation id="411254640334432676">Lejupielāde neizdevās.</translation> <translation id="4112644173421521737">Meklēt</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Tādējādi varat atklāt atbilstošas tīmekļa lapas, pamatojoties uz datiem par jūsu apkārtni.</translation> <translation id="5758631781033351321">Šeit varēsiet skatīt savu lasīšanas sarakstu</translation> <translation id="5782227691023083829">Notiek tulkošana...</translation> -<translation id="5797070761912323120">Google var izmantot jūsu vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus.</translation> <translation id="5803566855766646066">Vai tiešām vēlaties atmest jauno kartīti?</translation> <translation id="5812974770859303494">Pievienot...</translation> <translation id="5816228676161003208">Varat meklēt ātrāk, izmantojot balsi.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Nelasīti raksti: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Turpināt</translation> <translation id="7425346204213733349">Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas ar jūsu Google kontu. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā.</translation> +<translation id="7431991332293347422">Kontrolējiet, kā jūsu pārlūkošanas vēsture tiek izmantota Meklēšanas un cita satura personalizēšanai</translation> <translation id="7435356471928173109">Izslēdza jūsu administrators</translation> <translation id="7454057999980797137">Štats/valsts</translation> <translation id="7456847797759667638">Atvērt atrašanās vietu...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index b81f0a5c..79a25f1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Најавете се…</translation> <translation id="2149973817440762519">Измени Обележувач</translation> <translation id="2175927920773552910">QR-код</translation> -<translation id="2198757192731523470">Google може да ја користи вашата историја за да го персонализира „Пребарувањето“, рекламите и другите услуги на Google.</translation> <translation id="2218443599109088993">Одзумирај</translation> <translation id="2230173723195178503">Веб-страницата е вчитана</translation> <translation id="2239626343334228536">Се чистат податоците од прелистувањето…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Пронајдете на страницата</translation> <translation id="4049507953662678203">Проверете дали имате мрежна врска и обидете се повторно.</translation> <translation id="4079195788735381731">Вашата организација ве одјави</translation> -<translation id="4082688844002261427">Контролирајте како да се користи вашата историја на прелистување за персонализација на „Пребарување“, рекламите и друго</translation> <translation id="408404951701638773">Сега е полесно да се дојде до лентата за пребарување</translation> <translation id="411254640334432676">Преземањето не успеа.</translation> <translation id="4112644173421521737">Пребарај</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Ова ви овозможува да откриете релевантни веб-страници врз основа на вашата околина.</translation> <translation id="5758631781033351321">Списокот за читање ќе го најдете тука</translation> <translation id="5782227691023083829">Се преведува…</translation> -<translation id="5797070761912323120">Google може да ја користи вашата историја за да го персонализира „Пребарувањето“, рекламите и другите услуги на Google</translation> <translation id="5803566855766646066">Дали сигурно сакате да ја отфрлите новава картичка?</translation> <translation id="5812974770859303494">Додај во…</translation> <translation id="5816228676161003208">Ова ви овозможува да пребарувате побрзо со глас.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> непрочитани статии.</translation> <translation id="7412027924265291969">Продолжи</translation> <translation id="7425346204213733349">Промените во обележувачите, историјата, лозинките и другите поставки нема веќе да се синхронизираат со вашата сметка на Google. Како и да е, постоечките податоци ќе останат зачувани на сметката на Google.</translation> +<translation id="7431991332293347422">Контролирајте како вашата историја на прелистување се користи за персонализирање на „Пребарувањето“ и друго</translation> <translation id="7435356471928173109">Исклучено од администраторот</translation> <translation id="7454057999980797137">Држава/Земја</translation> <translation id="7456847797759667638">Отвори локација...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 2ab3ce21..8faf3519 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">സൈൻ ഇൻ ചെയ്യുക…</translation> <translation id="2149973817440762519">ബുക്മാര്ക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="2175927920773552910">QR കോഡ്</translation> -<translation id="2198757192731523470">തിരയലും പരസ്യങ്ങളും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ, Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം.</translation> <translation id="2218443599109088993">സൂം ഔട്ട് ചെയ്യുക</translation> <translation id="2230173723195178503">വെബ്പേജ് ലോഡ് ചെയ്തു</translation> <translation id="2239626343334228536">ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കുന്നു...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">പേജില് കണ്ടെത്തുക</translation> <translation id="4049507953662678203">നിങ്ങൾക്ക് നെറ്റ്വർക്ക് കണക്ഷനുണ്ടെന്ന് ഉറപ്പാക്കി, വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4079195788735381731">നിങ്ങളുടെ സ്ഥാപനം നിങ്ങളെ സൈൻ ഔട്ട് ചെയ്തു</translation> -<translation id="4082688844002261427">തിരയൽ, പരസ്യങ്ങൾ എന്നിവയും മറ്റും വ്യക്തിപരമാക്കുന്നതിനായി നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="408404951701638773">തിരയൽ ബാറിൽ എത്താൻ ഇപ്പോൾ എളുപ്പമാണ്</translation> <translation id="411254640334432676">ഡൗൺലോഡ് പരാജയപ്പെട്ടു.</translation> <translation id="4112644173421521737">Search</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">നിങ്ങളുടെ ചുറ്റുമുള്ള കാര്യങ്ങളെ അടിസ്ഥാനമാക്കി ആനുകാലികമായ വെബ് പേജുകൾ കണ്ടെത്താൻ ഇത് നിങ്ങളെ അനുവദിക്കുന്നു.</translation> <translation id="5758631781033351321">നിങ്ങളുടെ വായനാ ലിസ്റ്റ് ഇവിടെ കാണാം</translation> <translation id="5782227691023083829">വിവര്ത്തനം ചെയ്യുന്നു...</translation> -<translation id="5797070761912323120">തിരയലും പരസ്യവും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation> <translation id="5803566855766646066">ഈ പുതിയ കാർഡ് റദ്ദാക്കണമെന്ന് തീർച്ചയാണോ?</translation> <translation id="5812974770859303494">ഇതിലേക്ക് ചേർക്കുക…</translation> <translation id="5816228676161003208">നിങ്ങളുടെ ശബ്ദം ഉപയോഗിച്ച് കൂടുതൽ വേഗത്തിൽ തിരയാൻ ഇത് നിങ്ങളെ അനുവദിക്കുന്നു.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906">വായിക്കാത്ത <ph name="UNREAD_COUNT" /> ലേഖനങ്ങൾ.</translation> <translation id="7412027924265291969">തുടരുക</translation> <translation id="7425346204213733349">ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയിലുള്ള മാറ്റങ്ങളെ ഇനി നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കില്ല. എന്നിരുന്നാലും, നിങ്ങളുടെ നിലവിലെ വിവരം Google അക്കൗണ്ടിൽ തുടർന്നും സൂക്ഷിക്കും.</translation> +<translation id="7431991332293347422">തിരയലും മറ്റും വ്യക്തിപരമാക്കുന്നതിന് നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുന്ന വിധം നിയന്ത്രിക്കുക</translation> <translation id="7435356471928173109">നിങ്ങളുടെ അഡ്മിൻ ഓഫാക്കിയിരിക്കുന്നു</translation> <translation id="7454057999980797137">സംസ്ഥാനം / രാജ്യം</translation> <translation id="7456847797759667638">സ്ഥാനം തുറക്കുക...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 0087eb7..62a6ae723 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Нэвтрэх…</translation> <translation id="2149973817440762519">Хадгалагдсан хуудсыг засах</translation> <translation id="2175927920773552910">QR код</translation> -<translation id="2198757192731523470">Google таны түүхийг хайлт, зар болон Google-н бусад үйлчилгээг хувийн болгохын тулд ашиглаж болзошгүй.</translation> <translation id="2218443599109088993">Жижигрүүлэх</translation> <translation id="2230173723195178503">Веб хуудсыг ачаалласан</translation> <translation id="2239626343334228536">Хөтчийн өгөгдлийг устгаж байна...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Хуудаснаас хайх</translation> <translation id="4049507953662678203">Сүлжээнд холбогдсон эсэхээ шалгаад, дахин оролдоно уу.</translation> <translation id="4079195788735381731">Танай байгууллага таныг гаргасан</translation> -<translation id="4082688844002261427">Таны хөтчийн түүхийг Хайлт, зар болон бусад үйлчилгээг хувийн болгоход хэрхэн ашигладгийг хянаарай</translation> <translation id="408404951701638773">Хайлтын талбарыг ашиглахад илүү хялбар боллоо</translation> <translation id="411254640334432676">Татаж авах үйлдэл амжилгүй болсон байна.</translation> <translation id="4112644173421521737">Хайх</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">Та үүгээр ойролцоох хамааралтай веб хуудсыг олох боломжтой.</translation> <translation id="5758631781033351321">Та унших жагсаалтаа эндээс олох болно</translation> <translation id="5782227691023083829">Орчуулж байна...</translation> -<translation id="5797070761912323120">Google таны түүхийг Хайлт, зар болон Google-н бусад үйлчилгээг хувийн болгох зорилгоор ашиглаж болзошгүй</translation> <translation id="5803566855766646066">Та энэ шинэ картыг устгахдаа итгэлтэй байна уу?</translation> <translation id="5812974770859303494">Дараахад нэмэх...</translation> <translation id="5816228676161003208">Энэ нь танд дуу хоолойгоороо хурдан хайх боломжийг олгодог.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906">Уншаагүй <ph name="UNREAD_COUNT" /> нийтлэл.</translation> <translation id="7412027924265291969">Үргэлжлүүлэх</translation> <translation id="7425346204213733349">Таны хавчуурга, түүх, нууц үг, бусад тохиргоонд хийсэн өөрчлөлтийг цаашид таны Google Бүртгэлд синк хийхгүй. Харин таны одоо байгаа өгөгдлийг Google бүртгэлд хадгалах болно.</translation> +<translation id="7431991332293347422">Таны хайлтын түүх Хайлт болон бусад зүйлийг хувийн болгоход хэрхэн ашигладгийг хянах</translation> <translation id="7435356471928173109">Танай администратор идэвхгүй болгосон</translation> <translation id="7454057999980797137">Улс / Муж</translation> <translation id="7456847797759667638">Байршлыг нээ...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index c3cc410e..96d7e0d3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">साइन इन करा…</translation> <translation id="2149973817440762519">बुकमार्क संपादित करा</translation> <translation id="2175927920773552910">QR कोड</translation> -<translation id="2198757192731523470">शोध, जाहिरात आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते.</translation> <translation id="2218443599109088993">झूम आउट करा</translation> <translation id="2230173723195178503">वेबपेज लोड केले</translation> <translation id="2239626343334228536">ब्राउझिंग डेटा साफ करत आहे...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">पेजमध्ये शोधा</translation> <translation id="4049507953662678203">आपल्याकडे नेटवर्क कनेक्शन आहे हे सुनिश्चित करा आणि पुन्हा प्रयत्न करा.</translation> <translation id="4079195788735381731">तुमच्या संस्थेने तुम्हाला साइन आउट केले</translation> -<translation id="4082688844002261427">तुमचा ब्राउझिंग इतिहास शोध, जाहिराती आणि बरेच काही पर्सनलाइझ करण्यासाठी कसा वापरला जातो ते नियंत्रित करा</translation> <translation id="408404951701638773">शोध बारवर पोहोचणे आता आणखी सोपे आहे</translation> <translation id="411254640334432676">डाउनलोड अयशस्वी.</translation> <translation id="4112644173421521737">Search</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">हे तुम्हाला आपल्या सभोवतालच्या गोष्टींवर आधारित संबंधित वेब पेज शोधू देते.</translation> <translation id="5758631781033351321">तुमची वाचन सूची तुम्हाला येथे सापडेल</translation> <translation id="5782227691023083829">भाषांतर करीत आहे...</translation> -<translation id="5797070761912323120">शोध, जाहिरात आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी Google कदाचित तुमच्या इतिहासाचा वापर करू शकते</translation> <translation id="5803566855766646066">तुम्हाला हे नवीन कार्ड नक्की काढून टाकायचे आहे का?</translation> <translation id="5812974770859303494">यामध्ये जोडा...</translation> <translation id="5816228676161003208">हे तुम्हाला तुमचा व्हॉइस वापरून अधिक जलद शोधू देते.</translation> @@ -651,6 +648,7 @@ <translation id="7409985198648820906">न वाचलेले <ph name="UNREAD_COUNT" /> लेख.</translation> <translation id="7412027924265291969">पुढे सुरू ठेवा</translation> <translation id="7425346204213733349">तुमचे बुकमार्क, इतिहास, पासवर्ड आणि अन्य सेटिंग्ज मधील बदल यापुढे आपल्या Google खात्यावर संकालित केले जाणार नाहीत. तथापि, तुमचा विद्यमान डेटा आपल्या Google खात्यामध्ये संचयित केलेला असेल.</translation> +<translation id="7431991332293347422">शोध पर्सनलाइझ करण्यासाठी तुमचा ब्राउझिंग इतिहास कसा वापरला जातो ते आणि बरेच काही नियंत्रित करा</translation> <translation id="7435356471928173109">तुमच्या अॅडमिनिस्ट्रेटरने बंद केले</translation> <translation id="7454057999980797137">राज्य / विभाग</translation> <translation id="7456847797759667638">स्थान उघडा...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 56d0e5f..d7ff5dd8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Log Masuk…</translation> <translation id="2149973817440762519">Edit Penanda Halaman</translation> <translation id="2175927920773552910">Kod QR</translation> -<translation id="2198757192731523470">Google boleh menggunakan sejarah anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain.</translation> <translation id="2218443599109088993">Zum Keluar</translation> <translation id="2230173723195178503">Halaman web dimuatkan</translation> <translation id="2239626343334228536">Mengosongkan data semakan imbas...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Cari dalam Halaman</translation> <translation id="4049507953662678203">Pastikan anda mempunyai sambungan rangkaian dan cuba lagi.</translation> <translation id="4079195788735381731">Anda telah dilog keluar oleh organisasi anda</translation> -<translation id="4082688844002261427">Kawal cara sejarah penyemakan imbas anda digunakan untuk memperibadikan Carian, iklan dan pelbagai lagi</translation> <translation id="408404951701638773">Kini bar Carian lebih mudah dicapai</translation> <translation id="411254640334432676">Muat turun gagal.</translation> <translation id="4112644173421521737">Cari</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Langkah ini membolehkan anda menemui halaman web yang berkaitan berdasarkan persekitaran anda.</translation> <translation id="5758631781033351321">Anda dapat menemukan senarai bacaan anda di sini</translation> <translation id="5782227691023083829">Menterjemahkan…</translation> -<translation id="5797070761912323120">Google boleh menggunakan sejarah anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain</translation> <translation id="5803566855766646066">Adakah anda pasti anda mahu membuang kad baharu ini?</translation> <translation id="5812974770859303494">Tambahkan pada...</translation> <translation id="5816228676161003208">Langkah ini membolehkan anda mencari dengan lebih cepat menggunakan suara anda.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artikel belum dibaca.</translation> <translation id="7412027924265291969">Teruskan</translation> <translation id="7425346204213733349">Perubahan kepada penanda halaman, sejarah, kata laluan dan tetapan anda yang lain tidak akan disegerakkan ke Akaun Google anda lagi. Walau bagaimanapun, data sedia ada akan kekal disimpan dalam Akaun Google anda.</translation> +<translation id="7431991332293347422">Kawal cara sejarah penyemakan imbas anda digunakan untuk memperibadikan Carian dan pelbagai lagi</translation> <translation id="7435356471928173109">Dimatikan oleh pentadbir anda</translation> <translation id="7454057999980797137">Negeri / Daerah</translation> <translation id="7456847797759667638">Buka Lokasi...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 9f81e221..8d57e9b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">လက်မှတ်ထိုးဝင်ရန်…</translation> <translation id="2149973817440762519">စာညှပ် တည်းဖြတ်ရန်</translation> <translation id="2175927920773552910">QR ကုဒ်</translation> -<translation id="2198757192731523470">Search၊ ကြော်ငြာနှင့် အခြား Google ဝန်ဆောင်မှုများအား ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် Google သည် သင့်အင်တာနက်အသုံးပြုမှုမှတ်တမ်းကို သုံးနိုင်သည်။</translation> <translation id="2218443599109088993">ဇူးမ်ဖြုတ်ရန်</translation> <translation id="2230173723195178503">ဝဘ်စာမျက်နှာကို ဖွင့်ပြီးပါပြီ</translation> <translation id="2239626343334228536">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာများ ဖယ်ရှားနေသည်…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">စာမျက်နှာတွင် ရှာရန်</translation> <translation id="4049507953662678203">ကွန်ယက်ချိတ်ဆက်မှု ရှိမရှိသေချာစေပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="4079195788735381731">သင့်အဖွဲ့အစည်းက သင့်ကို အကောင့်မှထွက်သွားစေသည်</translation> -<translation id="4082688844002261427">Search၊ ကြော်ငြာနှင့် အခြားအရာများကို ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်ရာတွင် ကြည့်ရှုခြင်းမှတ်တမ်းအား အသုံးပြုပုံကို ထိန်းချုပ်သည်</translation> <translation id="408404951701638773">ရှာဖွေမှုဘားတန်းကို ယခုအခါ ပိုမိုလွယ်ကူစွာ အသုံးပြုနိုင်ပါပြီ</translation> <translation id="411254640334432676">ဒေါင်းလုဒ် မအောင်မြင်ခဲ့</translation> <translation id="4112644173421521737">ရှာဖွေရန်</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">ဤနည်းဖြင့် သင့်ပတ်ဝန်းကျင်ကိုလိုက်၍ သက်ဆိုင်ရာအင်တာနက်စာမျက်နှာများကို ရှာဖွေနိုင်ပါသည်။</translation> <translation id="5758631781033351321">သင့်ဖတ်ရန်စာရင်းကို ဤနေရာတွင် ပြပါမည်</translation> <translation id="5782227691023083829">ဘာသာပြန်နေသည်...</translation> -<translation id="5797070761912323120">Search၊ ကြော်ငြာနှင့် အခြား Google ဝန်ဆောင်မှုများအား ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် Google က သင့်မှတ်တမ်းကို သုံးနိုင်သည်</translation> <translation id="5803566855766646066">ဤကတ်အသစ်ကို ဖယ်ပစ်လိုသည်မှာ သေချာသလား။</translation> <translation id="5812974770859303494">ထည့်မည့်နေရာ...</translation> <translation id="5816228676161003208">၎င်းသည် သင့်အသံကို အသုံးပြု၍ ရှာဖွေရာတွင် ပိုမိုမြန်ဆန်စေပါသည်။</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906">မဖတ်ရသေးသော ဆောင်းပါး <ph name="UNREAD_COUNT" /> ခု။</translation> <translation id="7412027924265291969">ရှေ့ဆက်ရန်</translation> <translation id="7425346204213733349">သင့်စာညှပ်များ၊ မှတ်တမ်း၊ စကားဝှက်များနှင့် အခြားဆက်တင်များအပေါ် ပြောင်းလဲခြင်းများကို သင့် Google Account သို့စင့်ခ်လုပ်တော့မည် မဟုတ်ပါ။ သို့သော်၊ သင့်လက်ရှိဒေတာများကိုတော့ သင့် Google Account တွင်ဆက်လက်သိမ်းဆည်းထားပါမည်။</translation> +<translation id="7431991332293347422">Search နှင့် အခြားအရာများကို ပုဂ္ဂိုလ်ရေးသီးသန့် သတ်မှတ်ရန်အတွက် အသုံးပြုမှုမှတ်တမ်းအား မည်သို့အသုံးချကြောင်း ထိန်းချုပ်ပါ</translation> <translation id="7435356471928173109">သင်၏စီမံခန့်ခွဲသူက ပိတ်ထားသည်</translation> <translation id="7454057999980797137">ပြည်နယ် / ကောင်တီ</translation> <translation id="7456847797759667638">တည်နေရာ ဖွင့်ရန်...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 57eb5b7..b0bb64e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">साइन इन गर्नुहोस्…</translation> <translation id="2149973817440762519">बुकमार्क सम्पादन गर्नुहोस्</translation> <translation id="2175927920773552910">QR कोड</translation> -<translation id="2198757192731523470">Google ले खोज, विज्ञापनहरू र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको इतिहाससम्बन्धी जानकारी प्रयोग गर्न सक्छ।</translation> <translation id="2218443599109088993">जुम घटाउनुहोस्</translation> <translation id="2230173723195178503">वेबपृष्ठ लोड गरियो</translation> <translation id="2239626343334228536">ब्राउजिङ डेटा खाली गर्दै...</translation> @@ -154,7 +153,7 @@ <translation id="2647269890314209800">प्रयोगमा रहेका कुकीहरू</translation> <translation id="2648803196158606475">पढिसकिएकोलाई मेट्नुहोस्</translation> <translation id="2653659639078652383">पेश गर्नुहोस्</translation> -<translation id="2690858294534178585">क्यामेरा प्रयोगमा छ</translation> +<translation id="2690858294534178585">क्यामेरा प्रयोग भइरहेको छ</translation> <translation id="2691653761409724435">अफलाइन उपलब्ध छैन</translation> <translation id="2695507686909505111">पृष्ठ अनुवाद गरियो</translation> <translation id="2702801445560668637">पाठ्य सूची</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">पृष्ठमा खोज्नुहोस्</translation> <translation id="4049507953662678203">तपाईँसँग नेटवर्क जडान छ भनी निश्चित गर्नुहोस् र फेरि प्रयास गर्नुहोस्।</translation> <translation id="4079195788735381731">तपाईंको सङ्गठनको नीतिअनुसार तपाईं साइन आउट हुनुभएको छ</translation> -<translation id="4082688844002261427">खोज, विज्ञापन र थप कुराहरू वैयक्तीकृत गर्ने प्रयोजनका लागि आफ्नो ब्राउजिङसम्बन्धी इतिहास प्रयोग गरिने तरिका नियन्त्रण गर्नुहोस्</translation> <translation id="408404951701638773">खोज पट्टीमा पुग्न अब सजिलो छ</translation> <translation id="411254640334432676">डाउनलोड असफल भयो।</translation> <translation id="4112644173421521737">खोज्नुहोस्</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">यसले तपाईं वरिपरिको परिवेशमा आधारित सान्दर्भिक वेब पृष्ठहरू पत्ता लगाउन अनुमति दिन्छ।</translation> <translation id="5758631781033351321">तपाईंको अध्ययन सूची यहाँ देखिने छ</translation> <translation id="5782227691023083829">अनुवाद गर्दै...</translation> -<translation id="5797070761912323120">Google ले खोज, विज्ञापन र Google का अन्य सेवाहरूलाई वैयक्तीकृत गर्न तपाईंको इतिहाससम्बन्धी जानकारी प्रयोग गर्न सक्छ</translation> <translation id="5803566855766646066">तपाईंले यो नयाँ कार्ड हटाउन खोज्नुभएकै हो?</translation> <translation id="5812974770859303494">यहाँ हाल्नुहोस्…</translation> <translation id="5816228676161003208">यसले तपाईँलाई आफ्नो आवाजको प्रयोग गरी अझ छिटो खोज्न दिन्छ।</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> वटा नपढिएका लेखहरू।</translation> <translation id="7412027924265291969">जारी राख्नुहोस्</translation> <translation id="7425346204213733349">तपाईँका पुस्तक चिन्ह, इतिहास, पासवर्ड र अन्य सेटिङहरूका परिवर्तनहरू अब उप्रान्त तपाईँको Google खातामा सिंक हुने छैनन्। तैपनि तपाईँको विद्यमान डेटा तपाईँको Google खातामा भण्डारण गरिएको अवस्थामा रहिरहनेछ।</translation> +<translation id="7431991332293347422">खोज र थप कुराहरू वैयक्तीकृत गर्ने प्रयोजनका लागि तपाईंको ब्राउजिङ इतिहासको प्रयोग गरिने तरिका नियन्त्रण गर्नुहोस्</translation> <translation id="7435356471928173109">तपाईंका एड्मिनले अफ गर्नुभएको</translation> <translation id="7454057999980797137">राज्य / काउन्टी</translation> <translation id="7456847797759667638">खुला स्थान...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index a9370b2..f721574 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Inloggen…</translation> <translation id="2149973817440762519">Bookmark bewerken</translation> <translation id="2175927920773552910">QR-code</translation> -<translation id="2198757192731523470">Google kan je geschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren.</translation> <translation id="2218443599109088993">Uitzoomen</translation> <translation id="2230173723195178503">Webpagina geladen</translation> <translation id="2239626343334228536">Browsegegevens wissen…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Zoeken op pagina</translation> <translation id="4049507953662678203">Zorg ervoor dat je beschikt over een netwerkverbinding en probeer het opnieuw.</translation> <translation id="4079195788735381731">Je organisatie heeft je uitgelogd</translation> -<translation id="4082688844002261427">Beheren hoe je browsegeschiedenis wordt gebruikt om Google Zoeken, advertenties en meer te personaliseren</translation> <translation id="408404951701638773">De zoekbalk is nu makkelijker bereikbaar</translation> <translation id="411254640334432676">Downloaden mislukt.</translation> <translation id="4112644173421521737">Zoeken</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Hiermee kun je relevante webpagina's vinden op basis van je omgeving.</translation> <translation id="5758631781033351321">Hier vind je je leeslijst</translation> <translation id="5782227691023083829">Vertalen...</translation> -<translation id="5797070761912323120">Google kan je geschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren</translation> <translation id="5803566855766646066">Weet je zeker dat je deze nieuwe kaart wilt sluiten?</translation> <translation id="5812974770859303494">Toevoegen aan…</translation> <translation id="5816228676161003208">Hiermee kun je sneller zoeken met je stem.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ongelezen artikelen.</translation> <translation id="7412027924265291969">Doorgaan</translation> <translation id="7425346204213733349">Wijzigingen in je bookmarks, geschiedenis, wachtwoorden en andere instellingen worden niet meer gesynchroniseerd met je Google-account. Je bestaande gegevens blijven echter opgeslagen in je Google-account.</translation> +<translation id="7431991332293347422">Beheren hoe je browsegeschiedenis wordt gebruikt om Google Zoeken en meer te personaliseren</translation> <translation id="7435356471928173109">Uitgezet door je beheerder</translation> <translation id="7454057999980797137">Provincie</translation> <translation id="7456847797759667638">Open locatie...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 53541f8..5911eda 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Logg på…</translation> <translation id="2149973817440762519">Rediger bokmerke</translation> <translation id="2175927920773552910">QR-kode</translation> -<translation id="2198757192731523470">Google kan bruke loggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg.</translation> <translation id="2218443599109088993">Zoom ut</translation> <translation id="2230173723195178503">Nettsiden er lastet inn</translation> <translation id="2239626343334228536">Sletter nettlesingsdata …</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Finn på siden</translation> <translation id="4049507953662678203">Sørg for at du er koblet til et nettverk, og prøv igjen.</translation> <translation id="4079195788735381731">Organisasjonen din har logget deg av</translation> -<translation id="4082688844002261427">Kontrollér hvordan nettleserloggen din brukes til personlig tilpasning av blant annet søk og annonser</translation> <translation id="408404951701638773">Søkefeltet er nå enklere å finne</translation> <translation id="411254640334432676">Nedlastingen mislyktes.</translation> <translation id="4112644173421521737">Søk</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Med denne kan du oppdage relevante nettsider basert på omgivelsene dine.</translation> <translation id="5758631781033351321">Her finner du leselisten din</translation> <translation id="5782227691023083829">Oversetter</translation> -<translation id="5797070761912323120">Google kan bruke loggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation> <translation id="5803566855766646066">Er du sikker på at du vil forkaste dette nye kortet?</translation> <translation id="5812974770859303494">Legg til i …</translation> <translation id="5816228676161003208">Dette gjør at du kan søke raskere ved å bruke stemmen.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> uleste artikler.</translation> <translation id="7412027924265291969">Fortsett</translation> <translation id="7425346204213733349">Endringer i bokmerkene, loggoppføringene, passordene og de andre innstillingene dine blir ikke synkronisert med Google-kontoen din lenger. Data som allerede er lagret i Google-kontoen din, blir imidlertid ikke fjernet.</translation> +<translation id="7431991332293347422">Kontrollér hvordan nettleserloggen din brukes til blant annet personlig tilpasning av søk</translation> <translation id="7435356471928173109">Slått av av administratoren din</translation> <translation id="7454057999980797137">Fylke/kommune</translation> <translation id="7456847797759667638">Åpne sted</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index a0e9f9b..15f6f29 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ସାଇନ୍ ଇନ୍ କରନ୍ତୁ…</translation> <translation id="2149973817440762519">ବୁକମାର୍କ୍ ସମ୍ପାଦନ କରନ୍ତୁ</translation> <translation id="2175927920773552910">QR କୋଡ୍</translation> -<translation id="2198757192731523470">ସନ୍ଧାନ, ବିଜ୍ଞାପନ, ଏବଂ ଅନ୍ୟାନ୍ୟ Google ସେବାକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ Google ଆପଣଙ୍କର ଇତିବୃତ୍ତିକୁ ବ୍ୟବହାର କରିପାରେ।</translation> <translation id="2218443599109088993">ଜୁମ୍ ଆଉଟ୍ କରନ୍ତୁ</translation> <translation id="2230173723195178503">ୱେବ୍ପୃଷ୍ଠା ଲୋଡ୍ କରାଗଲା</translation> <translation id="2239626343334228536">ବ୍ରାଇଜିଂ ଡାଟା ଖାଲି ହେଉଛି...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ପୃଷ୍ଠାରେ ଖୋଜନ୍ତୁ</translation> <translation id="4049507953662678203">ସୁନିଶ୍ଚିତ କରନ୍ତୁ ଯେ ଆପଣଙ୍କର ଏକ ନେଟ୍ୱର୍କ ସଂଯୋଗ ଅଛି ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4079195788735381731">ଆପଣଙ୍କ ସଂସ୍ଥା ଆପଣଙ୍କୁ ସାଇନ୍ ଆଉଟ୍ କରିଛି</translation> -<translation id="4082688844002261427">ଖୋଜିବା, ବିଜ୍ଞାପନ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି କିପରି ବ୍ୟବହାର ହେବ ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="408404951701638773">ବର୍ତ୍ତମାନ ସନ୍ଧାନ ବାର୍ ମିଳିବା ସହଜ ଅଟେ</translation> <translation id="411254640334432676">ଡାଉନ୍ଲୋଡ୍ ବିଫଳ ହୋଇଛି।</translation> <translation id="4112644173421521737">Search</translation> @@ -450,7 +448,6 @@ <translation id="5738887413654608789">ଏହା ଆପଣଙ୍କ ପରିବେଶ ଉପରେ ଆଧାର କରି ପ୍ରାସଙ୍ଗିକ ୱେବ୍ପୃଷ୍ଠା ଆବିଷ୍କାର କରିବାକୁ ଦିଏ।</translation> <translation id="5758631781033351321">ଆପଣ ଏଠାରେ ଆପଣଙ୍କ ପଢ଼ିବା ତାଲିକା ପାଇବେ</translation> <translation id="5782227691023083829">ଅନୁବାଦ ହେଉଛି...</translation> -<translation id="5797070761912323120">ଆପଣ କରୁଥିବା ସର୍ଚ୍ଚ, ଦେଖୁଥିବା ବିଜ୍ଞାପନ, ଏବଂ ଅନ୍ୟାନ୍ୟ Google ସେବାକୁ ବ୍ୟକ୍ତିଗତକରଣ କରିବା ପାଇଁ Google ଆପଣଙ୍କର ଇତିବୃତ୍ତିକୁ ବ୍ୟବହାର କରିପାରେ</translation> <translation id="5803566855766646066">ଆପଣ ଏହି ନୂଆ କାର୍ଡକୁ ଖାରଜ କରିବାକୁ ଚାହୁଁଥିବା ନିଶ୍ଚିତ କି?</translation> <translation id="5812974770859303494">ଏଥିରେ ଯୋଗ କରନ୍ତୁ...</translation> <translation id="5816228676161003208">ଏହା ଆପଣଙ୍କର ଭଏସ୍କୁ ବ୍ୟବହାର କରି ଆପଣଙ୍କୁ ଦ୍ରୁତ ସନ୍ଧାନ କରିବାକୁ ଦେଇଥାଏ।</translation> @@ -492,7 +489,7 @@ <translation id="6108923351542677676">ସେଟ୍ ଅପ୍ ପ୍ରକ୍ରିୟା ଚାଲିଛି…</translation> <translation id="6119050551270742952">ବର୍ତ୍ତମାନର ୱେବ୍ପୃଷ୍ଠା ଇନ୍କଗ୍ନିଟୋରେ ଅଛି</translation> <translation id="6122191549521593678">ଅନ୍ଲାଇନ୍</translation> -<translation id="6127379762771434464">ଆଇଟମ୍ କଢ଼ାଗଲା</translation> +<translation id="6127379762771434464">ଆଇଟମକୁ କାଢ଼ି ଦିଆଯାଇଛି</translation> <translation id="6136914049981179737">ସେକେଣ୍ଡ ପୂର୍ବେ</translation> <translation id="6144589619057374135">ଇନକଗ୍ନିଟୋରେ ${url} ଖୋଲନ୍ତୁ</translation> <translation id="6177442314419606057">Chromeରେ ଖୋଜନ୍ତୁ</translation> @@ -647,6 +644,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" />ଟି ଅପଠିତ ନିବନ୍ଧ।</translation> <translation id="7412027924265291969">ଜାରି ରଖନ୍ତୁ</translation> <translation id="7425346204213733349">ଆପଣଙ୍କର ବୁକ୍ମାର୍କ୍ସ, ଇତିବୃତ୍ତି, ପାସ୍ୱାର୍ଡ ଓ ଅନ୍ୟ ସେଟିଂସ୍ ଆଉ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ସିଙ୍କ୍ ହେବନାହିଁ। ତଥାପି ଆପଣଙ୍କର ବିଦ୍ୟମାନ ଥିବା ଡାଟା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ଷ୍ଟୋର୍ ହେବ।</translation> +<translation id="7431991332293347422">Search ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିବୃତ୍ତି କିପରି ବ୍ୟବହାର ହେଉଛି ତାହା ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="7435356471928173109">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="7454057999980797137">ରାଜ୍ୟ / ଦେଶ</translation> <translation id="7456847797759667638">ଲୋକେସନ୍ ଖୋଲନ୍ତୁ...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 91fc4c7..1cf1823 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">ਸਾਈਨ-ਇਨ ਕਰੋ…</translation> <translation id="2149973817440762519">ਬੁੱਕਮਾਰਕ ਸੰਪਾਦਿਤ ਕਰੋ</translation> <translation id="2175927920773552910">QR ਕੋਡ</translation> -<translation id="2198757192731523470">ਖੋਜ, ਵਿਗਿਆਪਨ ਅਤੇ ਹੋਰ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ Google ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹੈ।</translation> <translation id="2218443599109088993">ਜ਼ੂਮ ਘਟਾਓ</translation> <translation id="2230173723195178503">ਵੈੱਬਪੰਨਾ ਲੋਡ ਕੀਤਾ ਗਿਆ</translation> <translation id="2239626343334228536">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਕਲੀਅਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…</translation> @@ -296,7 +295,6 @@ <translation id="4042870976416480368">ਪੰਨੇ ਵਿੱਚ ਲੱਭੋ</translation> <translation id="4049507953662678203">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਇੱਕ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨ ਹੈ, ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="4079195788735381731">ਤੁਹਾਡੀ ਸੰਸਥਾ ਨੇ ਤੁਹਾਨੂੰ ਸਾਈਨ-ਆਊਟ ਕੀਤਾ</translation> -<translation id="4082688844002261427">'ਖੋਜ', ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਵਰਤੇ ਜਾਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ</translation> <translation id="408404951701638773">ਹੁਣ ਖੋਜ ਪੱਟੀ ਤੱਕ ਪਹੁੰਚਣਾ ਵਧੇਰੇ ਆਸਾਨ ਹੈ</translation> <translation id="411254640334432676">ਡਾਊਨਲੋਡ ਅਸਫਲ।</translation> <translation id="4112644173421521737">ਖੋਜੋ</translation> @@ -450,7 +448,6 @@ <translation id="5738887413654608789">ਇਹ ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਆਲੇ-ਦੁਆਲੇ ਦੇ ਆਧਾਰ 'ਤੇ ਢੁਕਵੇਂ ਵੈੱਬ ਪੰਨੇ ਲੱਭਣ ਦਿੰਦਾ ਹੈ।</translation> <translation id="5758631781033351321">ਤੁਹਾਨੂੰ ਆਪਣੀ ਪੜ੍ਹਨ-ਸੂਚੀ ਇੱਥੇ ਮਿਲੇਗੀ</translation> <translation id="5782227691023083829">ਅਨੁਵਾਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> -<translation id="5797070761912323120">Google ਖੋਜ, ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰਾਂ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦਾ ਹੈ</translation> <translation id="5803566855766646066">ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਇਸ ਨਵੇਂ ਕਾਰਡ ਨੂੰ ਰੱਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> <translation id="5812974770859303494">ਇਸ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ…</translation> <translation id="5816228676161003208">ਇਹ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਅਵਾਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵਧੇਰੇ ਤੇਜ਼ੀ ਨਾਲ ਖੋਜ ਕਰਨ ਦਿੰਦਾ ਹੈ।</translation> @@ -647,6 +644,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ਨਾ-ਪੜ੍ਹੇ ਲੇਖ।</translation> <translation id="7412027924265291969">ਜਾਰੀ ਰੱਖੋ</translation> <translation id="7425346204213733349">ਤੁਹਾਡੇ ਬੁੱਕਮਾਰਕਾਂ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡਾਂ, ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਕੀਤੇ ਬਦਲਾਅ ਹੁਣ ਤੁਹਾਡੇ Google ਖਾਤੇ ਨਾਲ ਸਮਕਾਲੀਕਿਰਤ ਨਹੀਂ ਰਹਿਣਗੇ। ਜਦਕਿ, ਤੁਹਾਡਾ ਮੌਜੂਦਾ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਹੀ ਸਟੋਰ ਰਹੇਗਾ।</translation> +<translation id="7431991332293347422">'ਖੋਜ' ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਦੇ ਵਰਤੇ ਜਾਣ ਦੇ ਤਰੀਕੇ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ</translation> <translation id="7435356471928173109">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ</translation> <translation id="7454057999980797137">ਰਾਜ / ਕਾਉਂਟੀ</translation> <translation id="7456847797759667638">ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਖੋਲ੍ਹੋ...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index a4152cb0..df195c40 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Zaloguj się…</translation> <translation id="2149973817440762519">Edytuj zakładkę</translation> <translation id="2175927920773552910">Kod QR</translation> -<translation id="2198757192731523470">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania, reklamy i działanie innych usług.</translation> <translation id="2218443599109088993">Pomniejsz</translation> <translation id="2230173723195178503">Wczytano stronę internetową</translation> <translation id="2239626343334228536">Czyszczę dane przeglądania…</translation> @@ -296,7 +295,6 @@ <translation id="4042870976416480368">Znajdź na stronie</translation> <translation id="4049507953662678203">Upewnij się, że masz połączenie z siecią, i spróbuj ponownie.</translation> <translation id="4079195788735381731">Organizacja Cię wylogowała</translation> -<translation id="4082688844002261427">Zarządzaj personalizacją wyszukiwarki, reklam i innych usług na podstawie historii przeglądania</translation> <translation id="408404951701638773">Pasek wyszukiwania jest teraz łatwiej dostępny</translation> <translation id="411254640334432676">Błąd pobierania.</translation> <translation id="4112644173421521737">Szukaj</translation> @@ -451,7 +449,6 @@ <translation id="5738887413654608789">Pozwoli Ci to odkrywać strony internetowe dotyczące rzeczy z Twojego otoczenia.</translation> <translation id="5758631781033351321">Znajdziesz tu swoją listę Do przeczytania</translation> <translation id="5782227691023083829">Trwa tłumaczenie...</translation> -<translation id="5797070761912323120">Google może korzystać z Twojej historii, by personalizować wyniki wyszukiwania, reklamy i działanie innych usług</translation> <translation id="5803566855766646066">Czy na pewno chcesz zamknąć tę nową kartę?</translation> <translation id="5812974770859303494">Dodaj do...</translation> <translation id="5816228676161003208">Umożliwia szybsze wyszukiwanie głosowe.</translation> @@ -648,6 +645,7 @@ <translation id="7409985198648820906">Nieprzeczytane artykuły: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Dalej</translation> <translation id="7425346204213733349">Zmiany w zakładkach, historii, hasłach i innych ustawieniach nie będą już synchronizowane z kontem Google. Twoje obecne dane będą jednak nadal na nim przechowywane.</translation> +<translation id="7431991332293347422">Zarządzaj personalizacją wyszukiwarki i innych funkcji na podstawie historii przeglądania</translation> <translation id="7435356471928173109">Wyłączył administrator</translation> <translation id="7454057999980797137">Stan/region</translation> <translation id="7456847797759667638">Otwórz lokalizację...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index 28aa5de..06cd70f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Login…</translation> <translation id="2149973817440762519">Editar favoritos</translation> <translation id="2175927920773552910">Código QR</translation> -<translation id="2198757192731523470">O histórico será usado para personalizar a Pesquisa, anúncios e outros serviços Google.</translation> <translation id="2218443599109088993">Diminuir zoom</translation> <translation id="2230173723195178503">Página da Web carregada</translation> <translation id="2239626343334228536">Limpando dados de navegação…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Buscar na página</translation> <translation id="4049507953662678203">Verifique se você tem uma conexão de rede e tente novamente.</translation> <translation id="4079195788735381731">Sua conta foi desconectada pela organização</translation> -<translation id="4082688844002261427">Controle como o histórico de navegação é usado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="408404951701638773">Ficou mais fácil acessar a barra de pesquisa</translation> <translation id="411254640334432676">Falha no download.</translation> <translation id="4112644173421521737">Pesquisar</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Isso permite que você descubra páginas da Web relevantes com base nos seus arredores.</translation> <translation id="5758631781033351321">Você encontrará sua lista de leituras aqui</translation> <translation id="5782227691023083829">Traduzindo...</translation> -<translation id="5797070761912323120">O histórico será usado para personalizar a Pesquisa, anúncios e outros serviços Google.</translation> <translation id="5803566855766646066">Tem certeza de que você quer descartar este novo card?</translation> <translation id="5812974770859303494">Adicionar a…</translation> <translation id="5816228676161003208">Isso permite que você pesquise mais rapidamente usando sua voz.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artigos não lidos.</translation> <translation id="7412027924265291969">Continuar</translation> <translation id="7425346204213733349">Alterações feitas nos seus favoritos, histórico, senhas e outras configurações não serão mais sincronizadas com sua Conta do Google. No entanto, os dados já existentes permanecerão armazenados na Conta do Google.</translation> +<translation id="7431991332293347422">Controla como o histórico de navegação é usado para personalizar a Pesquisa e muito mais</translation> <translation id="7435356471928173109">Desativado pelo administrador</translation> <translation id="7454057999980797137">Estado/Prov.</translation> <translation id="7456847797759667638">Abrir local...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index b1437d6..d7659fea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Iniciar sessão…</translation> <translation id="2149973817440762519">Editar marcador</translation> <translation id="2175927920773552910">Código QR</translation> -<translation id="2198757192731523470">A Google pode utilizar o seu histórico para personalizar a Pesquisa, os anúncios e outros serviços Google.</translation> <translation id="2218443599109088993">Diminuir zoom</translation> <translation id="2230173723195178503">Página Web carregada</translation> <translation id="2239626343334228536">A limpar os dados de navegação…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Localizar na página</translation> <translation id="4049507953662678203">Certifique-se de que tem uma ligação de rede e tente novamente.</translation> <translation id="4079195788735381731">A sua entidade terminou a sua sessão</translation> -<translation id="4082688844002261427">Controle a forma como o histórico de navegação é utilizado para personalizar a Pesquisa, os anúncios e muito mais</translation> <translation id="408404951701638773">Agora é mais fácil aceder à barra de pesquisa</translation> <translation id="411254640334432676">A transferência falhou.</translation> <translation id="4112644173421521737">Pesquisar</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Isto permite descobrir páginas Web relevantes com base no ambiente à sua volta.</translation> <translation id="5758631781033351321">A sua lista de leitura será apresentada aqui</translation> <translation id="5782227691023083829">A traduzir...</translation> -<translation id="5797070761912323120">A Google pode utilizar o seu histórico para personalizar a Pesquisa, os anúncios e outros serviços Google.</translation> <translation id="5803566855766646066">Tem a certeza de que pretende rejeitar o novo cartão?</translation> <translation id="5812974770859303494">Adicionar a…</translation> <translation id="5816228676161003208">Isto permite-lhe pesquisar mais rapidamente com a sua voz.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artigos não lidos.</translation> <translation id="7412027924265291969">Continuar</translation> <translation id="7425346204213733349">As alterações aos marcadores, ao histórico, às palavras-passe e a outras definições deixam de ser sincronizadas com a Conta Google. Contudo, os dados existentes permanecem armazenados na Conta Google.</translation> +<translation id="7431991332293347422">Controle a forma como o histórico de navegação é utilizado para personalizar a Pesquisa e muito mais.</translation> <translation id="7435356471928173109">Desativada pelo seu administrador.</translation> <translation id="7454057999980797137">Distrito/concelho</translation> <translation id="7456847797759667638">Abrir localização...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 5fa463c..5561f6d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Conectează-te…</translation> <translation id="2149973817440762519">Editați marcajul</translation> <translation id="2175927920773552910">Cod QR</translation> -<translation id="2198757192731523470">Google poate folosi istoricul pentru a personaliza Căutarea, anunțurile și alte servicii Google.</translation> <translation id="2218443599109088993">Micșorează</translation> <translation id="2230173723195178503">Pagina web s-a încărcat</translation> <translation id="2239626343334228536">Se șterg datele de navigare...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Găsește în pagină</translation> <translation id="4049507953662678203">Asigură-te că ai o conexiune la rețea și încearcă din nou.</translation> <translation id="4079195788735381731">Organizația te-a deconectat</translation> -<translation id="4082688844002261427">Controlează modul în care istoricul de navigare este folosit pentru a personaliza Căutarea, anunțurile și alte servicii</translation> <translation id="408404951701638773">Bara de căutare este acum mai ușor de accesat</translation> <translation id="411254640334432676">Nu s-a descărcat.</translation> <translation id="4112644173421521737">Caută</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Astfel, poți descoperi pagini web relevante în funcție de lucrurile din jurul tău.</translation> <translation id="5758631781033351321">Aici vei vedea lista de lectură</translation> <translation id="5782227691023083829">Se traduce...</translation> -<translation id="5797070761912323120">Google poate folosi istoricul pentru a personaliza Căutarea, anunțurile și alte servicii Google</translation> <translation id="5803566855766646066">Sigur dorești să elimini acest card nou?</translation> <translation id="5812974770859303494">Adaugă în…</translation> <translation id="5816228676161003208">Astfel, cauți mai rapid folosindu-ți vocea.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> articole necitite.</translation> <translation id="7412027924265291969">Continuă</translation> <translation id="7425346204213733349">Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google.</translation> +<translation id="7431991332293347422">Controlează modul în care istoricul de navigare este folosit pentru a personaliza Căutarea și alte servicii</translation> <translation id="7435356471928173109">Dezactivată de administrator</translation> <translation id="7454057999980797137">Stat/Județ</translation> <translation id="7456847797759667638">Deschide o locație...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 7634057..0692811 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Войти</translation> <translation id="2149973817440762519">Закладка</translation> <translation id="2175927920773552910">QR-код</translation> -<translation id="2198757192731523470">Google может использовать вашу историю, чтобы персонализировать рекламу, а также Поиск и другие сервисы.</translation> <translation id="2218443599109088993">Уменьшить</translation> <translation id="2230173723195178503">Веб-страница загружена</translation> <translation id="2239626343334228536">Удаление данных о работе в браузере…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Найти на странице</translation> <translation id="4049507953662678203">Проверьте подключение к Интернету и повторите попытку.</translation> <translation id="4079195788735381731">Выполнен выход из аккаунта.</translation> -<translation id="4082688844002261427">Управление данными о посещенных страницах для персонализации Поиска, рекламы и т. д.</translation> <translation id="408404951701638773">Пользоваться строкой поиска стало ещё удобнее</translation> <translation id="411254640334432676">Ошибка при скачивании</translation> <translation id="4112644173421521737">Поиск</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Вы сможете узнавать о сайтах, связанных с объектами вокруг вас.</translation> <translation id="5758631781033351321">Здесь вы найдете свой список для чтения</translation> <translation id="5782227691023083829">Перевод...</translation> -<translation id="5797070761912323120">Google может использовать вашу историю, чтобы персонализировать рекламу, а также Поиск и другие сервисы.</translation> <translation id="5803566855766646066">Удалить новую карту?</translation> <translation id="5812974770859303494">Добавить…</translation> <translation id="5816228676161003208">Это нужно, чтобы использовать голосовой поиск</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Непрочитанных статей: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Продолжить</translation> <translation id="7425346204213733349">Изменения в ваших закладках, паролях, истории и других настройках больше не будут синхронизироваться с аккаунтом Google. Это не повлияет на данные, сохраненные в аккаунте ранее.</translation> +<translation id="7431991332293347422">Укажите, как Google может использовать историю браузера для персонализации Поиска и других сервисов.</translation> <translation id="7435356471928173109">Функцию отключил администратор.</translation> <translation id="7454057999980797137">Регион</translation> <translation id="7456847797759667638">Открыть адрес...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 87e8338b..2cfb11c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">පුරන්න…</translation> <translation id="2149973817440762519">පිටු සලකුණු සංස්කරණය කරන්න</translation> <translation id="2175927920773552910">QR කේතය</translation> -<translation id="2198757192731523470">Google විසින් සෙවීම, දැන්වීම් සහ වෙනත් Google සේවා පෞද්ගලීකරණය කිරීමට ඔබේ ඉතිහාසය භාවිතා කළ හැකිය.</translation> <translation id="2218443599109088993">කුඩා කරන්න</translation> <translation id="2230173723195178503">වෙබ් පිටුව පූරණය කරන ලදී</translation> <translation id="2239626343334228536">බ්රවුස් කිරීමේ දත්ත හිස් කිරීම...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">පිටුවෙහි සොයා ගන්න</translation> <translation id="4049507953662678203">ඔබට ජාල සම්බන්ධතාවක් ඇති බව සහතික කරගෙන, නැවත උත්සාහ කරන්න.</translation> <translation id="4079195788735381731">ඔබගේ සංවිධානය විසින් ඔබව වරන ලදි</translation> -<translation id="4082688844002261427">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය සෙවීම, දැන්වීම් සහ තවත් දේ පුද්ගලායන කිරීමට භාවිත කෙරෙන ආකාරය පාලන කරන්න</translation> <translation id="408404951701638773">දැන් සෙවුම් තීරුවට ළඟා වීමට පහසුය</translation> <translation id="411254640334432676">බාගැනීම අසාර්ථකයි</translation> <translation id="4112644173421521737">සෙවීම</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">මෙය ඔබට ඔබේ වටපිටාව මත පදනම්ව අදාළ වෙබ් පිටු සොයා ගැනීමට ඉඩ දෙයි.</translation> <translation id="5758631781033351321">ඔබට ඔබේ කියවීමේ ලැයිස්තුව මෙහි හමුවනු ඇත</translation> <translation id="5782227691023083829">පරිවර්තනය කරමින්...</translation> -<translation id="5797070761912323120">සෙවීම, දැන්වීම් සහ අනෙකුත් Google සේවා පුද්ගලායන කිරීමට Google ඔබේ ඉතිහාසය භාවිත කළ හැක</translation> <translation id="5803566855766646066">ඔබට මෙම අලුත් කාඩ්පත ඉවත ලෑ යුතු බව ඔබට තහවුරුද?</translation> <translation id="5812974770859303494">වෙත එක් කරන්න...</translation> <translation id="5816228676161003208">මෙය ඔබට ඔබේ හඬ භාවිතයෙන් වේගයෙන් සෙවීමට ඉඩ දෙයි.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">නොකියවූ ලිපි <ph name="UNREAD_COUNT" /> ක්.</translation> <translation id="7412027924265291969">ඉදිරියට යන්න</translation> <translation id="7425346204213733349">ඔබගේ පිටුසන්, ඉතිහාසය, මුරපද, සහ අනෙකුත් සැකසීම්වලට සිදු කරන වෙනස් කිරීම් ඔබගේ Google ගිණුම වෙත තව දුරටත් සමමුහුර්ත වන්නේ නැත. කෙසේ වෙතත්, ඔබගේ පවතින දත්ත ඔබගේ Google ගිණුමේ ගබඩා කර තිබෙනු ඇත.</translation> +<translation id="7431991332293347422">ඔබගේ බ්රවුස් කිරීමේ ඉතිහාසය සෙවීම, සහ තවත් දේ පුද්ගලායන කිරීමට භාවිත කරන ආකාරය පාලන කිරීම</translation> <translation id="7435356471928173109">ඔබේ පරිපාලක විසින් ක්රියාවිරහිත කරන ලදි</translation> <translation id="7454057999980797137">රාජ්යය / ජනපදය</translation> <translation id="7456847797759667638">ස්ථානය විවෘත කරන්න ...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 213b18e..fa478430 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Prihlásiť sa…</translation> <translation id="2149973817440762519">Upraviť záložku</translation> <translation id="2175927920773552910">QR kód</translation> -<translation id="2198757192731523470">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie, reklamy a ďalšie služby Googlu.</translation> <translation id="2218443599109088993">Oddialiť</translation> <translation id="2230173723195178503">Načítala sa webová stránka</translation> <translation id="2239626343334228536">Vymazávajú sa dáta prehliadania…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Nájsť na stránke</translation> <translation id="4049507953662678203">Uistite sa, že máte pripojenie k sieti, a skúste to znova.</translation> <translation id="4079195788735381731">Vaša organizácia vás odhlásila</translation> -<translation id="4082688844002261427">Ovládajte, ako sa pomocou histórie prehliadania prispôsobujú Vyhľadávanie, reklamy a ďalší obsah</translation> <translation id="408404951701638773">Vyhľadávací panel je teraz dostupnejší</translation> <translation id="411254640334432676">Sťahovanie zlyhalo.</translation> <translation id="4112644173421521737">Hľadať</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Umožní vám to objavovať relevantné webové stránky na základe objektov vo vašom okolí.</translation> <translation id="5758631781033351321">Tu nájdete svoj čitateľský zoznam</translation> <translation id="5782227691023083829">Prebieha preklad...</translation> -<translation id="5797070761912323120">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie, reklamy a ďalšie služby Googlu</translation> <translation id="5803566855766646066">Naozaj chcete zahodiť túto novú kartu?</translation> <translation id="5812974770859303494">Pridať do…</translation> <translation id="5816228676161003208">Umožňuje rýchlejšie vyhľadávania pomocou hlasu.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Počet neprečítaných článkov: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Pokračovať</translation> <translation id="7425346204213733349">Záložky, história, heslá a ďalšie nastavenia sa už nebudú ďalej synchronizovať do vášho účtu Google. Vaše súčasné údaje však zostanú uložené v účte Google.</translation> +<translation id="7431991332293347422">Ovládajte, ako sa história prehliadania používa na prispôsobenie Vyhľadávania a ďalšieho obsahu</translation> <translation id="7435356471928173109">Vypnuté vaším správcom</translation> <translation id="7454057999980797137">Štát/okres</translation> <translation id="7456847797759667638">Otvoriť umiestnenie...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index d56a3cea..7132f3741 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Prijava …</translation> <translation id="2149973817440762519">Uredi zaznamek</translation> <translation id="2175927920773552910">Koda QR</translation> -<translation id="2198757192731523470">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev.</translation> <translation id="2218443599109088993">Pomanjšaj</translation> <translation id="2230173723195178503">Spletna stran je naložena</translation> <translation id="2239626343334228536">Brisanje podatkov brskanja …</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Najdi na strani</translation> <translation id="4049507953662678203">Make sure you have a network connection, and try again.</translation> <translation id="4079195788735381731">Organizacija vas je odjavila</translation> -<translation id="4082688844002261427">Nadziranje, kako se zgodovina brskanja uporabi za prilagajanje Iskanja Google, oglasov in drugega</translation> <translation id="408404951701638773">Vrstico za iskanje je zdaj preprosteje doseči</translation> <translation id="411254640334432676">Prenos ni uspel.</translation> <translation id="4112644173421521737">Iskanje</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">To vam omogoča odkrivanje pomembnih spletnih strani glede na vašo okolico.</translation> <translation id="5758631781033351321">Tukaj bo prikazan seznam za branje</translation> <translation id="5782227691023083829">Prevajanje ...</translation> -<translation id="5797070761912323120">Google lahko vašo zgodovino uporabi za prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev</translation> <translation id="5803566855766646066">Ali ste prepričani, da želite zavreči to novo kartico?</translation> <translation id="5812974770859303494">Dodaj v …</translation> <translation id="5816228676161003208">S tem je mogoče hitreje iskati z glasom.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Št. neprebranih člankov: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Naprej</translation> <translation id="7425346204213733349">Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev ne bodo več sinhronizirane z Google Računom. Obstoječi podatki bodo še naprej shranjeni v Google Računu.</translation> +<translation id="7431991332293347422">Nadziranje, kako se zgodovina brskanja uporabi za prilagajanje Iskanja Google in drugega</translation> <translation id="7435356471928173109">Izklopil skrbnik</translation> <translation id="7454057999980797137">Regija</translation> <translation id="7456847797759667638">Odpri mesto ...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index fdf02c5..8b42ad5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Identifikohu…</translation> <translation id="2149973817440762519">Redakto faqeshënuesin</translation> <translation id="2175927920773552910">Kodi QR</translation> -<translation id="2198757192731523470">Google mund ta përdorë historikun tënd për të personalizuar "Kërko me Google", reklamat dhe shërbime të tjera të Google.</translation> <translation id="2218443599109088993">Zvogëlo</translation> <translation id="2230173723195178503">Faqja e uebit u ngarkua</translation> <translation id="2239626343334228536">Të dhënat e shfletimit po pastrohen...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Gjej brenda faqes</translation> <translation id="4049507953662678203">Sigurohu që ke një lidhje interneti dhe provo përsëri.</translation> <translation id="4079195788735381731">Organizata jote të nxori nga llogaria</translation> -<translation id="4082688844002261427">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin", reklamat dhe shumë të tjera</translation> <translation id="408404951701638773">Shiriti i kërkimit mund të arrihet tani më lehtë</translation> <translation id="411254640334432676">Shkarkimi dështoi.</translation> <translation id="4112644173421521737">Kërko</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">Kjo të lejon të zbulosh faqe uebi që kanë lidhje bazuar në ambientin rrethues.</translation> <translation id="5758631781033351321">Këtu do të gjesh listën tënde të leximit</translation> <translation id="5782227691023083829">Po përkthen...</translation> -<translation id="5797070761912323120">Google mund ta përdorë historikun tënd për të personalizuar "Kërko me Google", reklamat dhe shërbime të tjera të Google</translation> <translation id="5803566855766646066">Je i sigurt që dëshiron ta heqësh këtë kartë të re?</translation> <translation id="5812974770859303494">Shto te...</translation> <translation id="5816228676161003208">Kjo të lejon të kërkosh më shpejt me anë të zërit.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> artikuj të palexuar.</translation> <translation id="7412027924265291969">Vazhdo</translation> <translation id="7425346204213733349">Ndryshimet te faqeshënuesit, historiku, fjalëkalimet dhe cilësimet e tjera nuk do të sinkronizohen më te llogaria jote e Google. Sidoqoftë, të dhënat e tua ekzistuese do të qëndrojnë të ruajtura te llogaria jote e Google.</translation> +<translation id="7431991332293347422">Kontrollo se si përdoret historiku i shfletimit për të personalizuar "Kërkimin" dhe shumë të tjera</translation> <translation id="7435356471928173109">Çaktivizuar nga administratori yt</translation> <translation id="7454057999980797137">Shteti / Qarku</translation> <translation id="7456847797759667638">Hap vendndodhjen...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index 188b4a0..fe10825 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Prijavite se…</translation> <translation id="2149973817440762519">Izmenite obeleživač</translation> <translation id="2175927920773552910">QR kôd</translation> -<translation id="2198757192731523470">Google može da koristi istoriju za personalizaciju Pretrage, oglasa i drugih Google usluga.</translation> <translation id="2218443599109088993">Umanjite</translation> <translation id="2230173723195178503">Veb-stranica je učitana</translation> <translation id="2239626343334228536">Brišu se podaci pregledanja...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Nađi na stranici</translation> <translation id="4049507953662678203">Proverite da li ste povezani na mrežu i pokušajte ponovo.</translation> <translation id="4079195788735381731">Organizacija vas je odjavila</translation> -<translation id="4082688844002261427">Kontrolišite način na koji se istorija pregledanja koristi za personalizaciju Pretrage, oglasa i drugih usluga</translation> <translation id="408404951701638773">Traka za pretragu je sada dostupnija</translation> <translation id="411254640334432676">Preuzimanje nije uspelo.</translation> <translation id="4112644173421521737">Pretraži</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Ovo vam omogućava da otkrijete relevantne veb-stranice na osnovu okruženja.</translation> <translation id="5758631781033351321">Ovde ćete pronaći listu za čitanje</translation> <translation id="5782227691023083829">Prevođenje je u toku...</translation> -<translation id="5797070761912323120">Google može da koristi istoriju za personalizaciju Pretrage, oglasa i drugih Google usluga</translation> <translation id="5803566855766646066">Želite li stvarno da odbacite ovu novu karticu?</translation> <translation id="5812974770859303494">Dodajte u…</translation> <translation id="5816228676161003208">Ovo vam omogućava da brže pretražujte pomoću glasa.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Nepročitanih članaka: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Nastavi</translation> <translation id="7425346204213733349">Promene obeleživača, istorije, lozinki i drugih podešavanja se više neće sinhronizovati sa Google nalogom. Međutim, postojeći podaci će ostati sačuvani na Google nalogu.</translation> +<translation id="7431991332293347422">Kontrolišite kako se istorija pregledanja koristi za personalizovanje Pretrage i drugih usluga</translation> <translation id="7435356471928173109">Isključio je administrator</translation> <translation id="7454057999980797137">Država/zemlja</translation> <translation id="7456847797759667638">Otvori lokaciju...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 7c88cd38..90a545a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Пријавите се…</translation> <translation id="2149973817440762519">Измените обележивач</translation> <translation id="2175927920773552910">QR кôд</translation> -<translation id="2198757192731523470">Google може да користи историју за персонализацију Претраге, огласа и других Google услуга.</translation> <translation id="2218443599109088993">Умањите</translation> <translation id="2230173723195178503">Веб-страница је учитана</translation> <translation id="2239626343334228536">Бришу се подаци прегледања...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Нађи на страници</translation> <translation id="4049507953662678203">Проверите да ли сте повезани на мрежу и покушајте поново.</translation> <translation id="4079195788735381731">Организација вас је одјавила</translation> -<translation id="4082688844002261427">Контролишите начин на који се историја прегледања користи за персонализацију Претраге, огласа и других услуга</translation> <translation id="408404951701638773">Трака за претрагу је сада доступнија</translation> <translation id="411254640334432676">Преузимање није успело.</translation> <translation id="4112644173421521737">Претражи</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Ово вам омогућава да откријете релевантне веб-странице на основу окружења.</translation> <translation id="5758631781033351321">Овде ћете пронаћи листу за читање</translation> <translation id="5782227691023083829">Превођење је у току...</translation> -<translation id="5797070761912323120">Google може да користи историју за персонализацију Претраге, огласа и других Google услуга</translation> <translation id="5803566855766646066">Желите ли стварно да одбаците ову нову картицу?</translation> <translation id="5812974770859303494">Додајте у…</translation> <translation id="5816228676161003208">Ово вам омогућава да брже претражујте помоћу гласа.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Непрочитаних чланака: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Настави</translation> <translation id="7425346204213733349">Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће остати сачувани на Google налогу.</translation> +<translation id="7431991332293347422">Контролишите како се историја прегледања користи за персонализовање Претраге и других услуга</translation> <translation id="7435356471928173109">Искључио је администратор</translation> <translation id="7454057999980797137">Држава/земља</translation> <translation id="7456847797759667638">Отвори локацију...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index a1ac8649..f8709ee 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Logga in …</translation> <translation id="2149973817440762519">Redigera bokmärke</translation> <translation id="2175927920773552910">QR-kod</translation> -<translation id="2198757192731523470">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån historiken.</translation> <translation id="2218443599109088993">Zooma ut</translation> <translation id="2230173723195178503">Webbsidan har lästs in</translation> <translation id="2239626343334228536">Tar bort webbinformation …</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Sök på sidan</translation> <translation id="4049507953662678203">Kontrollera att du är ansluten till nätverket och försök igen.</translation> <translation id="4079195788735381731">Din organisation loggade ut dig</translation> -<translation id="4082688844002261427">Styr hur din webbhistorik används för att anpassa sökning, annonser med mera</translation> <translation id="408404951701638773">Nu är det enklare att komma åt sökfältet</translation> <translation id="411254640334432676">Nedladdningen misslyckades.</translation> <translation id="4112644173421521737">Sök</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Detta gör det möjligt att upptäcka relevanta webbsidor utifrån din omgivning.</translation> <translation id="5758631781033351321">Du hittar läslistan här</translation> <translation id="5782227691023083829">Översätter...</translation> -<translation id="5797070761912323120">Google kan anpassa Sök, annonser och andra Google-tjänster utifrån historiken</translation> <translation id="5803566855766646066">Vill du slänga det här nya kortet?</translation> <translation id="5812974770859303494">Lägg till i …</translation> <translation id="5816228676161003208">Det här gör att du kan söka snabbare med hjälp av rösten.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> olästa artiklar.</translation> <translation id="7412027924265291969">Fortsätt</translation> <translation id="7425346204213733349">Ändringar i bokmärken, historik, lösenord och andra inställningar synkroniseras inte längre med ditt Google-konto. Befintlig data fortsätter dock att lagras i Google-kontot.</translation> +<translation id="7431991332293347422">Styr hur webbhistoriken får användas för att anpassa Sök med mera</translation> <translation id="7435356471928173109">Inaktiverat av administratören</translation> <translation id="7454057999980797137">Delstat/county</translation> <translation id="7456847797759667638">Öppna plats...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 7bf118402..f0a0325 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Ingia Katika Akaunti…</translation> <translation id="2149973817440762519">Badilisha Alamisho</translation> <translation id="2175927920773552910">Msimbo wa QR</translation> -<translation id="2198757192731523470">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google.</translation> <translation id="2218443599109088993">Sogeza Mbali</translation> <translation id="2230173723195178503">Ukurasa wa Wavuti umepakiwa</translation> <translation id="2239626343334228536">Inafuta data ya kuvinjari...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Pata katika Ukurasa</translation> <translation id="4049507953662678203">Hakikisha una muunganisho wa mtandao, kisha ujaribu tena.</translation> <translation id="4079195788735381731">Shirika lako limekuondoa katika akaunti</translation> -<translation id="4082688844002261427">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo kwenye Huduma ya Tafuta na Google, matangazo na zaidi</translation> <translation id="408404951701638773">Sasa unaweza kufikia upau wa kutafutia kwa urahisi</translation> <translation id="411254640334432676">Upakuaji haujafaulu.</translation> <translation id="4112644173421521737">Tafuta</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Hii inakuwezesha kugundua kurasa za wavuti zinazokufaa kulingana na mazingira yako.</translation> <translation id="5758631781033351321">Utapata orodha yako ya kusoma hapa</translation> <translation id="5782227691023083829">Inatafsiri...</translation> -<translation id="5797070761912323120">Google inaweza kutumia historia yako ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google</translation> <translation id="5803566855766646066">Je, una uhakika ungependa kufuta kadi hii mpya?</translation> <translation id="5812974770859303494">Weka Kwenye...</translation> <translation id="5816228676161003208">Hii hukuwezesha kutafuta haraka kwa kutamka.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Hujasoma makala <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Endelea</translation> <translation id="7425346204213733349">Mabadiliko kwenye alamisho, historia, manenosiri na mipangilio yako mingine haitasawazishwa tena kwenye Akaunti yako ya Google. Hata hivyo, data yako iliyopo itaendelea kuhifadhiwa katika Akaunti yako ya Google.</translation> +<translation id="7431991332293347422">Dhibiti namna historia yako ya kuvinjari inavyotumika kuweka mapendeleo kwenye huduma ya Tafuta na Google na zaidi</translation> <translation id="7435356471928173109">Kimezimwa na msimamizi wako</translation> <translation id="7454057999980797137">Jimbo / Mkoa</translation> <translation id="7456847797759667638">Fungua Mahali...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 989df7ae..e207cd4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">உள்நுழைக…</translation> <translation id="2149973817440762519">புக்மார்க்கை மாற்றுக</translation> <translation id="2175927920773552910">QR குறியீடு</translation> -<translation id="2198757192731523470">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்.</translation> <translation id="2218443599109088993">சிறிதாக்கு</translation> <translation id="2230173723195178503">இணையப் பக்கம் ஏற்றப்பட்டது</translation> <translation id="2239626343334228536">உலாவிய தரவை அழிக்கிறது...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">பக்கத்தில் கண்டறிக</translation> <translation id="4049507953662678203">இணைய இணைப்பு இருப்பதை உறுதிசெய்து, மீண்டும் முயலவும்.</translation> <translation id="4079195788735381731">உங்கள் நிறுவனம் அனுமதிக்காததால் வெளியேறிவிட்டீர்கள்</translation> -<translation id="4082688844002261427">தேடல், விளம்பரங்கள் மற்றும் பலவற்றைப் பிரத்தியேகமானதாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்</translation> <translation id="408404951701638773">தேடல் பட்டியை இப்போது எளிதாக அணுகலாம்</translation> <translation id="411254640334432676">பதிவிறக்கம் தோல்வி.</translation> <translation id="4112644173421521737">தேடுக</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">இதன் மூலம், உங்களைச் சுற்றியுள்ளவற்றின் அடிப்படையில் தொடர்புடைய இணையப் பக்கங்களைக் கண்டறியலாம்.</translation> <translation id="5758631781033351321">உங்கள் வாசிப்புப் பட்டியலை இங்கே பார்ப்பீர்கள்</translation> <translation id="5782227691023083829">மொழிபெயர்க்கிறது...</translation> -<translation id="5797070761912323120">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் வரலாற்றை Google பயன்படுத்தக்கூடும்</translation> <translation id="5803566855766646066">இந்தப் புதிய கார்டை நிராகரிக்க வேண்டுமா?</translation> <translation id="5812974770859303494">இதில் சேர்...</translation> <translation id="5816228676161003208">இதன் மூலம் உங்கள் குரலைப் பயன்படுத்தி வேகமாகத் தேடலாம்.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906">படிக்காத கட்டுரைகள் <ph name="UNREAD_COUNT" /> உள்ளன.</translation> <translation id="7412027924265291969">தொடர்க</translation> <translation id="7425346204213733349">புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் ஆகியவற்றிலும் பிற அமைப்புகளிலும் செய்யும் மாற்றங்கள், இனி உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படாது. எனினும், ஏற்கனவே சேமிக்கப்பட்ட உங்கள் தரவு Google கணக்கில் அப்படியே இருக்கும்.</translation> +<translation id="7431991332293347422">தேடல் மற்றும் பலவற்றைத் தனிப்பயனாக்க உங்கள் உலாவல் வரலாறு எப்படிப் பயன்படுத்தப்படுகிறது என்பதைக் கட்டுப்படுத்தலாம்</translation> <translation id="7435356471928173109">உங்கள் நிர்வாகி முடக்கியுள்ளார்</translation> <translation id="7454057999980797137">மாநிலம் / மாகாணம்</translation> <translation id="7456847797759667638">இருப்பிடத்தைத் திற...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index c0c42656..e57b8c4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">సైన్ ఇన్ చేయి…</translation> <translation id="2149973817440762519">బుక్మార్క్ను సవరించు</translation> <translation id="2175927920773552910">QR కోడ్</translation> -<translation id="2198757192731523470">శోధన, ప్రకటనలు మరియు ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించవచ్చు</translation> <translation id="2218443599109088993">దూరంగా జూమ్ చేయి</translation> <translation id="2230173723195178503">వెబ్పేజీ లోడ్ అయ్యింది</translation> <translation id="2239626343334228536">బ్రౌజింగ్ డేటాను తీసివేస్తోంది...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">పేజీలో కనుగొనండి</translation> <translation id="4049507953662678203">మీ ఇంటర్నెట్ పని చేస్తోందో లేదో చెక్ చేసుకుని మళ్లీ ప్రయత్నించండి.</translation> <translation id="4079195788735381731">మీ సంస్థ మిమ్మల్ని సైన్ అవుట్ చేసింది</translation> -<translation id="4082688844002261427">శోధన, ప్రకటనలతోపాటు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ చరిత్రను ఎలా ఉపయోగించాలో నియంత్రించండి</translation> <translation id="408404951701638773">ఇప్పుడు శోధన పట్టీకి మరింత సులభంగా చేరుకోవచ్చు</translation> <translation id="411254640334432676">డౌన్లోడ్ విఫలమైంది.</translation> <translation id="4112644173421521737">సెర్చ్</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">దీని వల్ల మీరు మీ పరిసరాల ఆధారంగా సంబంధిత వెబ్ పేజీలను కనుగొనగలుగుతారు.</translation> <translation id="5758631781033351321">మీ చదివే అంశాల లిస్ట్ను ఇక్కడ చూడగలరు</translation> <translation id="5782227691023083829">అనువదిస్తోంది...</translation> -<translation id="5797070761912323120">శోధన, ప్రకటనలు, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation> <translation id="5803566855766646066">మీరు ఈ కొత్త కార్డ్ను ఖచ్చితంగా విస్మరించాలనుకుంటున్నారా?</translation> <translation id="5812974770859303494">దీనికి జోడించండి...</translation> <translation id="5816228676161003208">దీని వలన మీ వాయిస్ను ఉపయోగించి వేగంగా వెతకగలుగుతారు.</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> చదవని కథనాలు ఉన్నాయి.</translation> <translation id="7412027924265291969">కొనసాగించు</translation> <translation id="7425346204213733349">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్లకు చేసే మార్పులు ఇకపై మీ Google ఖాతాకు సింక్ చేయబడవు. అయితే, ఇప్పటికే ఉన్న మీ డేటా మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది.</translation> +<translation id="7431991332293347422">శోధనలు మరియు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ చరిత్ర ఎలా ఉపయోగించబడుతుందో నియంత్రించండి</translation> <translation id="7435356471928173109">మీ అడ్మినిస్ట్రేటర్ ఆఫ్ చేశారు</translation> <translation id="7454057999980797137">రాష్ట్రం / దేశం</translation> <translation id="7456847797759667638">స్థానాన్ని తెరువు...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 5aec322..a563aee0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">กำลังลงชื่อเข้าใช้…</translation> <translation id="2149973817440762519">แก้ไขบุ๊กมาร์ก</translation> <translation id="2175927920773552910">คิวอาร์โค้ด</translation> -<translation id="2198757192731523470">Google อาจใช้ประวัติของคุณเพื่อปรับเปลี่ยนการค้นหา โฆษณา และบริการอื่นๆ ของ Google ในแบบของคุณ</translation> <translation id="2218443599109088993">ซูมออก</translation> <translation id="2230173723195178503">หน้าเว็บโหลดแล้ว</translation> <translation id="2239626343334228536">กำลังล้างข้อมูลการท่องเว็บ...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">ค้นหาในหน้าเว็บ</translation> <translation id="4049507953662678203">ตรวจสอบว่าคุณมีการเชื่อมต่อเครือข่าย และลองอีกครั้ง</translation> <translation id="4079195788735381731">องค์กรนำคุณออกจากระบบ</translation> -<translation id="4082688844002261427">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="408404951701638773">เข้าถึงแถบค้นหาได้ง่ายขึ้นแล้ว</translation> <translation id="411254640334432676">การดาวน์โหลดล้มเหลว</translation> <translation id="4112644173421521737">ค้นหา</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">วิธีนี้ช่วยให้คุณค้นพบหน้าเว็บที่เกี่ยวข้องโดยอิงตามสิ่งที่อยู่รอบตัวคุณ</translation> <translation id="5758631781033351321">คุณจะเห็นเรื่องรออ่านที่นี่</translation> <translation id="5782227691023083829">กำลังแปล...</translation> -<translation id="5797070761912323120">Google อาจใช้ประวัติการเข้าชมเพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ของ Google ให้เข้ากับคุณ</translation> <translation id="5803566855766646066">คุณแน่ใจไหมว่าต้องการทิ้งบัตรใบใหม่นี้</translation> <translation id="5812974770859303494">เพิ่มใน…</translation> <translation id="5816228676161003208">ช่วยให้คุณค้นหาได้เร็วขึ้นโดยใช้เสียง</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">บทความที่ยังไม่ได้อ่าน <ph name="UNREAD_COUNT" /> รายการ</translation> <translation id="7412027924265291969">ดำเนินการต่อ</translation> <translation id="7425346204213733349">การเปลี่ยนแปลงบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google ของคุณอีกต่อไป อย่างไรก็ตาม ข้อมูลที่คุณมีจะยังคงจัดเก็บอยู่ในบัญชี Google</translation> +<translation id="7431991332293347422">ควบคุมการใช้ประวัติการท่องเว็บเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ในแบบของคุณ</translation> <translation id="7435356471928173109">ปิดโดยผู้ดูแลระบบ</translation> <translation id="7454057999980797137">เขต/แขวง</translation> <translation id="7456847797759667638">เปิดตำแหน่ง...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 241bae206..209273d5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Oturum aç…</translation> <translation id="2149973817440762519">Yer İşaretini Düzenle</translation> <translation id="2175927920773552910">QR Kodu</translation> -<translation id="2198757192731523470">Google; Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation> <translation id="2218443599109088993">Uzaklaştır</translation> <translation id="2230173723195178503">Web sayfası yüklendi</translation> <translation id="2239626343334228536">Göz atma verileri temizleniyor...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Sayfada Bul</translation> <translation id="4049507953662678203">Ağ bağlantınız olduğundan emin olun ve tekrar deneyin.</translation> <translation id="4079195788735381731">Kuruluşunuz, oturumunuzu kapattı</translation> -<translation id="4082688844002261427">Tarama geçmişinizin Arama, reklamlar ve diğer hizmetleri kişiselleştirmek için nasıl kullanıldığını kontrol edin</translation> <translation id="408404951701638773">Arama çubuğuna artık daha kolay erişilebilir</translation> <translation id="411254640334432676">İndirme başarısız oldu.</translation> <translation id="4112644173421521737">Ara</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Bu işlem çevrenizdeki öğelere dayalı olarak ilgili web sayfalarını keşfetmenize olanak sağlar.</translation> <translation id="5758631781033351321">Okuma listenizi burada bulabilirsiniz</translation> <translation id="5782227691023083829">Çevriliyor...</translation> -<translation id="5797070761912323120">Google; Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için geçmişinizi kullanabilir</translation> <translation id="5803566855766646066">Bu yeni kartı silmek istediğinizden emin misiniz?</translation> <translation id="5812974770859303494">Ekle…</translation> <translation id="5816228676161003208">Böylece, sesinizi kullanarak daha hızlı arama yapabilirsiniz.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Okunmamış <ph name="UNREAD_COUNT" /> makale.</translation> <translation id="7412027924265291969">Devam</translation> <translation id="7425346204213733349">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızda yaptığınız değişiklikler artık Google Hesabınız ile senkronize edilmeyecek. Ancak, mevcut verileriniz Google Hesabınızda saklanmaya devam edecek.</translation> +<translation id="7431991332293347422">Göz atma geçmişinizin Arama ve diğer hizmetleri kişiselleştirmek için nasıl kullanıldığını kontrol edin</translation> <translation id="7435356471928173109">Yöneticiniz tarafından kapatıldı</translation> <translation id="7454057999980797137">Eyalet / İlçe</translation> <translation id="7456847797759667638">Konumu Aç...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 3924de6..486afee 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Увійти…</translation> <translation id="2149973817440762519">Редагувати закладку</translation> <translation id="2175927920773552910">QR-код</translation> -<translation id="2198757192731523470">Ваша історія може допомогти нам персоналізувати Пошук, оголошення й інші сервіси Google.</translation> <translation id="2218443599109088993">Віддалити</translation> <translation id="2230173723195178503">Веб-сторінку завантажено</translation> <translation id="2239626343334228536">Очищення даних веб-перегляду…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Знайти на сторінці</translation> <translation id="4049507953662678203">Переконайтеся, що з’єднання з мережею встановлено, і повторіть спробу.</translation> <translation id="4079195788735381731">Адміністратор організації вийшов із вашого облікового запису</translation> -<translation id="4082688844002261427">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку, оголошень тощо</translation> <translation id="408404951701638773">Тепер до рядка пошуку ще легше отримувати доступ</translation> <translation id="411254640334432676">Не завантажено.</translation> <translation id="4112644173421521737">Пошук</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Ви зможете знаходити відповідні веб-сторінки на основі об’єктів поблизу.</translation> <translation id="5758631781033351321">Тут відображатиметься ваш список читання</translation> <translation id="5782227691023083829">Виконується переклад сторінки...</translation> -<translation id="5797070761912323120">Google може використовувати вашу історію, щоб персоналізувати Пошук, оголошення й інші сервіси Google</translation> <translation id="5803566855766646066">Відхилити цю нову картку?</translation> <translation id="5812974770859303494">Додати в…</translation> <translation id="5816228676161003208">Ви зможете швидше шукати голосом.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">Непрочитаних статей: <ph name="UNREAD_COUNT" />.</translation> <translation id="7412027924265291969">Продовжити</translation> <translation id="7425346204213733349">Зміни в закладках, історії, паролях та інших налаштуваннях більше не синхронізуватимуться з вашим обліковим записом Google. Однак наявні дані залишаться у вашому обліковому записі.</translation> +<translation id="7431991332293347422">Указуйте, як використовувати історію веб-перегляду для персоналізації Пошуку тощо</translation> <translation id="7435356471928173109">Вимкнено адміністратором</translation> <translation id="7454057999980797137">Область</translation> <translation id="7456847797759667638">Відкрити розташування...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 46bbfb8..b19d6f3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">سائن ان کریں…</translation> <translation id="2149973817440762519">بک مارک میں ترمیم کریں</translation> <translation id="2175927920773552910">QR کوڈ</translation> -<translation id="2198757192731523470">تلاش، اشتہارات اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کے لیے Google آپ کی سرگزشت کا استعمال کر سکتا ہے۔</translation> <translation id="2218443599109088993">زوم آؤٹ کریں</translation> <translation id="2230173723195178503">ویب صفحہ لوڈ کر دیا گیا ہے</translation> <translation id="2239626343334228536">براؤزنگ ڈیٹا صاف ہو رہا ہے...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">صفحہ میں تلاش کریں</translation> <translation id="4049507953662678203">یقینی بنائیں کہ آپ کے پاس نیٹ ورک کنکشن ہے اور دوبارہ کوشش کریں۔</translation> <translation id="4079195788735381731">آپ کی تنظیم نے آپ کو سائن آؤٹ کر دیا</translation> -<translation id="4082688844002261427">تلاش اور اشتہارات کو ذاتی نوعیت کا بنانے کیلئے آپ کی براؤزنگ کی سرگزشت جس طریقے سے استعمال کی جاتی ہے اسے کنٹرول کریں اور مزید بہت کچھ</translation> <translation id="408404951701638773">تلاش بار تک رسائی حاصل کرنا اب زیادہ آسان ہے</translation> <translation id="411254640334432676">ڈاؤن لوڈ ناکام ہوگیا۔</translation> <translation id="4112644173421521737">تلاش کریں</translation> @@ -452,7 +450,6 @@ <translation id="5738887413654608789">یہ آپ کو آپ کے قرب و جوار کی بنیاد پر متعلقہ ویب صفحات کو دریافت کرنے کی اجازت دیتا ہے۔</translation> <translation id="5758631781033351321">آپ اپنی پڑھنے کی فہرست یہاں پائیں گے</translation> <translation id="5782227691023083829">ترجمہ کیا جا رہا ہے...</translation> -<translation id="5797070761912323120">تلاش، اشتہارات اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کے لیے Google آپ کی سرگزشت کا استعمال کر سکتا ہے</translation> <translation id="5803566855766646066">کیا آپ واقعی اس نئے کارڈ کو مسترد کرنا چاہتے ہیں؟</translation> <translation id="5812974770859303494">اس میں شامل کریں...</translation> <translation id="5816228676161003208">یہ آپ کو اپنی آواز کا استعمال کر کے زیادہ تیزی سے تلاش کرنے دیتا ہے۔</translation> @@ -649,6 +646,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> بغیر پڑھے ہوئے مضامین۔</translation> <translation id="7412027924265291969">جاری رکھیں</translation> <translation id="7425346204213733349">آپ کے بُک مارکس، سرگزشت، پاس ورڈز اور دیگر ترتیبات کی تبدیلیوں کی مزید آپ کے Google اکاؤنٹ کے ساتھ مطابقت پذیری نہیں کی جائے گی۔ البتہ آپ کا موجودہ ڈیٹا آپ کے Google اکاؤنٹ میں اسٹور رہے گا۔</translation> +<translation id="7431991332293347422">تلاش کو ذاتی نوعیت کا بنانے کیلئے آپ کی براؤزنگ کی سرگزشت جس طریقے سے استعمال کی جاتی ہے اسے کنٹرول کریں اور مزید بہت کچھ</translation> <translation id="7435356471928173109">آپ کے منتظم کے ذریعے آف کر دیا گیا</translation> <translation id="7454057999980797137">ریاست / ملک</translation> <translation id="7456847797759667638">مقام کھولیں…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index c075284..07122846 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Kirish...</translation> <translation id="2149973817440762519">Xatcho‘p tahriri</translation> <translation id="2175927920773552910">QR kod</translation> -<translation id="2198757192731523470">Qidiruv, rekama va boshqa xizmatlarni sizga moslashtirish uchun Google tarix maʼlumotlaringizdan foydalanishi mumkin.</translation> <translation id="2218443599109088993">Uzoqlashtirish</translation> <translation id="2230173723195178503">Veb-sahifa yuklandi</translation> <translation id="2239626343334228536">Brauzer tarixini tozalash...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Sahifa ichidan qidirish</translation> <translation id="4049507953662678203">Internet yoniqligini tekshiring va qayta urinib ko‘ring.</translation> <translation id="4079195788735381731">Tashkilotingiz sizni hisobdan chiqardi</translation> -<translation id="4082688844002261427">Moslashtirilgan qidiruv, reklama va boshqa tashriflar tarixi parametrlarini tanlang</translation> <translation id="408404951701638773">Qidiruv paneli endi yanada qulay joyda</translation> <translation id="411254640334432676">Yuklab olishda xatolik yuz berdi.</translation> <translation id="4112644173421521737">Qidiruv</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Yaqin-atrofingizdagi qurilmalar tarqatayotgan veb-sahifalarni aniqlash imkonini beradi.</translation> <translation id="5758631781033351321">Brauzer mutolaa roʻyxati shu yerda chiqadi</translation> <translation id="5782227691023083829">Tarjima qilinmoqda...</translation> -<translation id="5797070761912323120">Qidiruv, rekama va boshqa xizmatlarni sizga moslashtirish uchun Google tarix maʼlumotlaringizdan foydalanishi mumkin</translation> <translation id="5803566855766646066">Bu yangi karta inkor etilsinmi?</translation> <translation id="5812974770859303494">Kiritish...</translation> <translation id="5816228676161003208">Ovoz orqali tezroq qidirish imkonini beradi.</translation> @@ -495,7 +492,7 @@ <translation id="6108923351542677676">Sozlanmoqda...</translation> <translation id="6119050551270742952">Bu sahifa inkognito rejimida</translation> <translation id="6122191549521593678">Onlayn</translation> -<translation id="6127379762771434464">Havola o‘chirildi</translation> +<translation id="6127379762771434464">Havola olib tashlandi</translation> <translation id="6136914049981179737">Yaqinda</translation> <translation id="6144589619057374135">${url} sahifasini Inkognito rejimida ochish</translation> <translation id="6177442314419606057">Chromedan qidirish</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ta maqola ochilmagan.</translation> <translation id="7412027924265291969">Davom etish</translation> <translation id="7425346204213733349">Endi xatcho‘plar, brauzer tarixi va boshqa sozlamalaringiz Google hisobingizga sinxronlanmaydi. Shunday bo‘lsa-da, mavjud ma’lumotlaringiz Google hisobingizda saqlanib qoladi.</translation> +<translation id="7431991332293347422">Moslashtirilgan qidiruv, reklama va boshqa tashriflar tarixi parametrlarini tanlang</translation> <translation id="7435356471928173109">Administrator tomonidan faolsizlantirilgan</translation> <translation id="7454057999980797137">Hudud</translation> <translation id="7456847797759667638">Manzilni ochish...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 16f276a..0c02b4b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Đăng nhập…</translation> <translation id="2149973817440762519">Chỉnh sửa dấu trang</translation> <translation id="2175927920773552910">Mã QR</translation> -<translation id="2198757192731523470">Google có thể sử dụng lịch sử của bạn để cá nhân hóa tính năng Tìm kiếm, quảng cáo và các dịch vụ khác của Google.</translation> <translation id="2218443599109088993">Thu nhỏ</translation> <translation id="2230173723195178503">Đã tải trang web</translation> <translation id="2239626343334228536">Đang xóa dữ liệu duyệt web...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Tìm trong trang</translation> <translation id="4049507953662678203">Hãy đảm bảo rằng bạn có kết nối mạng và thử lại.</translation> <translation id="4079195788735381731">Bạn đã bị đăng xuất khỏi tài khoản tổ chức của mình</translation> -<translation id="4082688844002261427">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm, quảng cáo và các dịch vụ khác</translation> <translation id="408404951701638773">Thanh tìm kiếm giờ đây dễ truy cập hơn</translation> <translation id="411254640334432676">Tải xuống không thành công.</translation> <translation id="4112644173421521737">Tìm kiếm</translation> @@ -407,6 +405,7 @@ <translation id="5197255632782567636">Internet</translation> <translation id="5210365745912300556">Đóng thẻ</translation> <translation id="5228579091201413441">Bật đồng bộ hóa</translation> +<translation id="5232485538978018676">Đăng nhập bằng Tài khoản được quản lý</translation> <translation id="5234764350956374838">Bỏ qua</translation> <translation id="5245322853195994030">Hủy đồng bộ hóa</translation> <translation id="5271549068863921519">Lưu mật khẩu</translation> @@ -452,7 +451,6 @@ <translation id="5738887413654608789">Tính năng này cho phép bạn khám phá các trang web có liên quan dựa trên những thứ xung quanh bạn.</translation> <translation id="5758631781033351321">Bạn sẽ thấy danh sách đọc ở đây</translation> <translation id="5782227691023083829">Đang dịch...</translation> -<translation id="5797070761912323120">Google có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm, quảng cáo và các dịch vụ khác của Google cho phù hợp với bạn</translation> <translation id="5803566855766646066">Bạn có chắc chắn muốn hủy thẻ mới này không?</translation> <translation id="5812974770859303494">Thêm vào...</translation> <translation id="5816228676161003208">Điều này cho phép bạn tìm kiếm nhanh hơn bằng giọng nói.</translation> @@ -649,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> bài viết chưa đọc.</translation> <translation id="7412027924265291969">Tiếp tục</translation> <translation id="7425346204213733349">Các thay đổi đối với dấu trang, lịch sử, mật khẩu và các tùy chọn cài đặt khác sẽ không đồng bộ hóa với Tài khoản Google của bạn nữa. Tuy nhiên, dữ liệu hiện có của bạn sẽ vẫn được lưu trữ trong tài khoản Google của bạn.</translation> +<translation id="7431991332293347422">Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa dịch vụ Tìm kiếm và các dịch vụ khác</translation> <translation id="7435356471928173109">Quản trị viên đã tắt</translation> <translation id="7454057999980797137">Tiểu bang/quận</translation> <translation id="7456847797759667638">Mở Vị trí...</translation> @@ -723,6 +722,7 @@ <translation id="8206354486702514201">Cài đặt này được quản trị viên của bạn thực thi.</translation> <translation id="8225985093977202398">Tệp và hình ảnh được lưu vào bộ nhớ đệm</translation> <translation id="8261506727792406068">Xóa</translation> +<translation id="8271720166617117963">Chấp nhận và Đăng nhập</translation> <translation id="8281781826761538115">Mặc định - <ph name="DEFAULT_LOCALE" /></translation> <translation id="8281886186245836920">Bỏ qua</translation> <translation id="8283172974887967105">Đặt…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index e8d90dd5..1371805 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">登录…</translation> <translation id="2149973817440762519">修改书签</translation> <translation id="2175927920773552910">二维码</translation> -<translation id="2198757192731523470">Google 可能会利用您的历史记录为您提供个性化的 Google 搜索、广告和其他 Google 服务。</translation> <translation id="2218443599109088993">缩小</translation> <translation id="2230173723195178503">已加载网页</translation> <translation id="2239626343334228536">正在清除浏览数据…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">在网页上查找</translation> <translation id="4049507953662678203">请确保已连接到网络,然后重试。</translation> <translation id="4079195788735381731">贵组织已强制您退出登录</translation> -<translation id="4082688844002261427">控制 Google 如何利用您的浏览记录为您提供个性化的搜索、广告和其他服务</translation> <translation id="408404951701638773">现在可以更方便地使用搜索栏</translation> <translation id="411254640334432676">下载失败。</translation> <translation id="4112644173421521737">搜索</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">这样可让您找到与目前周遭环境相关的网页。</translation> <translation id="5758631781033351321">您的阅读清单会显示在此处</translation> <translation id="5782227691023083829">正在翻译...</translation> -<translation id="5797070761912323120">Google 可能会利用您的历史记录为您提供个性化的 Google 搜索、广告和其他 Google 服务</translation> <translation id="5803566855766646066">确定要舍弃这张新信用卡吗?</translation> <translation id="5812974770859303494">添加到…</translation> <translation id="5816228676161003208">这样,您就可以使用语音更快速地进行搜索。</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906">有 <ph name="UNREAD_COUNT" /> 篇未读文章。</translation> <translation id="7412027924265291969">继续</translation> <translation id="7425346204213733349">对您的书签、历史记录、密码及其他设置所做的更改将不再同步到您的 Google 帐号。但现有数据将继续存储在您的 Google 帐号中。</translation> +<translation id="7431991332293347422">控制 Google 如何利用您的浏览记录为您提供个性化的 Google 搜索和其他 Google 服务</translation> <translation id="7435356471928173109">已被您的管理员关闭</translation> <translation id="7454057999980797137">省/区/县</translation> <translation id="7456847797759667638">打开位置...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index ef53f54..8267b09 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">登入…</translation> <translation id="2149973817440762519">編輯書籤</translation> <translation id="2175927920773552910">二維條碼</translation> -<translation id="2198757192731523470">Google 可能會使用您的記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務。</translation> <translation id="2218443599109088993">縮小</translation> <translation id="2230173723195178503">已載入網頁</translation> <translation id="2239626343334228536">正在清除瀏覽資料…</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">在網頁中查找</translation> <translation id="4049507953662678203">請確定您已連接網絡,然後再試一次。</translation> <translation id="4079195788735381731">您的機構已將您登出</translation> -<translation id="4082688844002261427">控制系統如何使用您的瀏覽記錄為您提供個人化的搜尋內容、廣告和其他服務</translation> <translation id="408404951701638773">簡易存取搜尋列</translation> <translation id="411254640334432676">下載失敗。</translation> <translation id="4112644173421521737">搜尋</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">這樣您便可根據周圍環境探索相關網頁。</translation> <translation id="5758631781033351321">您可在此查看閱讀清單</translation> <translation id="5782227691023083829">正在翻譯...</translation> -<translation id="5797070761912323120">Google 可能會使用您的記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務</translation> <translation id="5803566855766646066">確定要捨棄這張新的信用卡嗎?</translation> <translation id="5812974770859303494">新增至…</translation> <translation id="5816228676161003208">這樣您便可使用語音更快速地搜尋內容。</translation> @@ -648,6 +645,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> 篇未讀嘅文章。</translation> <translation id="7412027924265291969">繼續</translation> <translation id="7425346204213733349">系統不會將您變更的書籤、記錄、密碼和其他設定繼續同步至您的 Google 帳戶,但 Google 帳戶內現有的資料仍會保留。</translation> +<translation id="7431991332293347422">控制系統如何使用您的瀏覽記錄,為您提供個人化的搜尋內容和其他服務</translation> <translation id="7435356471928173109">已由管理員關閉</translation> <translation id="7454057999980797137">州/縣</translation> <translation id="7456847797759667638">開啟位置…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 3cbf71a..df7b1472 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">登入…</translation> <translation id="2149973817440762519">編輯書籤</translation> <translation id="2175927920773552910">QR 圖碼</translation> -<translation id="2198757192731523470">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務。</translation> <translation id="2218443599109088993">縮小</translation> <translation id="2230173723195178503">已載入網頁</translation> <translation id="2239626343334228536">正在清除瀏覽資料...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">在網頁中查找</translation> <translation id="4049507953662678203">請確定您已連上網路,然後再試一次。</translation> <translation id="4079195788735381731">貴機構已將你登出帳戶</translation> -<translation id="4082688844002261427">控管 Google 如何使用你的瀏覽記錄,為你提供個人化的搜尋服務、廣告和其他內容</translation> <translation id="408404951701638773">現在使用搜尋列更加方便了</translation> <translation id="411254640334432676">下載失敗。</translation> <translation id="4112644173421521737">搜尋</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">可讓你找到與目前周遭環境相關的網頁。</translation> <translation id="5758631781033351321">這裡會顯示你的閱讀清單</translation> <translation id="5782227691023083829">正在翻譯...</translation> -<translation id="5797070761912323120">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務</translation> <translation id="5803566855766646066">確定要捨棄這張新的信用卡嗎?</translation> <translation id="5812974770859303494">新增至...</translation> <translation id="5816228676161003208">可讓你使用語音搜尋功能,查詢資訊更方便。</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> 篇未讀文章。</translation> <translation id="7412027924265291969">繼續</translation> <translation id="7425346204213733349">你更改過的書籤、歷史記錄、密碼和其他設定不會繼續與 Google 帳戶中的資料保持同步,但是 Google 帳戶現有的資料仍會保留。</translation> +<translation id="7431991332293347422">控制 Google 使用瀏覽記錄提供個人化搜尋服務和其他內容的方式</translation> <translation id="7435356471928173109">已由系統管理員停用</translation> <translation id="7454057999980797137">州/縣</translation> <translation id="7456847797759667638">開啟位置...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 20ea4716..ee3063b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -117,7 +117,6 @@ <translation id="214201757571129614">Ukungena ngemvume…</translation> <translation id="2149973817440762519">Hlela ibhukhimakhi</translation> <translation id="2175927920773552910">Ikhodi ye-QR</translation> -<translation id="2198757192731523470">I-Google ingasebenzisa umlando wakho ukuze yenze ngendlela ofisa ngayoyo usesho, izikhangiso, namanye amasevisi e-Google.</translation> <translation id="2218443599109088993">Hlehlisa isithombe</translation> <translation id="2230173723195178503">Ikhasi lewebhu lilayishiwe</translation> <translation id="2239626343334228536">Isula idatha yokuphequlula...</translation> @@ -298,7 +297,6 @@ <translation id="4042870976416480368">Thola ekhasini</translation> <translation id="4049507953662678203">Qiniseksa ukuthi unoxhumo lenethiwekhi, bese uyazama futhi.</translation> <translation id="4079195788735381731">Inhlangano yakho ikukhiphe ngemvume</translation> -<translation id="4082688844002261427">Lawula ukuthi umlando wakho wokuphequlula usetshenziswa kanjani ukuze kwenziwe kube ngokwakho usesho, izikhangiso nokuningi</translation> <translation id="408404951701638773">Ibha losesho manje lifinyeleleka kalula</translation> <translation id="411254640334432676">Ukulanda kuhlulekile.</translation> <translation id="4112644173421521737">Sesha</translation> @@ -453,7 +451,6 @@ <translation id="5738887413654608789">Lokhu kukuvumela ukuthi uthole amakhasi ewebhu ahambisanayo asuselwa kuzindawo zakho eziseduze.</translation> <translation id="5758631781033351321">Uzothola uhlu lwakho lokufunda lapha</translation> <translation id="5782227691023083829">Iyahumusha...</translation> -<translation id="5797070761912323120">I-Google ingasebenzisa umlando wakho ukuze yenze kube ngokwakho usesho, izikhangiso, namanye amasevisi e-Google</translation> <translation id="5803566855766646066">Ingabe uqinisekile ukuthi ufuna ukulahla leli khadi elisha?</translation> <translation id="5812974770859303494">Engeza Ku...</translation> <translation id="5816228676161003208">Lokhu kukuvumela ukuthi useshe ngokushesha usebenzisa izwi lakho.</translation> @@ -650,6 +647,7 @@ <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> ama-athikili angafundiwe.</translation> <translation id="7412027924265291969">Qhubeka</translation> <translation id="7425346204213733349">Izinguquko kumabhukhimakhi akho, umlando, amaphasiwedi, nezinye izilungiselelo ngeke kusavumelaniswa ku-akhawunti yakho ye-Google. Yize kunjalo, idatha yakho ekhona izohlala igcinwe ku-akhawunti yakho ye-Google.</translation> +<translation id="7431991332293347422">Lawula ukuthi umlando wakho wokuphequlula usetshenziswa kanjani ukuze kwenziwe kube ngokwakho Usesho nokuningi</translation> <translation id="7435356471928173109">Ivalwe ngumlawuli wakho</translation> <translation id="7454057999980797137">Uhulumeni / Izwe</translation> <translation id="7456847797759667638">Vula indawo...</translation>
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn b/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn index 790b0cf5..08fda1a4 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/browser_agent/BUILD.gn
@@ -33,6 +33,7 @@ "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/autofill_address_profile", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords", + "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_card", "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/translate", "//ios/chrome/browser/main:public",
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm b/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm index 6f6f1c7..0c8aa83 100644 --- a/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm +++ b/ios/chrome/browser/infobars/overlays/browser_agent/infobar_overlay_browser_agent_util.mm
@@ -10,6 +10,7 @@ #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm/confirm_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/update_password_infobar_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/save_card/save_card_infobar_interaction_handler.h" #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/translate/translate_infobar_interaction_handler.h" #import "ios/chrome/browser/ui/infobars/infobar_feature.h" @@ -36,4 +37,6 @@ std::make_unique<SaveCardInfobarInteractionHandler>()); browser_agent->AddInfobarInteractionHandler( std::make_unique<SaveAddressProfileInfobarInteractionHandler>()); + browser_agent->AddInfobarInteractionHandler( + std::make_unique<AddToReadingListInfobarInteractionHandler>(browser)); }
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/BUILD.gn b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/BUILD.gn new file mode 100644 index 0000000..3203283 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/BUILD.gn
@@ -0,0 +1,34 @@ +# Copyright 2021 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("reading_list") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "add_to_reading_list_infobar_banner_interaction_handler.h", + "add_to_reading_list_infobar_banner_interaction_handler.mm", + "add_to_reading_list_infobar_interaction_handler.h", + "add_to_reading_list_infobar_interaction_handler.mm", + "add_to_reading_list_infobar_modal_overlay_request_callback_installer.h", + "add_to_reading_list_infobar_modal_overlay_request_callback_installer.mm", + "add_to_reading_list_modal_infobar_interaction_handler.h", + "add_to_reading_list_modal_infobar_interaction_handler.mm", + ] + deps = [ + "//base", + "//components/autofill/core/browser", + "//ios/chrome/browser/infobars", + "//ios/chrome/browser/infobars:public", + "//ios/chrome/browser/infobars/overlays", + "//ios/chrome/browser/infobars/overlays:util", + "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers", + "//ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common", + "//ios/chrome/browser/main:public", + "//ios/chrome/browser/overlays", + "//ios/chrome/browser/overlays/public/infobar_banner", + "//ios/chrome/browser/overlays/public/infobar_modal", + "//ios/chrome/browser/reading_list", + "//ios/chrome/browser/ui/reading_list:infobar", + "//ios/chrome/browser/web_state_list", + ] +}
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.h new file mode 100644 index 0000000..c9b137e --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.h
@@ -0,0 +1,29 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_BANNER_INTERACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_BANNER_INTERACTION_HANDLER_H_ + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler.h" + +class Browser; +class IOSAddToReadingListInfobarDelegate; + +// Helper object that updates the model layer for interaction events with the +// add to reading list infobar banner UI. +class AddToReadingListInfobarBannerInteractionHandler + : public InfobarBannerInteractionHandler { + public: + AddToReadingListInfobarBannerInteractionHandler(Browser* browser); + ~AddToReadingListInfobarBannerInteractionHandler() override; + + // InfobarBannerInteractionHandler: + void MainButtonTapped(InfoBarIOS* infobar) override; + void BannerVisibilityChanged(InfoBarIOS* infobar, bool visible) override {} + + private: + IOSAddToReadingListInfobarDelegate* GetInfobarDelegate(InfoBarIOS* infobar); +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_BANNER_INTERACTION_HANDLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.mm new file mode 100644 index 0000000..797ca25a --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.mm
@@ -0,0 +1,45 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.h" + +#include "base/check.h" +#include "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/main/browser.h" +#import "ios/chrome/browser/overlays/public/infobar_banner/add_to_reading_list_infobar_banner_overlay_request_config.h" +#import "ios/chrome/browser/overlays/public/infobar_banner/save_card_infobar_banner_overlay_request_config.h" +#import "ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using reading_list_infobar_overlay::ReadingListBannerRequestConfig; + +#pragma mark - InfobarBannerInteractionHandler + +AddToReadingListInfobarBannerInteractionHandler:: + AddToReadingListInfobarBannerInteractionHandler(Browser* browser) + : InfobarBannerInteractionHandler( + ReadingListBannerRequestConfig::RequestSupport()) {} + +AddToReadingListInfobarBannerInteractionHandler:: + ~AddToReadingListInfobarBannerInteractionHandler() = default; + +void AddToReadingListInfobarBannerInteractionHandler::MainButtonTapped( + InfoBarIOS* infobar) { + GetInfobarDelegate(infobar)->Accept(); +} + +#pragma mark - Private + +IOSAddToReadingListInfobarDelegate* +AddToReadingListInfobarBannerInteractionHandler::GetInfobarDelegate( + InfoBarIOS* infobar) { + IOSAddToReadingListInfobarDelegate* delegate = + IOSAddToReadingListInfobarDelegate::FromInfobarDelegate( + infobar->delegate()); + DCHECK(delegate); + return delegate; +}
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.h new file mode 100644 index 0000000..4f60bda --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.h
@@ -0,0 +1,21 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_INTERACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_INTERACTION_HANDLER_H_ + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/infobar_interaction_handler.h" + +class Browser; + +// An InfobarInteractionHandler that updates the model layer for interaction +// events with the UI for add to reading list infobars. +class AddToReadingListInfobarInteractionHandler + : public InfobarInteractionHandler { + public: + AddToReadingListInfobarInteractionHandler(Browser* browser); + ~AddToReadingListInfobarInteractionHandler() override; +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_INTERACTION_HANDLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.mm new file mode 100644 index 0000000..f025a27 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.mm
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_interaction_handler.h" + +#import "ios/chrome/browser/infobars/infobar_type.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_banner_interaction_handler.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +AddToReadingListInfobarInteractionHandler:: + AddToReadingListInfobarInteractionHandler(Browser* browser) + : InfobarInteractionHandler( + InfobarType::kInfobarTypeAddToReadingList, + std::make_unique<AddToReadingListInfobarBannerInteractionHandler>( + browser), + std::make_unique<ReadingListInfobarModalInteractionHandler>()) {} + +AddToReadingListInfobarInteractionHandler:: + ~AddToReadingListInfobarInteractionHandler() = default;
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.h new file mode 100644 index 0000000..a635add --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.h
@@ -0,0 +1,45 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_ + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_modal_overlay_request_callback_installer.h" + +#include "base/memory/weak_ptr.h" + +class ReadingListInfobarModalInteractionHandler; + +namespace reading_list_infobar_overlay { + +// Callback installer, intended to be subclassed, for infobar modal interaction +// events. +class ModalRequestCallbackInstaller + : public InfobarModalOverlayRequestCallbackInstaller { + public: + // Constructor for an instance that installs callbacks that forward + // interaction events to |interaction_handler|. + explicit ModalRequestCallbackInstaller( + ReadingListInfobarModalInteractionHandler* interaction_handler); + ~ModalRequestCallbackInstaller() override; + + private: + // Used as a callback for OverlayResponses dispatched through |request|'s + // callback manager. The OverlayDispatchCallback is created with an + // OverlayResponseSupport that guarantees that |response| is created with a + // reading_list_infobar_modal_responses::NeverAsk. + void NeverAskCallback(OverlayRequest* request, OverlayResponse* response); + + // OverlayRequestCallbackInstaller: + void InstallCallbacksInternal(OverlayRequest* request) override; + + // The handler for received responses. + ReadingListInfobarModalInteractionHandler* interaction_handler_ = nullptr; + + base::WeakPtrFactory<ModalRequestCallbackInstaller> weak_factory_{this}; +}; + +} // namespace reading_list_infobar_overlay + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_INFOBAR_MODAL_OVERLAY_REQUEST_CALLBACK_INSTALLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.mm new file mode 100644 index 0000000..2c41a2af --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.mm
@@ -0,0 +1,61 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.h" + +#include "base/bind.h" +#include "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.h" +#include "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h" +#import "ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_request_config.h" +#import "ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.h" +#include "ios/chrome/browser/overlays/public/overlay_callback_manager.h" +#import "ios/chrome/browser/overlays/public/overlay_response.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using reading_list_infobar_modal_responses::NeverAsk; + +namespace reading_list_infobar_overlay { + +ModalRequestCallbackInstaller::ModalRequestCallbackInstaller( + ReadingListInfobarModalInteractionHandler* interaction_handler) + : InfobarModalOverlayRequestCallbackInstaller( + ReadingListInfobarModalOverlayRequestConfig::RequestSupport(), + interaction_handler), + interaction_handler_(interaction_handler) { + DCHECK(interaction_handler_); +} + +ModalRequestCallbackInstaller::~ModalRequestCallbackInstaller() = default; + +#pragma mark - Private + +void ModalRequestCallbackInstaller::NeverAskCallback( + OverlayRequest* request, + OverlayResponse* response) { + InfoBarIOS* infobar = GetOverlayRequestInfobar(request); + if (!infobar) + return; + + interaction_handler_->NeverAsk(infobar); +} + +#pragma mark - OverlayRequestCallbackInstaller + +void ModalRequestCallbackInstaller::InstallCallbacksInternal( + OverlayRequest* request) { + InfobarModalOverlayRequestCallbackInstaller::InstallCallbacksInternal( + request); + OverlayCallbackManager* manager = request->GetCallbackManager(); + + manager->AddDispatchCallback(OverlayDispatchCallback( + base::BindRepeating(&ModalRequestCallbackInstaller::NeverAskCallback, + weak_factory_.GetWeakPtr(), request), + NeverAsk::ResponseSupport())); +} + +} // namespace reading_list_infobar_overlay
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.h b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.h new file mode 100644 index 0000000..fd0c7f99 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.h
@@ -0,0 +1,38 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_MODAL_INFOBAR_INTERACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_MODAL_INFOBAR_INTERACTION_HANDLER_H_ + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_modal_interaction_handler.h" + +class IOSAddToReadingListInfobarDelegate; + +// Helper object that updates the model layer for interaction events with the +// Reading List infobar modal UI. +class ReadingListInfobarModalInteractionHandler + : public InfobarModalInteractionHandler { + public: + ReadingListInfobarModalInteractionHandler(); + ~ReadingListInfobarModalInteractionHandler() override; + + // Instructs the handler that the user has used |infobar|'s modal UI to + // request that the Reading List banner never be shown. + virtual void NeverAsk(InfoBarIOS* infobar); + + // InfobarModalInteractionHandler: + void PerformMainAction(InfoBarIOS* infobar) override; + + // InfobarInteractionHandler::Handler: + void InfobarVisibilityChanged(InfoBarIOS* infobar, bool visible) override {} + + private: + // InfobarModalInteractionHandler: + std::unique_ptr<InfobarModalOverlayRequestCallbackInstaller> + CreateModalInstaller() override; + + IOSAddToReadingListInfobarDelegate* GetDelegate(InfoBarIOS* infobar); +}; + +#endif // IOS_CHROME_BROWSER_INFOBARS_OVERLAYS_BROWSER_AGENT_INTERACTION_HANDLERS_READING_LIST_ADD_TO_READING_LIST_MODAL_INFOBAR_INTERACTION_HANDLER_H_
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.mm new file mode 100644 index 0000000..526601d8 --- /dev/null +++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.mm
@@ -0,0 +1,54 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_modal_infobar_interaction_handler.h" + +#include "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/reading_list/add_to_reading_list_infobar_modal_overlay_request_callback_installer.h" +#import "ios/chrome/browser/ui/reading_list/ios_add_to_reading_list_infobar_delegate.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using reading_list_infobar_overlay::ModalRequestCallbackInstaller; + +ReadingListInfobarModalInteractionHandler:: + ReadingListInfobarModalInteractionHandler() = default; + +ReadingListInfobarModalInteractionHandler:: + ~ReadingListInfobarModalInteractionHandler() = default; + +#pragma mark - Public + +void ReadingListInfobarModalInteractionHandler::NeverAsk(InfoBarIOS* infobar) { + // TODO(crbug.com/1195978): Save Never Ask pref. + + // Remove infobar. + infobar->RemoveSelf(); +} + +#pragma mark - InfobarModalInteractionHandler + +void ReadingListInfobarModalInteractionHandler::PerformMainAction( + InfoBarIOS* infobar) { + IOSAddToReadingListInfobarDelegate* delegate = GetDelegate(infobar); + delegate->Accept(); +} + +#pragma mark - Private + +std::unique_ptr<InfobarModalOverlayRequestCallbackInstaller> +ReadingListInfobarModalInteractionHandler::CreateModalInstaller() { + return std::make_unique<ModalRequestCallbackInstaller>(this); +} + +IOSAddToReadingListInfobarDelegate* +ReadingListInfobarModalInteractionHandler::GetDelegate(InfoBarIOS* infobar) { + IOSAddToReadingListInfobarDelegate* delegate = + IOSAddToReadingListInfobarDelegate::FromInfobarDelegate( + infobar->delegate()); + DCHECK(delegate); + return delegate; +}
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/BUILD.gn b/ios/chrome/browser/overlays/public/infobar_modal/BUILD.gn index 511c53b2..b507382 100644 --- a/ios/chrome/browser/overlays/public/infobar_modal/BUILD.gn +++ b/ios/chrome/browser/overlays/public/infobar_modal/BUILD.gn
@@ -12,6 +12,8 @@ "password_infobar_modal_overlay_responses.mm", "reading_list_modal_overlay_request_config.h", "reading_list_modal_overlay_request_config.mm", + "reading_list_modal_overlay_responses.h", + "reading_list_modal_overlay_responses.mm", "save_address_profile_infobar_modal_overlay_request_config.h", "save_address_profile_infobar_modal_overlay_request_config.mm", "save_address_profile_infobar_modal_overlay_responses.h",
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.h b/ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.h new file mode 100644 index 0000000..0a18e905 --- /dev/null +++ b/ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.h
@@ -0,0 +1,20 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_MODAL_READING_LIST_MODAL_OVERLAY_RESPONSES_H_ +#define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_MODAL_READING_LIST_MODAL_OVERLAY_RESPONSES_H_ + +#import <Foundation/Foundation.h> + +#include "ios/chrome/browser/overlays/public/overlay_response_info.h" + +namespace reading_list_infobar_modal_responses { + +// Response info used to create dispatched OverlayResponses that notify the +// add to reading list infobar to never prompt. +DEFINE_STATELESS_OVERLAY_RESPONSE_INFO(NeverAsk); + +} // namespace reading_list_infobar_modal_responses + +#endif // IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_INFOBAR_MODAL_READING_LIST_MODAL_OVERLAY_RESPONSES_H_
diff --git a/ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.mm b/ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.mm new file mode 100644 index 0000000..f56fa45 --- /dev/null +++ b/ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.mm
@@ -0,0 +1,15 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace reading_list_infobar_modal_responses { + +OVERLAY_USER_DATA_SETUP_IMPL(NeverAsk); + +} // namespace reading_list_infobar_modal_responses
diff --git a/ios/chrome/browser/reading_list/url_downloader.cc b/ios/chrome/browser/reading_list/url_downloader.cc index 78ce9499..7a7af013 100644 --- a/ios/chrome/browser/reading_list/url_downloader.cc +++ b/ios/chrome/browser/reading_list/url_downloader.cc
@@ -300,12 +300,10 @@ return; } - std::vector<dom_distiller::DistillerViewer::ImageInfo> images_block = images; - std::string block_html = html; task_tracker_.PostTaskAndReplyWithResult( task_runner_.get(), FROM_HERE, base::BindOnce(&URLDownloader::SaveDistilledHTML, base::Unretained(this), - page_url, images_block, block_html), + page_url, images, html), base::BindOnce(&URLDownloader::DownloadCompletionHandler, base::Unretained(this), page_url, title, reading_list::OfflinePagePath(
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm index 813cf938..ec247e01 100644 --- a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm +++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
@@ -24,25 +24,43 @@ #endif namespace { -id<GREYMatcher> CopyButton() { - return grey_allOf( - grey_accessibilityTrait(UIAccessibilityTraitButton), - grey_descendant( - chrome_test_util::StaticTextWithAccessibilityLabel(@"Copy")), - nil); -} // Assert the activity service is visible by checking the "copy" button. void AssertActivityServiceVisible() { - [[EarlGrey selectElementWithMatcher:CopyButton()] + [[EarlGrey + selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabel( + @"Copy")] assertWithMatcher:grey_interactable()]; } // Assert the activity service is not visible by checking the "copy" button. void AssertActivityServiceNotVisible() { - [[EarlGrey selectElementWithMatcher:grey_allOf(CopyButton(), - grey_interactable(), nil)] - assertWithMatcher:grey_nil()]; + [[EarlGrey + selectElementWithMatcher: + grey_allOf(chrome_test_util::ButtonWithAccessibilityLabel(@"Copy"), + grey_interactable(), nil)] assertWithMatcher:grey_nil()]; +} + +// Returns a button with a print label. +id<GREYMatcher> PrintButton() { + return chrome_test_util::ButtonWithAccessibilityLabel(@"Print"); +} + +// Returns a button with a copy label. +id<GREYMatcher> CopyButton() { + return chrome_test_util::ButtonWithAccessibilityLabel(@"Copy"); +} + +// Returns the collection view for the activity services menu. Since this is a +// system widget, it does not have an a11y id. Instead, search for a +// UICollectionView that is the superview of the "Copy" menu item. There are +// two nested UICollectionViews in the activity services menu, so choose the +// innermost one. +id<GREYMatcher> ShareMenuCollectionView() { + return grey_allOf( + grey_kindOfClass([UICollectionView class]), grey_descendant(CopyButton()), + // Looking for a nested UICollectionView. + grey_descendant(grey_kindOfClass([UICollectionView class])), nil); } } // namespace @@ -53,6 +71,37 @@ @implementation ActivityServiceControllerTestCase +// TODO(crbug.com/747622): re-enable this test on once earl grey can interact +// with the share menu. +// TODO(crbug.com/864597): Reenable this test. This test should be rewritten +// to use Offline Version. +- (void)DISABLED_testActivityServiceControllerCantPrintUnprintablePages { + std::unique_ptr<web::DataResponseProvider> provider( + new ErrorPageResponseProvider()); + web::test::SetUpHttpServer(std::move(provider)); + + // Open a page with an error. + [ChromeEarlGrey loadURL:ErrorPageResponseProvider::GetDnsFailureUrl()]; + + // Verify that you can share, but that the Print action is not available. + [ChromeEarlGreyUI openShareMenu]; + AssertActivityServiceVisible(); + + // To verify that the Print action is missing, scroll through the entire + // collection view using grey_scrollInDirection(), then make sure the + // operation failed with kGREYInteractionElementNotFoundErrorCode. + NSError* error; + [[[EarlGrey selectElementWithMatcher:PrintButton()] + usingSearchAction:grey_scrollInDirection(kGREYDirectionRight, 100) + onElementWithMatcher:ShareMenuCollectionView()] + assertWithMatcher:grey_notNil() + error:&error]; + + GREYAssert([error.domain isEqual:kGREYInteractionErrorDomain] && + error.code == kGREYInteractionElementNotFoundErrorCode, + @"Print action was unexpectedly present"); +} + - (void)testActivityServiceControllerIsDisabled { // TODO(crbug.com/996541) Starting in Xcode 11 beta 6, the share button does // not appear (even with a delay) flakily. @@ -71,7 +120,7 @@ // TODO(crbug.com/747622): re-enable this test once earl grey can interact // with the share menu. -- (void)testOpenActivityServiceControllerAndCopy { +- (void)DISABLED_testOpenActivityServiceControllerAndCopy { // Set up mock http server. std::map<GURL, std::string> responses; GURL url = web::test::HttpServer::MakeUrl("http://potato");
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm index cbe38ae..ddcc76ac 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
@@ -255,7 +255,8 @@ // Tests that the input accessory view continues working after a picker is // present. -- (void)testInputAccessoryBarIsPresentAfterPickers { +// TODO(crbug.com/1218869): Re-enable this test. +- (void)DISABLED_testInputAccessoryBarIsPresentAfterPickers { // Add the profile to be used. [AutofillAppInterface saveExampleProfile]; @@ -395,7 +396,8 @@ // Test the input accessory bar is present when undocking then docking the // keyboard. -- (void)testInputAccessoryBarIsPresentAfterUndockingKeyboard { +// TODO(crbug.com/1218869): Re-enable this test. +- (void)DISABLED_testInputAccessoryBarIsPresentAfterUndockingKeyboard { if (![ChromeEarlGrey isIPadIdiom]) { EARL_GREY_TEST_SKIPPED(@"Test not applicable for iPhone."); }
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm index abaa8d4..609d0ca 100644 --- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -49,6 +49,8 @@ @implementation FirstRunTestCase - (void)setUp { + [[self class] testForStartup]; + [super setUp]; [FirstRunAppInterface setUMACollectionEnabled:NO]; [FirstRunAppInterface resetUMACollectionEnabledByDefault]; @@ -64,13 +66,19 @@ AppLaunchConfiguration config; config.features_disabled.push_back(kLocationPermissionsPrompt); config.features_disabled.push_back(kEnableFREUIModuleIOS); + + // Show the First Run UI at startup. + config.additional_args.push_back("-FirstRunForceEnabled"); + config.additional_args.push_back("true"); + + // Relaunch app at each test to rewind the startup state. + config.relaunch_policy = ForceRelaunchByKilling; + return config; } // Navigates to the terms of service and back. - (void)testTermsAndConditions { - [FirstRunAppInterface showFirstRunUI]; - id<GREYMatcher> termsOfServiceLink = grey_accessibilityLabel(@"Terms of Service"); [[EarlGrey selectElementWithMatcher:termsOfServiceLink] @@ -102,8 +110,6 @@ // Toggle the UMA checkbox. - (void)testToggleMetricsOn { - [FirstRunAppInterface showFirstRunUI]; - id<GREYMatcher> metrics = grey_accessibilityID(first_run::kUMAMetricsButtonAccessibilityIdentifier); [[EarlGrey selectElementWithMatcher:metrics] performAction:grey_tap()]; @@ -123,8 +129,6 @@ // Dismisses the first run screens. - (void)testDismissFirstRun { - [FirstRunAppInterface showFirstRunUI]; - [[EarlGrey selectElementWithMatcher:FirstRunOptInAcceptButton()] performAction:grey_tap()]; @@ -145,7 +149,6 @@ [SigninEarlGrey addFakeIdentity:fakeIdentity]; // Launch First Run and accept tems of services. - [FirstRunAppInterface showFirstRunUI]; [[EarlGrey selectElementWithMatcher:FirstRunOptInAcceptButton()] performAction:grey_tap()]; @@ -171,8 +174,6 @@ if (![ChromeEarlGrey areMultipleWindowsSupported]) EARL_GREY_TEST_DISABLED(@"Multiple windows can't be opened."); - [FirstRunAppInterface showFirstRunUI]; - [ChromeEarlGrey openNewWindow]; [ChromeEarlGrey waitForForegroundWindowCount:2];
diff --git a/ios/chrome/browser/ui/first_run/first_run_util.mm b/ios/chrome/browser/ui/first_run/first_run_util.mm index aca2c17..c2089d4 100644 --- a/ios/chrome/browser/ui/first_run/first_run_util.mm +++ b/ios/chrome/browser/ui/first_run/first_run_util.mm
@@ -137,12 +137,12 @@ } bool ShouldPresentFirstRunExperience() { - if (tests_hook::DisableFirstRun()) - return false; - if (experimental_flags::AlwaysDisplayFirstRun()) return true; + if (tests_hook::DisableFirstRun()) + return false; + if (kFirstRunSentinelCreated) return false;
diff --git a/ios/chrome/browser/ui/infobars/modals/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/BUILD.gn index 05596c9..c411778 100644 --- a/ios/chrome/browser/ui/infobars/modals/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/BUILD.gn
@@ -17,6 +17,8 @@ "infobar_password_table_view_controller.h", "infobar_password_table_view_controller.mm", "infobar_reading_list_modal_delegate.h", + "infobar_reading_list_table_view_controller.h", + "infobar_reading_list_table_view_controller.mm", "infobar_save_address_profile_modal_consumer.h", "infobar_save_address_profile_modal_delegate.h", "infobar_save_address_profile_table_view_controller.h",
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_modal_delegate.h b/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_modal_delegate.h index 10a0297c6..43be2d50 100644 --- a/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_modal_delegate.h +++ b/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_modal_delegate.h
@@ -9,6 +9,10 @@ // Delegate to handle Reading List Infobar Modal actions. @protocol InfobarReadingListModalDelegate <InfobarModalDelegate> + +// Indicates the user chose to be never asked to save to Reading List. +- (void)neverAskToAddToReadingList; + @end #endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_READING_LIST_MODAL_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.h b/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.h new file mode 100644 index 0000000..a6a0c0d1 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.h
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_READING_LIST_TABLE_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_READING_LIST_TABLE_VIEW_CONTROLLER_H_ + +#import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h" + +@protocol InfobarReadingListModalDelegate; + +// InfobarReadingListTableViewController represents the content for the Add to +// Reading List InfobarModal. +@interface InfobarReadingListTableViewController : ChromeTableViewController + +- (instancetype)initWithDelegate: + (id<InfobarReadingListModalDelegate>)modalDelegate + NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_INFOBAR_READING_LIST_TABLE_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.mm new file mode 100644 index 0000000..e1c22de --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.mm
@@ -0,0 +1,195 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.h" + +#include "base/mac/foundation_util.h" +#include "base/metrics/user_metrics.h" +#include "base/metrics/user_metrics_action.h" +#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h" +#import "ios/chrome/browser/ui/infobars/modals/infobar_reading_list_modal_delegate.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.h" +#import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h" +#import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h" +#import "ios/chrome/browser/ui/util/uikit_ui_util.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.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." +#endif + +namespace { +// Accessibility identifier of the Reading List Infobar Modal Add +// Button. +NSString* const kReadingListInfobarModalAddButtonAXId = + @"kReadingListInfobarModalAddButtonAXId"; +// Accessibility identifier of the Reading List Infobar Modal Never Ask +// Button. +NSString* const kReadingListInfobarModalNeverAskButtonAXId = + @"kReadingListInfobarModalNeverAskButtonAXId"; +} // namespace + +typedef NS_ENUM(NSInteger, SectionIdentifier) { + SectionIdentifierContent = kSectionIdentifierEnumZero, +}; + +typedef NS_ENUM(NSInteger, ItemType) { + ItemTypeInformationalText = kItemTypeEnumZero, + ItemTypeAddButton, + ItemTypeNeverButton, +}; + +@interface InfobarReadingListTableViewController () +// InfobarReadingListModalDelegate for this ViewController. +@property(nonatomic, weak) id<InfobarReadingListModalDelegate> + infobarModalDelegate; +@end + +@implementation InfobarReadingListTableViewController + +- (instancetype)initWithDelegate: + (id<InfobarReadingListModalDelegate>)modalDelegate { + self = [super initWithStyle:UITableViewStylePlain]; + if (self) { + _infobarModalDelegate = modalDelegate; + } + return self; +} + +#pragma mark - ViewController Lifecycle + +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor colorNamed:kBackgroundColor]; + self.styler.cellBackgroundColor = [UIColor colorNamed:kBackgroundColor]; + self.tableView.sectionHeaderHeight = 0; + [self.tableView + setSeparatorInset:UIEdgeInsetsMake(0, kTableViewHorizontalSpacing, 0, 0)]; + + // Configure the NavigationBar. + UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] + initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(dismissInfobarModal)]; + cancelButton.accessibilityIdentifier = kInfobarModalCancelButton; + self.navigationItem.leftBarButtonItem = cancelButton; + self.navigationController.navigationBar.prefersLargeTitles = NO; + + [self loadModel]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [self.infobarModalDelegate modalInfobarWasDismissed:self]; + [super viewDidDisappear:animated]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + self.tableView.scrollEnabled = + self.tableView.contentSize.height > self.view.frame.size.height; +} + +#pragma mark - TableViewModel + +- (void)loadModel { + [super loadModel]; + + TableViewModel* model = self.tableViewModel; + [model addSectionWithIdentifier:SectionIdentifierContent]; + + TableViewTextItem* timeThresholdContextInformationalItem = + [[TableViewTextItem alloc] initWithType:ItemTypeInformationalText]; + timeThresholdContextInformationalItem.text = + l10n_util::GetNSString(IDS_IOS_READING_LIST_MESSAGES_MODAL_DESCRIPTION); + [model addItem:timeThresholdContextInformationalItem + toSectionWithIdentifier:SectionIdentifierContent]; + + TableViewTextButtonItem* addButtonItem = + [self textButtonItemForType:ItemTypeAddButton + buttonText:l10n_util::GetNSString( + IDS_IOS_READING_LIST_MESSAGES_MAIN_ACTION) + accessibilityId:kReadingListInfobarModalAddButtonAXId]; + addButtonItem.disableButtonIntrinsicWidth = YES; + [model addItem:addButtonItem + toSectionWithIdentifier:SectionIdentifierContent]; + + TableViewTextButtonItem* neverAskItem = [self + textButtonItemForType:ItemTypeNeverButton + buttonText:l10n_util::GetNSString( + IDS_IOS_READING_LIST_MESSAGES_MODAL_NEVER_ASK) + accessibilityId:kReadingListInfobarModalNeverAskButtonAXId]; + neverAskItem.buttonTextColor = [UIColor colorNamed:kRedColor]; + neverAskItem.buttonBackgroundColor = [UIColor clearColor]; + [model addItem:neverAskItem toSectionWithIdentifier:SectionIdentifierContent]; +} + +#pragma mark - UITableViewDataSource + +- (UITableViewCell*)tableView:(UITableView*)tableView + cellForRowAtIndexPath:(NSIndexPath*)indexPath { + UITableViewCell* cell = [super tableView:tableView + cellForRowAtIndexPath:indexPath]; + ItemType itemType = static_cast<ItemType>( + [self.tableViewModel itemTypeForIndexPath:indexPath]); + + switch (itemType) { + case ItemTypeAddButton: { + TableViewTextButtonCell* tableViewTextButtonCell = + base::mac::ObjCCastStrict<TableViewTextButtonCell>(cell); + tableViewTextButtonCell.selectionStyle = + UITableViewCellSelectionStyleNone; + [tableViewTextButtonCell.button + addTarget:self.infobarModalDelegate + action:@selector(modalInfobarButtonWasAccepted:) + forControlEvents:UIControlEventTouchUpInside]; + break; + } + case ItemTypeNeverButton: { + TableViewTextButtonCell* tableViewTextButtonCell = + base::mac::ObjCCastStrict<TableViewTextButtonCell>(cell); + tableViewTextButtonCell.selectionStyle = + UITableViewCellSelectionStyleNone; + [tableViewTextButtonCell.button + addTarget:self.infobarModalDelegate + action:@selector(neverAskToAddToReadingList) + forControlEvents:UIControlEventTouchUpInside]; + break; + } + case ItemTypeInformationalText: + break; + } + + return cell; +} + +#pragma mark - UITableViewDelegate + +- (CGFloat)tableView:(UITableView*)tableView + heightForFooterInSection:(NSInteger)section { + return 0; +} + +#pragma mark - Private Methods + +- (void)dismissInfobarModal { + base::RecordAction( + base::UserMetricsAction("MobileMessagesModalCancelledTapped")); + [self.infobarModalDelegate dismissInfobarModal:self]; +} + +- (TableViewTextButtonItem*)textButtonItemForType:(ItemType)itemType + buttonText:(NSString*)buttonText + accessibilityId:(NSString*)allyId { + TableViewTextButtonItem* item = + [[TableViewTextButtonItem alloc] initWithType:itemType]; + item.boldButtonText = NO; + item.buttonText = buttonText; + item.buttonAccessibilityIdentifier = allyId; + return item; +} + +@end
diff --git a/ios/chrome/browser/ui/infobars/modals/test/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/test/BUILD.gn index 2b7c983..3730c58 100644 --- a/ios/chrome/browser/ui/infobars/modals/test/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/test/BUILD.gn
@@ -6,8 +6,12 @@ testonly = true configs += [ "//build/config/compiler:enable_arc" ] sources = [ + "fake_infobar_edit_address_profile_modal_consumer.h", + "fake_infobar_edit_address_profile_modal_consumer.mm", "fake_infobar_password_modal_consumer.h", "fake_infobar_password_modal_consumer.mm", + "fake_infobar_save_address_profile_modal_consumer.h", + "fake_infobar_save_address_profile_modal_consumer.mm", "fake_infobar_translate_modal_consumer.h", "fake_infobar_translate_modal_consumer.mm", ]
diff --git a/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.h b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.h new file mode 100644 index 0000000..3a400fe --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.h
@@ -0,0 +1,17 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_TEST_FAKE_INFOBAR_EDIT_ADDRESS_PROFILE_MODAL_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_TEST_FAKE_INFOBAR_EDIT_ADDRESS_PROFILE_MODAL_CONSUMER_H_ + +#import "ios/chrome/browser/ui/infobars/modals/infobar_edit_address_profile_modal_consumer.h" + +@interface FakeInfobarEditAddressProfileModalConsumer + : NSObject <InfobarEditAddressProfileModalConsumer> +// Allow read access to values passed to InfobarEditAddressProfileModalConsumer +// interface. +@property(nonatomic, strong) NSMutableDictionary* profileData; +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_TEST_FAKE_INFOBAR_EDIT_ADDRESS_PROFILE_MODAL_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.mm b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.mm new file mode 100644 index 0000000..60fe4ef --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.mm
@@ -0,0 +1,18 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation FakeInfobarEditAddressProfileModalConsumer +- (void)setupModalViewControllerWithData:(NSDictionary*)data { + self.profileData = [NSMutableDictionary dictionaryWithDictionary:data]; +} + +- (void)setIsEditForUpdate:(BOOL)isEditForUpdate { +} +@end
diff --git a/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.h b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.h new file mode 100644 index 0000000..c6d73427 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.h
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_TEST_FAKE_INFOBAR_SAVE_ADDRESS_PROFILE_MODAL_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_TEST_FAKE_INFOBAR_SAVE_ADDRESS_PROFILE_MODAL_CONSUMER_H_ + +#import "ios/chrome/browser/ui/infobars/modals/infobar_save_address_profile_modal_consumer.h" + +@interface FakeInfobarSaveAddressProfileModalConsumer + : NSObject <InfobarSaveAddressProfileModalConsumer> +// Allow read access to values passed to InfobarSaveAddressProfileModalConsumer +// interface. +@property(nonatomic, copy) NSString* address; +@property(nonatomic, copy) NSString* phoneNumber; +@property(nonatomic, copy) NSString* emailAddress; +@property(nonatomic, assign) BOOL currentAddressProfileSaved; +@property(nonatomic, assign) BOOL isUpdateModal; +@property(nonatomic, copy) NSDictionary* profileDataDiff; +@property(nonatomic, copy) NSString* updateModalDescription; +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_TEST_FAKE_INFOBAR_SAVE_ADDRESS_PROFILE_MODAL_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.mm b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.mm new file mode 100644 index 0000000..b0b363b --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.mm
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation FakeInfobarSaveAddressProfileModalConsumer + +- (void)setupModalViewControllerWithPrefs:(NSDictionary*)prefs { + self.address = prefs[kAddressPrefKey]; + self.phoneNumber = prefs[kPhonePrefKey]; + self.emailAddress = prefs[kEmailPrefKey]; + self.currentAddressProfileSaved = + [prefs[kCurrentAddressProfileSavedPrefKey] boolValue]; + self.isUpdateModal = [prefs[kIsUpdateModalPrefKey] boolValue]; + self.profileDataDiff = prefs[kProfileDataDiffKey]; + self.updateModalDescription = prefs[kUpdateModalDescriptionKey]; +} + +@end
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm b/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm index 1144ae6..f87fd6d 100644 --- a/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm +++ b/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm
@@ -224,7 +224,6 @@ self.locationBarSteadyView.translatesAutoresizingMaskIntoConstraints = NO; AddSameConstraints(self.locationBarSteadyView, self.view); - [self updateTrailingButtonState]; [self switchToEditing:NO]; }
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/reading_list/reading_list_infobar_banner_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_banner/reading_list/reading_list_infobar_banner_overlay_mediator.mm index e25a911..c1e0f48e 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/reading_list/reading_list_infobar_banner_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/reading_list/reading_list_infobar_banner_overlay_mediator.mm
@@ -48,6 +48,7 @@ [self.consumer setTitleText:config->title_text()]; [self.consumer setSubtitleText:config->message_text()]; [self.consumer setButtonText:config->button_text()]; + [self.consumer setPresentsModal:YES]; } @end
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn index 7e4eb8db..e3f594e 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/BUILD.gn
@@ -49,6 +49,7 @@ "//ios/chrome/browser/overlays", "//ios/chrome/browser/overlays/public/infobar_modal", "//ios/chrome/browser/overlays/test", + "//ios/chrome/browser/ui/autofill:autofill_ui_type", "//ios/chrome/browser/ui/infobars:feature_flags", "//ios/chrome/browser/ui/infobars/modals", "//ios/chrome/browser/ui/infobars/modals/test",
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm index aeb5081..e764462 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/autofill_address_profile/save_address_profile_infobar_modal_overlay_mediator_unittest.mm
@@ -15,8 +15,11 @@ #import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/infobar_modal/save_address_profile_infobar_modal_overlay_responses.h" #include "ios/chrome/browser/overlays/test/fake_overlay_request_callback_installer.h" +#import "ios/chrome/browser/ui/autofill/autofill_ui_type_util.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_edit_address_profile_modal_consumer.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_save_address_profile_modal_consumer.h" +#import "ios/chrome/browser/ui/infobars/modals/test/fake_infobar_edit_address_profile_modal_consumer.h" +#import "ios/chrome/browser/ui/infobars/modals/test/fake_infobar_save_address_profile_modal_consumer.h" #include "testing/gtest_mac.h" #include "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" @@ -76,6 +79,37 @@ id<OverlayRequestMediatorDelegate> mediator_delegate_ = nil; }; +// Tests that a SaveAddressProfileInfobarModalOverlayMediator correctly sets up +// its consumer. +TEST_F(SaveAddressProfileInfobarModalOverlayMediatorTest, SetUpConsumer) { + FakeInfobarSaveAddressProfileModalConsumer* consumer = + [[FakeInfobarSaveAddressProfileModalConsumer alloc] init]; + mediator_.consumer = consumer; + EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->GetEnvelopeStyleAddress()), + consumer.address); + EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->GetPhoneNumber()), + consumer.phoneNumber); + EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->GetEmailAddress()), + consumer.emailAddress); + EXPECT_FALSE(consumer.currentAddressProfileSaved); + EXPECT_FALSE(consumer.isUpdateModal); + EXPECT_EQ(0U, [consumer.profileDataDiff count]); + EXPECT_NSEQ(@"", consumer.updateModalDescription); +} + +// Tests that a SaveAddressProfileInfobarModalOverlayMediator correctly sets up +// its edit consumer. +TEST_F(SaveAddressProfileInfobarModalOverlayMediatorTest, SetUpEditConsumer) { + FakeInfobarEditAddressProfileModalConsumer* consumer = + [[FakeInfobarEditAddressProfileModalConsumer alloc] init]; + mediator_.editAddressConsumer = consumer; + for (const auto& type : GetAutofillTypeForProfileEdit()) { + EXPECT_NSEQ(base::SysUTF16ToNSString(delegate_->GetProfileInfo(type)), + consumer.profileData[[NSNumber + numberWithInt:AutofillUITypeFromAutofillType(type)]]); + } +} + // Tests that calling saveEditedProfileWithData: triggers a // EditedProfileSaveAction response. TEST_F(SaveAddressProfileInfobarModalOverlayMediatorTest, EditAction) {
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/BUILD.gn index f4227307..0644249a 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/BUILD.gn
@@ -14,6 +14,7 @@ deps = [ "//base", + "//ios/chrome/app/strings:ios_strings_grit", "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/overlays", "//ios/chrome/browser/overlays/public/common/infobars",
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_coordinator.mm index e84fa12..e8628831 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_coordinator.mm
@@ -6,8 +6,11 @@ #include "base/mac/foundation_util.h" #import "ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_request_config.h" +#import "ios/chrome/browser/ui/infobars/modals/infobar_reading_list_table_view_controller.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator+modal_configuration.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_mediator.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." @@ -58,12 +61,20 @@ ReadingListInfobarModalOverlayMediator* modalMediator = [[ReadingListInfobarModalOverlayMediator alloc] initWithRequest:self.request]; + InfobarReadingListTableViewController* modalViewController = + [[InfobarReadingListTableViewController alloc] + initWithDelegate:modalMediator]; + modalViewController.title = + l10n_util::GetNSString(IDS_IOS_READING_LIST_MESSAGES_MODAL_TITLE); self.modalMediator = modalMediator; + self.modalViewController = modalViewController; } - (void)resetModal { DCHECK(self.modalMediator); + DCHECK(self.modalViewController); self.modalMediator = nil; + self.modalViewController = nil; } @end
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_mediator.mm index e8756111..16a62efc 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_mediator.mm
@@ -5,6 +5,8 @@ #import "ios/chrome/browser/ui/overlays/infobar_modal/reading_list/reading_list_infobar_modal_overlay_mediator.h" #import "ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_request_config.h" +#import "ios/chrome/browser/overlays/public/infobar_modal/reading_list_modal_overlay_responses.h" +#import "ios/chrome/browser/ui/overlays/overlay_request_mediator+subclassing.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -33,4 +35,13 @@ return ReadingListInfobarModalOverlayRequestConfig::RequestSupport(); } +#pragma mark - InfobarReadingListModalDelegate + +- (void)neverAskToAddToReadingList { + [self dispatchResponse:OverlayResponse::CreateWithInfo< + reading_list_infobar_modal_responses::NeverAsk>()]; + + [self dismissOverlay]; +} + @end
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn index f630988..3da9c43a 100644 --- a/ios/chrome/browser/ui/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -88,6 +88,7 @@ ":distiller_js", "//base", "//components/dom_distiller/core", + "//ios/chrome/browser", "//ios/web/public", "//ios/web/public/js_messaging:js_messaging", ]
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_javascript_feature.mm b/ios/chrome/browser/ui/reading_list/reading_list_javascript_feature.mm index 568ca2a..55a32729 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_javascript_feature.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_javascript_feature.mm
@@ -4,7 +4,13 @@ #import "ios/chrome/browser/ui/reading_list/reading_list_javascript_feature.h" +#include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" +#include "base/time/time.h" #include "base/values.h" +#include "components/dom_distiller/core/distillable_page_detector.h" +#include "components/dom_distiller/core/page_features.h" +#import "ios/chrome/browser/chrome_url_util.h" #import "ios/web/public/js_messaging/java_script_feature_util.h" #import "ios/web/public/js_messaging/script_message.h" #import "ios/web/public/web_state.h" @@ -16,6 +22,10 @@ namespace { const char kScriptName[] = "distiller_js"; const char kScriptHandlerName[] = "ReadingListDOMMessageHandler"; +// Heuristic for words per minute reading speed. +const int kWordCountPerMinute = 275; +// Minimum read time to show the Messages prompt. +const double kReadTimeThreshold = 7.0; } // namespace ReadingListJavaScriptFeature::ReadingListJavaScriptFeature() @@ -43,6 +53,99 @@ return; } - // TODO(crbug.com/1195978): pass result into - // dom_distiller::CalculateDerivedFeatures(). + absl::optional<GURL> url = message.request_url(); + if (!url.has_value() || UrlHasChromeScheme(url.value()) || + url.value().SchemeIs(url::kAboutScheme)) { + // Ignore any Chrome-handled or NTP pages. + return; + } + + absl::optional<double> opt_num_elements = + message.body()->FindDoubleKey("numElements"); + double num_elements = 0.0; + if (opt_num_elements.has_value()) { + num_elements = opt_num_elements.value(); + } + + absl::optional<double> opt_num_anchors = + message.body()->FindDoubleKey("numAnchors"); + double num_anchors = 0.0; + if (opt_num_anchors.has_value()) { + num_anchors = opt_num_anchors.value(); + } + + absl::optional<double> opt_num_forms = + message.body()->FindDoubleKey("numForms"); + double num_forms = 0.0; + if (opt_num_forms.has_value()) { + num_forms = opt_num_forms.value(); + } + + absl::optional<double> opt_moz_score = + message.body()->FindDoubleKey("mozScore"); + double moz_score = 0.0; + if (opt_moz_score.has_value()) { + moz_score = opt_moz_score.value(); + } + + absl::optional<double> opt_moz_sqrt = + message.body()->FindDoubleKey("mozScoreAllSqrt"); + double moz_sqrt = 0.0; + if (opt_moz_sqrt.has_value()) { + moz_sqrt = opt_moz_sqrt.value(); + } + + absl::optional<double> opt_moz_linear = + message.body()->FindDoubleKey("mozScoreAllLinear"); + double moz_linear = 0.0; + if (opt_moz_linear.has_value()) { + moz_linear = opt_moz_linear.value(); + } + + absl::optional<double> time = message.body()->FindDoubleKey("time"); + if (time.has_value()) { + UMA_HISTOGRAM_TIMES("IOS.ReadingList.Javascript.ExecutionTime", + base::TimeDelta::FromMillisecondsD(time.value())); + } + + std::vector<double> result = dom_distiller::CalculateDerivedFeatures( + true, message.request_url().value(), num_elements, num_anchors, num_forms, + moz_score, moz_sqrt, moz_linear); + + const dom_distiller::DistillablePageDetector* detector = + dom_distiller::DistillablePageDetector::GetNewModel(); + // Equivalent of DistillablePageDetector::Classify(). + double score = detector->Score(result) - detector->GetThreshold(); + // Translate score by +1 to make histogram logging simpler by keeping all + // scores positive. Multiply by 100 to get granular scoring logging to the + // hundredths digit. + base::UmaHistogramCustomCounts( + "IOS.ReadingList.Javascript.RegularDistillabilityScore", + (score + 1) * 100, 0, 400, 50); + + const dom_distiller::DistillablePageDetector* long_detector = + dom_distiller::DistillablePageDetector::GetLongPageModel(); + // Equivalent of DistillablePageDetector::Classify(). + double long_score = + long_detector->Score(result) - long_detector->GetThreshold(); + // Translate score by +1 to make histogram logging simpler by keeping all + // scores positive. Multiply by 100 to get granular scoring logging to the + // hundredths digit. + base::UmaHistogramCustomCounts( + "IOS.ReadingList.Javascript.LongPageDistillabilityScore", + (long_score + 1) * 100, 0, 400, 50); + + // Calculate Time to Read + absl::optional<double> opt_word_count = + message.body()->FindDoubleKey("wordCount"); + double estimated_read_time = 0.0; + if (opt_word_count.has_value()) { + estimated_read_time = opt_word_count.value() / kWordCountPerMinute; + base::UmaHistogramCounts100("IOS.ReadingList.Javascript.TimeToRead", + estimated_read_time); + } + + if (score > 0 && estimated_read_time > kReadTimeThreshold) { + // TODO(crbug.com/1195978): Insert Reading List Banner Overlay Request. + } }
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm index c42a777..d2e8985 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -278,15 +278,8 @@ } // Tests that the user isn't signed out and the UI is correct when the -// disconnect is cancelled in the Account Settings screen. -#if !TARGET_IPHONE_SIMULATOR -// TODO(crbug.com/669613): Re-enable this test on devices. -#define MAYBE_testSignInDisconnectCancelled \ - DISABLED_testSignInDisconnectCancelled -#else -#define MAYBE_testSignInDisconnectCancelled testSignInDisconnectCancelled -#endif -- (void)MAYBE_testSignInDisconnectCancelled { +// sign-out is cancelled in the Account Settings screen. +- (void)testSignOutCancelled { FakeChromeIdentity* fakeIdentity = [SigninEarlGrey fakeIdentity1]; // Sign In |fakeIdentity|, then open the Account Settings. @@ -294,7 +287,7 @@ [ChromeEarlGreyUI openSettingsMenu]; [ChromeEarlGreyUI tapSettingsMenuButton:SettingsAccountButton()]; - // Open the "Disconnect Account" dialog, then tap "Cancel". + // Open the SignOut dialog, then tap "Cancel". [ChromeEarlGreyUI tapAccountsMenuButton:SignOutAccountsButton()]; // Note that the iPad does not provide a CANCEL button by design. Click // anywhere on the screen to exit.
diff --git a/ios/chrome/browser/web/resources/PRESUBMIT.py b/ios/chrome/browser/web/resources/PRESUBMIT.py index fc210347..f27aab5 100644 --- a/ios/chrome/browser/web/resources/PRESUBMIT.py +++ b/ios/chrome/browser/web/resources/PRESUBMIT.py
@@ -4,6 +4,9 @@ """Makes sure that injected JavaScript is clang-format clean.""" +USE_PYTHON3 = True + + def CheckChangeOnUpload(input_api, output_api): """Special Top level function called by git_cl.""" return input_api.canned_checks.CheckPatchFormatted(
diff --git a/ios/chrome/browser/web/visible_url_egtest.mm b/ios/chrome/browser/web/visible_url_egtest.mm index 1a9810c..b4ed028 100644 --- a/ios/chrome/browser/web/visible_url_egtest.mm +++ b/ios/chrome/browser/web/visible_url_egtest.mm
@@ -40,6 +40,12 @@ const char kPage2Link[] = "page-2"; const char kPage3Link[] = "page-3"; +id<GREYMatcher> ContextMenuMatcherForText(NSString* text) { + return grey_allOf( + grey_ancestor(grey_kindOfClassName(@"PopupMenuNavigationCell")), + grey_text(text), nil); +} + // Response provider which can be paused. When it is paused it buffers all // requests and does not respond to them until |set_paused(false)| is called. class PausableResponseProvider : public HtmlResponseProvider { @@ -117,24 +123,11 @@ _testURL2 = web::test::HttpServer::MakeUrl("http://url2.test/"); _testURL3 = web::test::HttpServer::MakeUrl("http://url3.test/"); - // Every page has links for window.history navigations (back, forward, go). - const std::string pageContent = base::StringPrintf( - "<a onclick='window.history.back()' id='%s'>Go Back</a>" - "<a onclick='window.history.forward()' id='%s'>Go Forward</a>" - "<a onclick='window.history.go(-1)' id='%s'>Go Delta -1</a>" - "<a onclick='window.history.go(1)' id='%s'>Go Delta +1</a>" - "<a href='%s' id='%s'>Page 1</a>" - "<a href='%s' id='%s'>Page 2</a>" - "<a href='%s' id='%s'>Page 3</a>", - kGoBackLink, kGoForwardLink, kGoNegativeDeltaLink, kGoPositiveDeltaLink, - _testURL1.spec().c_str(), kPage1Link, _testURL2.spec().c_str(), - kPage2Link, _testURL3.spec().c_str(), kPage3Link); - // Create map of canned responses and set up the test HTML server. std::map<GURL, std::string> responses; - responses[_testURL1] = std::string(kTestPage1) + pageContent; - responses[_testURL2] = std::string(kTestPage2) + pageContent; - responses[_testURL3] = std::string(kTestPage3) + pageContent; + responses[_testURL1] = [self pageContentForTitle:kTestPage1]; + responses[_testURL2] = [self pageContentForTitle:kTestPage2]; + responses[_testURL3] = [self pageContentForTitle:kTestPage3]; std::unique_ptr<PausableResponseProvider> unique_provider = std::make_unique<PausableResponseProvider>(responses); @@ -145,13 +138,31 @@ [ChromeEarlGrey loadURL:_testURL2]; } +- (std::string)pageContentForTitle:(const char*)title { + // Every page has links for window.history navigations (back, forward, go). + return base::StringPrintf( + "<head><title>%s</title></head>" + "<body>%s<br/>" + "<a onclick='window.history.back()' id='%s'>Go Back</a><br/>" + "<a onclick='window.history.forward()' id='%s'>Go Forward</a><br/>" + "<a onclick='window.history.go(-1)' id='%s'>Go Delta -1</a><br/>" + "<a onclick='window.history.go(1)' id='%s'>Go Delta +1</a><br/>" + "<a href='%s' id='%s'>Page 1</a><br/>" + "<a href='%s' id='%s'>Page 2</a><br/>" + "<a href='%s' id='%s'>Page 3</a><br/>" + "</body>", + title, title, kGoBackLink, kGoForwardLink, kGoNegativeDeltaLink, + kGoPositiveDeltaLink, _testURL1.spec().c_str(), kPage1Link, + _testURL2.spec().c_str(), kPage2Link, _testURL3.spec().c_str(), + kPage3Link); +} + #pragma mark - #pragma mark Tests -// Tests that visible URL is always the same as last committed URL during +// Tests that visible URL is always the pending URL during // pending back and forward navigations. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testBackForwardNavigation { +- (void)testBackForwardNavigation { // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -162,13 +173,12 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap the back button in the toolbar and verify that URL2 (committed URL) - // is displayed even though URL1 is a pending URL. + // Tap the back button in the toolbar and verify that URL1 is displayed. [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()] performAction:grey_tap()]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL1 becomes committed. @@ -188,13 +198,12 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap the forward button in the toolbar and verify that URL1 (committed - // URL) is displayed even though URL2 is a pending URL. + // Tap the back button in the toolbar and verify that URL1 is displayed. [[EarlGrey selectElementWithMatcher:chrome_test_util::ForwardButton()] performAction:grey_tap()]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL2 becomes committed. @@ -205,10 +214,9 @@ assertWithMatcher:grey_notNil()]; } -// Tests that visible URL is always the same as last committed URL during -// pending navigations initialted from back history popover. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testHistoryNavigation { +// Tests that visible URL is always the pending URL during +// navigations initiated from back history popover. +- (void)testHistoryNavigation { // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -221,12 +229,11 @@ [self setServerPaused:YES]; } - // Go back in history and verify that URL2 (committed URL) is displayed even - // though URL1 is a pending URL. + // Go back in history and verify that URL1 is displayed. [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()] performAction:grey_longPress()]; - NSString* URL1Title = [ChromeEarlGrey displayTitleForURL:_testURL1]; - [[EarlGrey selectElementWithMatcher:grey_text(URL1Title)] + NSString* URL1Title = base::SysUTF8ToNSString(kTestPage1); + [[EarlGrey selectElementWithMatcher:ContextMenuMatcherForText(URL1Title)] performAction:grey_tap()]; { @@ -235,7 +242,7 @@ ScopedSynchronizationDisabler disabler; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL1 becomes committed. @@ -246,10 +253,15 @@ assertWithMatcher:grey_notNil()]; } -// Tests that stopping a pending Back navigation and reloading reloads committed -// URL, not pending URL. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testStoppingPendingBackNavigationAndReload { +// Tests that stopping a pending Back navigation and reloading reloads the +// pending URL. +- (void)testStoppingPendingBackNavigationAndReload { + // With iPhone, Stop and Reload are in the tool menu. There's no easy way to + // track some animations (opening a popop) and not others (load progress bar) + // which makes this test fail. + if (![ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_SKIPPED(@"Skipped for iPhone (sync issues)"); + } // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -264,12 +276,7 @@ performAction:grey_tap()]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1], @"Last request URL: %@", self.lastRequestURLSpec); - // On iPhone Stop/Reload button is a part of tools menu, so open it. - if (![ChromeEarlGrey isIPadIdiom]) { - // Enable EG synchronization to make test wait for popover animations. - disabler.reset(); - [ChromeEarlGreyUI openToolsMenu]; - } + [[EarlGrey selectElementWithMatcher:chrome_test_util::StopButton()] performAction:grey_tap()]; [ChromeEarlGreyUI reload]; @@ -277,16 +284,15 @@ // Makes server respond. [self setServerPaused:NO]; } - // Verifies that page2 was reloaded, not page1. - [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]; - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] + // Verifies that page1 was reloaded, not page2. + [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]; + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] assertWithMatcher:grey_notNil()]; } -// Tests that visible URL is always the same as last committed URL during +// Tests that visible URL is always the same as last pending URL during // back forward navigations initiated with JS. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testJSBackForwardNavigation { +- (void)testJSBackForwardNavigation { // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -297,13 +303,13 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap the back button on the page and verify that URL2 (committed URL) is - // displayed even though URL1 is a pending URL. + // Tap the back button on the page and verify that URL1 (pending URL) is + // displayed. [ChromeEarlGrey tapWebStateElementWithID:base::SysUTF8ToNSString(kGoBackLink)]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL1 becomes committed. @@ -323,13 +329,13 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap the forward button on the page and verify that URL1 (committed URL) - // is displayed even though URL2 is a pending URL. + // Tap the forward button on the page and verify that URL2 (pending URL) + // is displayed. [ChromeEarlGrey tapWebStateElementWithID:base::SysUTF8ToNSString(kGoForwardLink)]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL2 becomes committed. @@ -340,10 +346,9 @@ assertWithMatcher:grey_notNil()]; } -// Tests that visible URL is always the same as last committed URL during go +// Tests that visible URL is always the same as last pending URL during go // navigations initiated with JS. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testJSGoNavigation { +- (void)testJSGoNavigation { // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -354,13 +359,13 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap the go negative delta button on the page and verify that URL2 - // (committed URL) is displayed even though URL1 is a pending URL. + // Tap the go negative delta button on the page and verify that URL1 + // (pending URL) is displayed. [ChromeEarlGrey tapWebStateElementWithID:base::SysUTF8ToNSString(kGoNegativeDeltaLink)]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL1 becomes committed. @@ -380,13 +385,13 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap go positive delta button on the page and verify that URL1 (committed - // URL) is displayed even though URL2 is a pending URL. + // Tap go positive delta button on the page and verify that URL2 (pending + // URL) is displayed. [ChromeEarlGrey tapWebStateElementWithID:base::SysUTF8ToNSString(kGoPositiveDeltaLink)]; GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2], @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL2 becomes committed. @@ -399,8 +404,14 @@ // Tests that visible URL is always the same as last committed URL during go // back navigation started with pending reload in progress. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testBackNavigationWithPendingReload { +- (void)testBackNavigationWithPendingReload { + // With iPhone, Stop and Reload are in the tool menu. There's no easy way to + // track some animations (opening a popop) and not others (load progress bar) + // which makes this test fail. + if (![ChromeEarlGrey isIPadIdiom]) { + EARL_GREY_TEST_SKIPPED(@"Skipped for iPhone (sync issues)"); + } + // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -412,11 +423,6 @@ [self setServerPaused:YES]; // Start reloading the page. - if (![ChromeEarlGrey isIPadIdiom]) { - // Enable EG synchronization to make test wait for popover animations. - disabler.reset(); - [ChromeEarlGreyUI openToolsMenu]; - } [[EarlGrey selectElementWithMatcher:chrome_test_util::ReloadButton()] performAction:grey_tap()]; @@ -441,8 +447,7 @@ // Tests that visible URL is always the same as last committed URL during go // back navigation initiated with pending renderer-initiated navigation in // progress. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testBackNavigationWithPendingRendererInitiatedNavigation { +- (void)testBackNavigationWithPendingRendererInitiatedNavigation { // Purge web view caches and pause the server to make sure that tests can // verify omnibox state before server starts responding. [ChromeEarlGrey purgeCachedWebViewPages]; @@ -475,85 +480,9 @@ assertWithMatcher:grey_notNil()]; } -// Tests that visible URL is always the same as last committed URL during -// renderer-initiated navigation started with pending back navigation in -// progress. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testRendererInitiatedNavigationWithPendingBackNavigation { - // Purge web view caches and pause the server to make sure that tests can - // verify omnibox state before server starts responding. - [ChromeEarlGrey purgeCachedWebViewPages]; - [ChromeEarlGrey waitForWebStateContainingText:kTestPage2]; - { - // Pauses response server and disables EG synchronization. - // Pending navigation will not complete until server is unpaused. - ScopedSynchronizationDisabler disabler; - [self setServerPaused:YES]; - - // Tap the back button in the toolbar and verify that URL2 (committed URL) - // is displayed even though URL1 is a pending URL. - [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()] - performAction:grey_tap()]; - GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1], - @"Last request URL: %@", self.lastRequestURLSpec); - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] - assertWithMatcher:grey_notNil()]; - - // Interrupt back navigation with renderer initiated navigation. - [ChromeEarlGrey - tapWebStateElementWithID:base::SysUTF8ToNSString(kPage3Link)]; - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] - assertWithMatcher:grey_notNil()]; - - // Make server respond so URL1 becomes committed. - [self setServerPaused:NO]; - } - [ChromeEarlGrey waitForWebStateContainingText:kTestPage3]; - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL3.GetContent())] - assertWithMatcher:grey_notNil()]; -} - -// Tests that visible URL is always the same as last committed URL if user -// issues 2 go back commands. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testDoubleBackNavigation { - // Create 3rd entry in the history, to be able to go back twice. - [ChromeEarlGrey loadURL:_testURL3]; - - // Purge web view caches and pause the server to make sure that tests can - // verify omnibox state before server starts responding. - [ChromeEarlGrey purgeCachedWebViewPages]; - [ChromeEarlGrey waitForWebStateContainingText:kTestPage3]; - { - // Pauses response server and disables EG synchronization. - // Pending navigation will not complete until server is unpaused. - ScopedSynchronizationDisabler disabler; - [self setServerPaused:YES]; - - // Tap the back button twice in the toolbar and verify that URL3 (committed - // URL) is displayed even though URL1 is a pending URL. - [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()] - performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()] - performAction:grey_tap()]; - // Server will receive only one request either for |_testURL2| or for - // |_testURL1| depending on load timing and then will pause. So there is no - // need to wait for particular request. - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL3.GetContent())] - assertWithMatcher:grey_notNil()]; - - // Make server respond so URL1 becomes committed. - [self setServerPaused:NO]; - } - [ChromeEarlGrey waitForWebStateContainingText:kTestPage1]; - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())] - assertWithMatcher:grey_notNil()]; -} - // Tests that visible URL is always the same as last committed URL if user // issues 2 go forward commands to WebUI page (crbug.com/711465). -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testDoubleForwardNavigationToWebUIPage { +- (void)testDoubleForwardNavigationToWebUIPage { // Create 3rd entry in the history, to be able to go back twice. GURL URL(kChromeUIVersionURL); [ChromeEarlGrey loadURL:GURL(kChromeUIVersionURL)]; @@ -579,10 +508,9 @@ assertWithMatcher:grey_notNil()]; } -// Tests that visible URL is always the same as last committed URL if page calls +// Tests that visible URL is always the same as last pending URL if page calls // window.history.back() twice. -// TODO(crbug.com/874634): re-enable this test. -- (void)DISABLED_testDoubleBackJSNavigation { +- (void)testDoubleBackJSNavigation { // Create 3rd entry in the history, to be able to go back twice. [ChromeEarlGrey loadURL:_testURL3]; @@ -596,8 +524,8 @@ ScopedSynchronizationDisabler disabler; [self setServerPaused:YES]; - // Tap the back button twice on the page and verify that URL3 (committed - // URL) is displayed even though URL1 is a pending URL. + // Tap the back button twice on the page and verify that URL1 (pending + // URL) is displayed. [ChromeEarlGrey tapWebStateElementWithID:base::SysUTF8ToNSString(kGoBackLink)]; [ChromeEarlGrey @@ -605,7 +533,7 @@ // Server will receive only one request either for |_testURL2| or for // |_testURL1| depending on load timing and then will pause. So there is no // need to wait for particular request. - [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL3.GetContent())] + [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())] assertWithMatcher:grey_notNil()]; // Make server respond so URL1 becomes committed.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm index d2e46e3..c56a9d7 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
@@ -273,7 +273,7 @@ } - (void)openShareMenu { - [[EarlGrey selectElementWithMatcher:chrome_test_util::TabShareButton()] + [[EarlGrey selectElementWithMatcher:chrome_test_util::ShareButton()] performAction:grey_tap()]; }
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.h b/ios/chrome/test/earl_grey/chrome_test_case.h index 58c7cc8..1f7fbf4 100644 --- a/ios/chrome/test/earl_grey/chrome_test_case.h +++ b/ios/chrome/test/earl_grey/chrome_test_case.h
@@ -51,6 +51,9 @@ // name of the currently running test method. - (BOOL)isRunningTest:(SEL)selector; +// Configure the fixture for startup testing. ++ (void)testForStartup; + @end #endif // IOS_CHROME_TEST_EARL_GREY_CHROME_TEST_CASE_H_
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm index 2daf24d..19d76555 100644 --- a/ios/chrome/test/earl_grey/chrome_test_case.mm +++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -33,6 +33,9 @@ bool gIsMockAuthenticationDisabled = false; +// YES the test is for startup. +bool gStartupTest = false; + NSString* const kFlakyEarlGreyTestTargetSuffix = @"_flaky_eg2tests_module-Runner"; NSString* const kMultitaskingEarlGreyTestTargetName = @@ -172,6 +175,7 @@ [[self class] disableMockAuthentication]; [super tearDown]; gExecutedSetUpForTestCase = false; + gStartupTest = false; } - (net::EmbeddedTestServer*)testServer { @@ -193,13 +197,19 @@ [[AppLaunchManager sharedManager] addObserver:self]; [super setUp]; + + // TODO(crbug.com/1218575): Remove once moved to EG. + [ChromeTestCaseAppInterface disableKeyboardTutorials]; + [self resetAppState]; ResetAuthentication(); // Reset any remaining sign-in state from previous tests. [ChromeEarlGrey signOutAndClearIdentities]; - [ChromeEarlGrey openNewTab]; + if (![ChromeTestCase isStartupTest]) { + [ChromeEarlGrey openNewTab]; + } _executedTestMethodSetUp = YES; } @@ -227,7 +237,9 @@ // Clean up any UI that may remain open so the next test starts in a clean // state. - [[self class] removeAnyOpenMenusAndInfoBars]; + if (![ChromeTestCase isStartupTest]) { + [[self class] removeAnyOpenMenusAndInfoBars]; + } [[self class] closeAllTabs]; if ([[GREY_REMOTE_CLASS_IN_APP(UIDevice) currentDevice] orientation] != @@ -282,6 +294,14 @@ return [[self currentTestMethodName] isEqual:NSStringFromSelector(selector)]; } ++ (void)testForStartup { + gStartupTest = YES; +} + ++ (BOOL)isStartupTest { + return gStartupTest; +} + #pragma mark - Private methods + (void)disableMockAuthentication { @@ -358,8 +378,10 @@ // Sometimes on start up there can be infobars (e.g. restore session), so // ensure the UI is in a clean state. - [self removeAnyOpenMenusAndInfoBars]; - [self closeAllTabs]; + if (![ChromeTestCase isStartupTest]) { + [[self class] removeAnyOpenMenusAndInfoBars]; + [self closeAllTabs]; + } [ChromeEarlGrey setContentSettings:CONTENT_SETTING_DEFAULT]; // Enforce the assumption that the tests are runing in portrait. @@ -426,7 +448,9 @@ // Reset any remaining sign-in state from previous tests. [ChromeEarlGrey signOutAndClearIdentities]; - [ChromeEarlGrey openNewTab]; + if (![ChromeTestCase isStartupTest]) { + [ChromeEarlGrey openNewTab]; + } } } }
diff --git a/ios/chrome/test/earl_grey/chrome_test_case_app_interface.h b/ios/chrome/test/earl_grey/chrome_test_case_app_interface.h index e25bb692..58f5be5 100644 --- a/ios/chrome/test/earl_grey/chrome_test_case_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_test_case_app_interface.h
@@ -29,6 +29,9 @@ // will return NO. + (BOOL)isCompletionInvokedWithUUID:(NSUUID*)completionUUID; +// TODO(crbug.com/1218575): Remove once moved to EG. ++ (void)disableKeyboardTutorials; + @end #endif // IOS_CHROME_TEST_EARL_GREY_CHROME_TEST_CASE_APP_INTERFACE_H_
diff --git a/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm b/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm index fe8cb89..f0b3891 100644 --- a/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_test_case_app_interface.mm
@@ -51,6 +51,32 @@ return YES; } ++ (void)disableKeyboardTutorials { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // Set the preferences values directly on simulator for the keyboard + // modifiers. For persisting these values, CFPreferencesSynchronize must be + // called after. + CFStringRef app = CFSTR("com.apple.keyboard.preferences.plist"); + if (@available(iOS 15, *)) { + CFPreferencesSetValue(CFSTR("DidShowContinuousPathIntroduction"), + kCFBooleanTrue, app, kCFPreferencesAnyUser, + kCFPreferencesAnyHost); + CFPreferencesSetValue(CFSTR("KeyboardDidShowProductivityTutorial"), + kCFBooleanTrue, app, kCFPreferencesAnyUser, + kCFPreferencesAnyHost); + CFPreferencesSetValue(CFSTR("DidShowGestureKeyboardIntroduction"), + kCFBooleanTrue, app, kCFPreferencesAnyUser, + kCFPreferencesAnyHost); + CFPreferencesSetValue( + CFSTR("UIKeyboardDidShowInternationalInfoIntroduction"), + kCFBooleanTrue, app, kCFPreferencesAnyUser, kCFPreferencesAnyHost); + CFPreferencesSynchronize(kCFPreferencesAnyApplication, + kCFPreferencesAnyUser, kCFPreferencesAnyHost); + } + }); +} + #pragma mark - Private + (void)completionInvokedWithUUID:(NSUUID*)completionUUID {
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index 791c463..ff06d3d2 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -3a1b145fdd66d04cb9ba75afdcd8ae2c372e1e3e \ No newline at end of file +392de7650d057c95dc1a7e1c65d2c2e130f40613 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index 1ec6108..386497d 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -237bd8a1f8b18828c31b60b8fa9a8455777045d1 \ No newline at end of file +8510b6aba4799728e1e9dc7bcab2a1843c90b650 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 index 6903776..714e845 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -a60694122d580e15f31376cb5aafde79c68a6fd8 \ No newline at end of file +9b3df07f378224978258225589dea5d7f0e0ddb4 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 index 74fb93e..b34f21cb 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -ec195419c56bd0a31c24796fcab172cd9a08d6bf \ No newline at end of file +7060b6e888f6e93ccc6e6be15d513ca2051b0856 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index e917fda..6a1d030 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -7cf7c312de75265cad5edc8f77dc1e3125fbce75 \ No newline at end of file +c62dd3120ece320d6f88c1e0609b9064585ae6f1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index 5699a08..a6f515e 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -b47aeaf1902608b15e6b0a82f8ae31dd6c7c9017 \ No newline at end of file +faf13d3db9c607031e150222dc0177057ac70473 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index a3fec089..48a97cae 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -34bf9dc53b887d82ca4e6dc526343a2d1053444d \ No newline at end of file +b91d4a03ffbdaa075886c15e6fac912637a0d3e9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 0ed8379..04b82ef 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -e23aaa865511312f04c4f58bd24d1d00474860d6 \ No newline at end of file +63d3224bfe89cbd7ed30ccac5ecd0713955dd0fe \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index 73a6c73..ddeee013 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -2873a9f0db9f997ff5db06163f59bc6eb22e6ec5 \ No newline at end of file +b63bd396254e5e52662f0bb3a32705728737042a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index 69c7880f..d55097f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -1a12f900baf3ee27ef997d8850dc6dd8fe54b903 \ No newline at end of file +f9b7aa0a06c1142acfe9a365c72727da8d644ad9 \ No newline at end of file
diff --git a/ios/web/js_messaging/crw_js_window_id_manager.mm b/ios/web/js_messaging/crw_js_window_id_manager.mm index ee6b8b6..63dc312 100644 --- a/ios/web/js_messaging/crw_js_window_id_manager.mm +++ b/ios/web/js_messaging/crw_js_window_id_manager.mm
@@ -72,6 +72,9 @@ __weak CRWJSWindowIDManager* weakSelf = self; [_webView evaluateJavaScript:scriptWithResult completionHandler:^(id result, NSError* error) { + CRWJSWindowIDManager* strongSelf = weakSelf; + if (!strongSelf) + return; if (error) { #if DCHECK_IS_ON() DCHECK(error.code == WKErrorWebViewInvalidated || @@ -96,7 +99,7 @@ // WKUserScript has not been injected yet. Retry window id // injection, because it is critical for the system to // function. - [weakSelf inject]; + [strongSelf inject]; } }]; }
diff --git a/ios/web/js_messaging/java_script_feature.mm b/ios/web/js_messaging/java_script_feature.mm index 450e3d9..ac27113 100644 --- a/ios/web/js_messaging/java_script_feature.mm +++ b/ios/web/js_messaging/java_script_feature.mm
@@ -169,6 +169,8 @@ WebFrame* web_frame, const std::string& function_name, const std::vector<base::Value>& parameters) { + DCHECK(web_frame); + JavaScriptFeatureManager* feature_manager = JavaScriptFeatureManager::FromBrowserState(web_frame->GetBrowserState()); DCHECK(feature_manager); @@ -187,6 +189,8 @@ const std::vector<base::Value>& parameters, base::OnceCallback<void(const base::Value*)> callback, base::TimeDelta timeout) { + DCHECK(web_frame); + JavaScriptFeatureManager* feature_manager = JavaScriptFeatureManager::FromBrowserState(web_frame->GetBrowserState()); DCHECK(feature_manager);
diff --git a/ios/web/public/js_messaging/java_script_feature.h b/ios/web/public/js_messaging/java_script_feature.h index 35fa107a..31728d5 100644 --- a/ios/web/public/js_messaging/java_script_feature.h +++ b/ios/web/public/js_messaging/java_script_feature.h
@@ -166,10 +166,18 @@ protected: explicit JavaScriptFeature(ContentWorld supported_world); + // Calls |function_name| with |parameters| in |web_frame| within the content + // world that this feature has been configured. |web_frame| must not be null. + // See WebFrame::CallJavaScriptFunction for more details. bool CallJavaScriptFunction(WebFrame* web_frame, const std::string& function_name, const std::vector<base::Value>& parameters); + // Calls |function_name| with |parameters| in |web_frame| within the content + // world that this feature has been configured. |callback| will be called with + // the return value of the function if it completes within |timeout|. + // |web_frame| must not be null. + // See WebFrame::CallJavaScriptFunction for more details. bool CallJavaScriptFunction( WebFrame* web_frame, const std::string& function_name,
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index d4e8ac4..6b8e6f1 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -71,6 +71,7 @@ using base::test::ios::WaitUntilConditionOrTimeout; using base::test::ios::kWaitForPageLoadTimeout; +using base::test::ios::kWaitForJSCompletionTimeout; // Subclass of WKWebView to check that the observers are removed when the web // state is destroyed. @@ -1161,9 +1162,12 @@ ASSERT_EQ(0, observer.title_change_count()); // Expect TitleWasSet callback after the page is loaded and due to WKWebView - // title change KVO. + // title change KVO. Title updates happen asynchronously, so wait until the + // title is updated. LoadHtml(@"<title>Title1</title>"); - EXPECT_EQ("Title1", base::UTF16ToUTF8(web_state()->GetTitle())); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return web_state()->GetTitle() == u"Title1"; + })); EXPECT_EQ(2, observer.title_change_count()); // Expect at least one more TitleWasSet callback after changing title via @@ -1172,16 +1176,20 @@ // TODO(crbug.com/696104): There should be only 2 calls of TitleWasSet. // Fix expecteation when WKWebView stops sending extra KVO calls. ExecuteJavaScript(@"window.document.title = 'Title2';"); - EXPECT_EQ("Title2", base::UTF16ToUTF8(web_state()->GetTitle())); + EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return web_state()->GetTitle() == u"Title2"; + })); EXPECT_GE(observer.title_change_count(), 3); } // Tests that fragment change navigations use title from the previous page. TEST_F(CRWWebControllerTitleTest, FragmentChangeNavigationsUsePreviousTitle) { LoadHtml(@"<title>Title1</title>"); - ASSERT_EQ("Title1", base::UTF16ToUTF8(web_state()->GetTitle())); + ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{ + return web_state()->GetTitle() == u"Title1"; + })); ExecuteJavaScript(@"window.location.hash = '#1'"); - EXPECT_EQ("Title1", base::UTF16ToUTF8(web_state()->GetTitle())); + EXPECT_EQ(u"Title1", web_state()->GetTitle()); } // Test fixture for JavaScript execution.
diff --git a/ios/web_view/PRESUBMIT.py b/ios/web_view/PRESUBMIT.py index 14c85d8a..325e0587 100644 --- a/ios/web_view/PRESUBMIT.py +++ b/ios/web_view/PRESUBMIT.py
@@ -10,6 +10,7 @@ import os +USE_PYTHON3 = True INCLUSION_PREFIXES = ('#import "', '#include "')
diff --git a/ios/web_view/test/web_view_back_forward_list_inttest.mm b/ios/web_view/test/web_view_back_forward_list_inttest.mm index ac56b07..ac85151 100644 --- a/ios/web_view/test/web_view_back_forward_list_inttest.mm +++ b/ios/web_view/test/web_view_back_forward_list_inttest.mm
@@ -53,6 +53,17 @@ "<html><header><title>page4</title></header><body>4</body></html>"); } + // Loads a URL then waits for the load to complete and the page title to + // update to the |expected| value. + bool LoadUrlAndWaitForTitle(const GURL& url, NSString* title) { + bool success = test::LoadUrl(web_view_, net::NSURLWithGURL(url)); + success = success && base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForJSCompletionTimeout, ^{ + return [title isEqualToString:web_view_.title]; + }); + return success; + } + // Waits until web_view_ has loaded a page. bool WaitUntilPageLoaded() { CWVBackForwardListTestNavigationObserver* observer = @@ -80,9 +91,9 @@ GenerateTestPageUrls(); // Go to page3 - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page1_url_))); - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page2_url_))); - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page3_url_))); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page1_url_, @"page1")); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page2_url_, @"page2")); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page3_url_, @"page3")); // Now it should be in page3 ASSERT_NSEQ(@"page3", test::EvaluateJavaScript(web_view_, @"document.title", nil)); @@ -176,7 +187,7 @@ ASSERT_NSEQ(@"page1", test::EvaluateJavaScript(web_view_, @"document.title", nil)); // Go to page4 then - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page4_url_))); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page4_url_, @"page4")); // Now it should be in page4 ASSERT_NSEQ(@"page4", test::EvaluateJavaScript(web_view_, @"document.title", nil)); @@ -197,9 +208,9 @@ GenerateTestPageUrls(); // Go to page3 - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page1_url_))); - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page2_url_))); - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page3_url_))); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page1_url_, @"page1")); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page2_url_, @"page2")); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page3_url_, @"page3")); // Now it should be in page3 ASSERT_NSEQ(@"page3", test::EvaluateJavaScript(web_view_, @"document.title", nil)); @@ -257,9 +268,9 @@ GenerateTestPageUrls(); // Go to page3 - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page1_url_))); - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page2_url_))); - ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page3_url_))); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page1_url_, @"page1")); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page2_url_, @"page2")); + ASSERT_TRUE(LoadUrlAndWaitForTitle(page3_url_, @"page3")); // Now it should be in page3 ASSERT_NSEQ(@"page3", test::EvaluateJavaScript(web_view_, @"document.title", nil));
diff --git a/ios/web_view/test/web_view_kvo_inttest.mm b/ios/web_view/test/web_view_kvo_inttest.mm index da9b647b..4b96453 100644 --- a/ios/web_view/test/web_view_kvo_inttest.mm +++ b/ios/web_view/test/web_view_kvo_inttest.mm
@@ -7,6 +7,7 @@ #include "base/strings/stringprintf.h" #import "base/strings/sys_string_conversions.h" +#import "base/test/ios/wait_util.h" #include "components/url_formatter/elide_url.h" #import "ios/web_view/test/observer.h" #import "ios/web_view/test/web_view_inttest_base.h" @@ -109,18 +110,30 @@ base::SysNSStringToUTF8(page_1_title), page_1_html); ASSERT_TRUE(test::LoadUrl(web_view_, net::NSURLWithGURL(page_1_url))); + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForJSCompletionTimeout, ^{ + return [page_1_title isEqualToString:web_view_.title]; + })); EXPECT_NSEQ(page_1_title, observer.lastValue); // Navigate to page 2. EXPECT_TRUE(test::TapWebViewElementWithId(web_view_, @"link_1")); ASSERT_TRUE( test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Body 2")); + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForJSCompletionTimeout, ^{ + return [page_2_title isEqualToString:web_view_.title]; + })); EXPECT_NSEQ(page_2_title, observer.lastValue); // Navigate back to page 1. [web_view_ goBack]; ASSERT_TRUE( test::WaitForWebViewContainingTextOrTimeout(web_view_, @"Link 1")); + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + base::test::ios::kWaitForJSCompletionTimeout, ^{ + return [page_1_title isEqualToString:web_view_.title]; + })); EXPECT_NSEQ(page_1_title, observer.lastValue); }
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h index 803d1f7..aaadb116a 100644 --- a/ipc/ipc_message_start.h +++ b/ipc/ipc_message_start.h
@@ -23,7 +23,6 @@ NaClHostMsgStart, EncryptedMediaMsgStart, GinJavaBridgeMsgStart, - ChromeUtilityPrintingMsgStart, ExtensionsGuestViewMsgStart, GuestViewMsgStart, MediaPlayerDelegateMsgStart,
diff --git a/ipc/trace_ipc_message.cc b/ipc/trace_ipc_message.cc index c0f4b2c..a550d78 100644 --- a/ipc/trace_ipc_message.cc +++ b/ipc/trace_ipc_message.cc
@@ -53,9 +53,6 @@ case GinJavaBridgeMsgStart: message_class = ChromeLegacyIpc::CLASS_GIN_JAVA_BRIDGE; break; - case ChromeUtilityPrintingMsgStart: - message_class = ChromeLegacyIpc::CLASS_CHROME_UTILITY_PRINTING; - break; case ExtensionsGuestViewMsgStart: message_class = ChromeLegacyIpc::CLASS_EXTENSIONS_GUEST_VIEW; break;
diff --git a/media/audio/audio_io.h b/media/audio/audio_io.h index e574390..295be099 100644 --- a/media/audio/audio_io.h +++ b/media/audio/audio_io.h
@@ -161,6 +161,8 @@ kFailed, // Failed to open due to OS-level System permissions. kFailedSystemPermissions, + // Failed to open as the device is exclusively opened by another app. + kFailedInUse, }; // Open the stream and prepares it for recording. Call Start() to actually
diff --git a/media/audio/win/audio_low_latency_input_win.cc b/media/audio/win/audio_low_latency_input_win.cc index 23494fc2..01e1395f 100644 --- a/media/audio/win/audio_low_latency_input_win.cc +++ b/media/audio/win/audio_low_latency_input_win.cc
@@ -424,8 +424,14 @@ return OpenOutcome::kSuccess; } - return (hr == E_ACCESSDENIED) ? OpenOutcome::kFailedSystemPermissions - : OpenOutcome::kFailed; + switch (hr) { + case E_ACCESSDENIED: + return OpenOutcome::kFailedSystemPermissions; + case AUDCLNT_E_DEVICE_IN_USE: + return OpenOutcome::kFailedInUse; + default: + return OpenOutcome::kFailed; + } } void WASAPIAudioInputStream::Start(AudioInputCallback* callback) {
diff --git a/media/base/audio_capturer_source.h b/media/base/audio_capturer_source.h index 7ec2136e..c0c1f80 100644 --- a/media/base/audio_capturer_source.h +++ b/media/base/audio_capturer_source.h
@@ -26,6 +26,7 @@ enum class ErrorCode { kUnknown = 0, kSystemPermissions = 1, + kDeviceInUse = 2, }; class CaptureCallback {
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h index d7bcf89c..81e73c76 100644 --- a/media/base/test_helpers.h +++ b/media/base/test_helpers.h
@@ -415,11 +415,6 @@ base::NumberToString(estimated_duration_ms)); } -MATCHER_P(WebMNegativeTimecodeOffset, timecode_string, "") { - return CONTAINS_STRING(arg, "Got a block with negative timecode offset " + - std::string(timecode_string)); -} - MATCHER(WebMOutOfOrderTimecode, "") { return CONTAINS_STRING( arg, "Got a block with a timecode before the previous block.");
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 122e8a34..fb80b400 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -326,7 +326,8 @@ /*opener=*/nullptr, mojo::NullAssociatedReceiver(), *agent_group_scheduler, - /*session_storage_namespace_id=*/base::EmptyString())), + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt)), web_local_frame_( blink::WebLocalFrame::CreateMainFrame(web_view_, &web_frame_client_,
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn index 9f7dc8c..506995d3 100644 --- a/media/filters/BUILD.gn +++ b/media/filters/BUILD.gn
@@ -215,6 +215,7 @@ "fuchsia/fuchsia_video_decoder.cc", "fuchsia/fuchsia_video_decoder.h", ] + public_deps = [ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media" ] deps += [ "//components/viz/common", "//gpu/command_buffer/client", @@ -222,7 +223,6 @@ "//gpu/ipc/common", "//media/fuchsia/cdm", "//media/fuchsia/common", - "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.mediacodec", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.sysmem", "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index 1cf5e4a..c6a847a 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc
@@ -1614,21 +1614,46 @@ ×tamp_offset_map_[kSourceId])); } -TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { +TEST_F(ChunkDemuxerTest, BeforeClusterTimecode) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); ASSERT_TRUE(AppendCluster(kDefaultFirstCluster())); ClusterBuilder cb; + uint8_t data[] = {0x00}; + + // Test timecodes before the cluster timecode are allowed now. This next + // cluster mimics the blocks in kDefaultSecondCluster(), but with a cluster + // timecode in the future. The blocks will have relative timestamps that + // should make them appear as if they are precisely those in + // kDefaultSecondCluster(). + cb.SetClusterTimecode(1000); // In the future relative to the next blocks. + cb.AddSimpleBlock(kAudioTrackNum, 46, kWebMFlagKeyframe, data, sizeof(data)); + cb.AddSimpleBlock(kVideoTrackNum, 66, kWebMFlagKeyframe, data, sizeof(data)); + cb.AddSimpleBlock(kAudioTrackNum, 69, kWebMFlagKeyframe, data, sizeof(data)); + cb.AddBlockGroup(kAudioTrackNum, 92, kAudioBlockDuration, kWebMFlagKeyframe, + true, data, sizeof(data)); + cb.AddBlockGroup(kVideoTrackNum, 99, kVideoBlockDuration, 0, false, data, + sizeof(data)); + + ASSERT_TRUE(AppendCluster(cb.Finish())); + GenerateExpectedReads(0, 9); +} + +TEST_F(ChunkDemuxerTest, NonMonotonicButBeforeClusterTimecode) { + ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); + ASSERT_TRUE(AppendCluster(kDefaultFirstCluster())); + + ClusterBuilder cb; + uint8_t data[] = {0x00}; // Test timecodes going backwards and including values less than the cluster // timecode. - cb.SetClusterTimecode(5); - AddSimpleBlock(&cb, kAudioTrackNum, 5); - AddSimpleBlock(&cb, kVideoTrackNum, 5); - AddSimpleBlock(&cb, kAudioTrackNum, 3); - AddSimpleBlock(&cb, kVideoTrackNum, 3); + cb.SetClusterTimecode(1000); + cb.AddSimpleBlock(kAudioTrackNum, 69, kWebMFlagKeyframe, data, sizeof(data)); + cb.AddSimpleBlock(kVideoTrackNum, 99, kWebMFlagKeyframe, data, sizeof(data)); + cb.AddSimpleBlock(kAudioTrackNum, 46, kWebMFlagKeyframe, data, sizeof(data)); - EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2")); + EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode()); EXPECT_MEDIA_LOG(StreamParsingFailed()); EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); ASSERT_FALSE(AppendCluster(cb.Finish()));
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc index a9f9b44..908c5b2 100644 --- a/media/filters/fuchsia/fuchsia_video_decoder.cc +++ b/media/filters/fuchsia/fuchsia_video_decoder.cc
@@ -4,7 +4,6 @@ #include "media/filters/fuchsia/fuchsia_video_decoder.h" -#include <fuchsia/media/cpp/fidl.h> #include <fuchsia/mediacodec/cpp/fidl.h> #include <lib/sys/cpp/component_context.h> #include <vulkan/vulkan.h> @@ -31,8 +30,6 @@ #include "media/base/cdm_context.h" #include "media/base/media_switches.h" #include "media/base/video_aspect_ratio.h" -#include "media/base/video_decoder.h" -#include "media/base/video_decoder_config.h" #include "media/base/video_frame.h" #include "media/base/video_util.h" #include "media/fuchsia/cdm/fuchsia_cdm_context.h" @@ -41,7 +38,6 @@ #include "media/fuchsia/common/decrypting_sysmem_buffer_stream.h" #include "media/fuchsia/common/passthrough_sysmem_buffer_stream.h" #include "media/fuchsia/common/stream_processor_helper.h" -#include "media/fuchsia/common/sysmem_client.h" #include "third_party/libyuv/include/libyuv/video_common.h" #include "ui/gfx/buffer_types.h" #include "ui/gfx/client_native_pixmap_factory.h" @@ -75,9 +71,11 @@ // codecs, not just H264). constexpr size_t kInputBufferSize = 1920 * 1080 * 3 / 2 / 2 + 128 * 1024; +} // namespace + // Helper used to hold mailboxes for the output textures. OutputMailbox may // outlive FuchsiaVideoDecoder if is referenced by a VideoFrame. -class OutputMailbox { +class FuchsiaVideoDecoder::OutputMailbox { public: OutputMailbox( scoped_refptr<viz::RasterContextProvider> raster_context_provider, @@ -178,134 +176,21 @@ DISALLOW_COPY_AND_ASSIGN(OutputMailbox); }; -struct InputDecoderPacket { - StreamProcessorHelper::IoPacket packet; - bool used_for_current_stream = true; -}; +// static +std::unique_ptr<VideoDecoder> FuchsiaVideoDecoder::Create( + scoped_refptr<viz::RasterContextProvider> raster_context_provider) { + return std::make_unique<FuchsiaVideoDecoder>( + std::move(raster_context_provider), + /*enable_sw_decoding=*/false); +} -} // namespace - -class FuchsiaVideoDecoder : public VideoDecoder, - public SysmemBufferStream::Sink, - public StreamProcessorHelper::Client { - public: - FuchsiaVideoDecoder( - scoped_refptr<viz::RasterContextProvider> raster_context_provider, - bool enable_sw_decoding); - ~FuchsiaVideoDecoder() override; - - FuchsiaVideoDecoder(const FuchsiaVideoDecoder&) = delete; - FuchsiaVideoDecoder& operator=(const FuchsiaVideoDecoder&) = delete; - - // Decoder implementation. - bool IsPlatformDecoder() const override; - bool SupportsDecryption() const override; - VideoDecoderType GetDecoderType() const override; - - // VideoDecoder implementation. - void Initialize(const VideoDecoderConfig& config, - bool low_delay, - CdmContext* cdm_context, - InitCB init_cb, - const OutputCB& output_cb, - const WaitingCB& waiting_cb) override; - void Decode(scoped_refptr<DecoderBuffer> buffer, DecodeCB decode_cb) override; - void Reset(base::OnceClosure closure) override; - bool NeedsBitstreamConversion() const override; - bool CanReadWithoutStalling() const override; - int GetMaxDecodeRequests() const override; - - private: - StatusCode InitializeSysmemBufferStream(bool is_encrypted, - CdmContext* cdm_context, - bool* secure_mode); - - // SysmemBufferStream::Sink implementation. - void OnSysmemBufferStreamBufferCollectionToken( - fuchsia::sysmem::BufferCollectionTokenPtr token) override; - void OnSysmemBufferStreamOutputPacket( - StreamProcessorHelper::IoPacket packet) override; - void OnSysmemBufferStreamEndOfStream() override; - void OnSysmemBufferStreamError() override; - void OnSysmemBufferStreamNoKey() override; - - // StreamProcessorHelper::Client implementation. - void OnStreamProcessorAllocateOutputBuffers( - const fuchsia::media::StreamBufferConstraints& stream_constraints) - override; - void OnStreamProcessorEndOfStream() override; - void OnStreamProcessorOutputFormat( - fuchsia::media::StreamOutputFormat format) override; - void OnStreamProcessorOutputPacket( - StreamProcessorHelper::IoPacket packet) override; - void OnStreamProcessorNoKey() override; - void OnStreamProcessorError() override; - - // Calls next callback in the |decode_callbacks_| queue. - void CallNextDecodeCallback(); - - // Drops all pending input buffers and then calls all pending DecodeCB with - // |status|. Returns true if the decoder still exists. - bool DropInputQueue(DecodeStatus status); - - // Called on errors to shutdown the decoder and notify the client. - void OnError(); - - // Callback for SysmemBufferCollection::CreateSharedToken(), used to send the - // sysmem buffer collection token to the GPU process. - void SetBufferCollectionTokenForGpu( - fuchsia::sysmem::BufferCollectionTokenPtr token); - - // Called by OutputMailbox to signal that the output buffer can be reused. - void ReleaseOutputPacket(StreamProcessorHelper::IoPacket packet); - - // Releases BufferCollection used for output buffers if any. - void ReleaseOutputBuffers(); - - const scoped_refptr<viz::RasterContextProvider> raster_context_provider_; - const bool enable_sw_decoding_; - const bool use_overlays_for_video_; - - OutputCB output_cb_; - WaitingCB waiting_cb_; - - // Aspect ratio specified in container. - VideoAspectRatio container_aspect_ratio_; - - std::unique_ptr<SysmemBufferStream> sysmem_buffer_stream_; - - size_t max_decoder_requests_ = kNumInputBuffers + 1; - - VideoDecoderConfig current_config_; - - std::unique_ptr<StreamProcessorHelper> decoder_; - - SysmemAllocatorClient sysmem_allocator_; - std::unique_ptr<gfx::ClientNativePixmapFactory> client_native_pixmap_factory_; - - // Callbacks for pending Decode() request. - std::deque<DecodeCB> decode_callbacks_; - - // Input buffers for |decoder_|. - std::unique_ptr<SysmemCollectionClient> input_buffer_collection_; - - // Output buffers for |decoder_|. - fuchsia::media::VideoUncompressedFormat output_format_; - std::unique_ptr<SysmemCollectionClient> output_buffer_collection_; - gfx::SysmemBufferCollectionId output_buffer_collection_id_; - std::vector<OutputMailbox*> output_mailboxes_; - - size_t num_used_output_buffers_ = 0; - - base::WeakPtr<FuchsiaVideoDecoder> weak_this_; - base::WeakPtrFactory<FuchsiaVideoDecoder> weak_factory_{this}; - - // WeakPtrFactory used to schedule CallNextDecodeCallbacks(). These pointers - // are discarded in DropInputQueue() in order to avoid calling - // Decode() callback when the decoder queue is discarded. - base::WeakPtrFactory<FuchsiaVideoDecoder> decode_callbacks_weak_factory_{ - this}; -}; +// static +std::unique_ptr<VideoDecoder> FuchsiaVideoDecoder::CreateForTests( + scoped_refptr<viz::RasterContextProvider> raster_context_provider, + bool enable_sw_decoding) { + return std::make_unique<FuchsiaVideoDecoder>( + std::move(raster_context_provider), enable_sw_decoding); +} FuchsiaVideoDecoder::FuchsiaVideoDecoder( scoped_refptr<viz::RasterContextProvider> raster_context_provider, @@ -796,18 +681,4 @@ num_used_output_buffers_--; } -std::unique_ptr<VideoDecoder> CreateFuchsiaVideoDecoder( - scoped_refptr<viz::RasterContextProvider> raster_context_provider) { - return std::make_unique<FuchsiaVideoDecoder>( - std::move(raster_context_provider), - /*enable_sw_decoding=*/false); -} - -std::unique_ptr<VideoDecoder> CreateFuchsiaVideoDecoderForTests( - scoped_refptr<viz::RasterContextProvider> raster_context_provider, - bool enable_sw_decoding) { - return std::make_unique<FuchsiaVideoDecoder>( - std::move(raster_context_provider), enable_sw_decoding); -} - } // namespace media
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.h b/media/filters/fuchsia/fuchsia_video_decoder.h index 4834581..c0fd3fdd 100644 --- a/media/filters/fuchsia/fuchsia_video_decoder.h +++ b/media/filters/fuchsia/fuchsia_video_decoder.h
@@ -7,8 +7,19 @@ #include <memory> +#include <fuchsia/media/cpp/fidl.h> + #include "base/memory/scoped_refptr.h" #include "media/base/media_export.h" +#include "media/base/video_decoder.h" +#include "media/base/video_decoder_config.h" +#include "media/fuchsia/common/sysmem_buffer_stream.h" +#include "media/fuchsia/common/sysmem_client.h" +#include "ui/gfx/native_pixmap_handle.h" + +namespace gfx { +class ClientNativePixmapFactory; +} // namespace gfx namespace viz { class RasterContextProvider; @@ -16,19 +27,142 @@ namespace media { -class VideoDecoder; +class MEDIA_EXPORT FuchsiaVideoDecoder : public VideoDecoder, + public SysmemBufferStream::Sink, + public StreamProcessorHelper::Client { + public: + // Creates VideoDecoder that uses fuchsia.mediacodec API. The returned + // VideoDecoder instance will only try to use hardware video codecs. + MEDIA_EXPORT static std::unique_ptr<VideoDecoder> Create( + scoped_refptr<viz::RasterContextProvider> raster_context_provider); -// Creates VideoDecoder that uses fuchsia.mediacodec API. The returned -// VideoDecoder instance will only try to use hardware video codecs. -MEDIA_EXPORT std::unique_ptr<VideoDecoder> CreateFuchsiaVideoDecoder( - scoped_refptr<viz::RasterContextProvider> raster_context_provider); + // Same as above, but also allows to enable software codecs. This is useful + // for FuchsiaVideoDecoder tests that run on systems that don't have hardware + // decoder support. + MEDIA_EXPORT static std::unique_ptr<VideoDecoder> CreateForTests( + scoped_refptr<viz::RasterContextProvider> raster_context_provider, + bool enable_sw_decoding); -// Same as above, but also allows to enable software codecs. This is useful for -// FuchsiaVideoDecoder tests that run on systems that don't have hardware -// decoder support. -MEDIA_EXPORT std::unique_ptr<VideoDecoder> CreateFuchsiaVideoDecoderForTests( - scoped_refptr<viz::RasterContextProvider> raster_context_provider, - bool enable_sw_decoding); + FuchsiaVideoDecoder( + scoped_refptr<viz::RasterContextProvider> raster_context_provider, + bool enable_sw_decoding); + ~FuchsiaVideoDecoder() override; + + FuchsiaVideoDecoder(const FuchsiaVideoDecoder&) = delete; + FuchsiaVideoDecoder& operator=(const FuchsiaVideoDecoder&) = delete; + + // Decoder implementation. + bool IsPlatformDecoder() const override; + bool SupportsDecryption() const override; + VideoDecoderType GetDecoderType() const override; + + // VideoDecoder implementation. + void Initialize(const VideoDecoderConfig& config, + bool low_delay, + CdmContext* cdm_context, + InitCB init_cb, + const OutputCB& output_cb, + const WaitingCB& waiting_cb) override; + void Decode(scoped_refptr<DecoderBuffer> buffer, DecodeCB decode_cb) override; + void Reset(base::OnceClosure closure) override; + bool NeedsBitstreamConversion() const override; + bool CanReadWithoutStalling() const override; + int GetMaxDecodeRequests() const override; + + private: + class OutputMailbox; + + StatusCode InitializeSysmemBufferStream(bool is_encrypted, + CdmContext* cdm_context, + bool* secure_mode); + + // SysmemBufferStream::Sink implementation. + void OnSysmemBufferStreamBufferCollectionToken( + fuchsia::sysmem::BufferCollectionTokenPtr token) override; + void OnSysmemBufferStreamOutputPacket( + StreamProcessorHelper::IoPacket packet) override; + void OnSysmemBufferStreamEndOfStream() override; + void OnSysmemBufferStreamError() override; + void OnSysmemBufferStreamNoKey() override; + + // StreamProcessorHelper::Client implementation. + void OnStreamProcessorAllocateOutputBuffers( + const fuchsia::media::StreamBufferConstraints& stream_constraints) + override; + void OnStreamProcessorEndOfStream() override; + void OnStreamProcessorOutputFormat( + fuchsia::media::StreamOutputFormat format) override; + void OnStreamProcessorOutputPacket( + StreamProcessorHelper::IoPacket packet) override; + void OnStreamProcessorNoKey() override; + void OnStreamProcessorError() override; + + // Calls next callback in the |decode_callbacks_| queue. + void CallNextDecodeCallback(); + + // Drops all pending input buffers and then calls all pending DecodeCB with + // |status|. Returns true if the decoder still exists. + bool DropInputQueue(DecodeStatus status); + + // Called on errors to shutdown the decoder and notify the client. + void OnError(); + + // Callback for SysmemBufferCollection::CreateSharedToken(), used to send the + // sysmem buffer collection token to the GPU process. + void SetBufferCollectionTokenForGpu( + fuchsia::sysmem::BufferCollectionTokenPtr token); + + // Called by OutputMailbox to signal that the output buffer can be reused. + void ReleaseOutputPacket(StreamProcessorHelper::IoPacket packet); + + // Releases BufferCollection used for output buffers if any. + void ReleaseOutputBuffers(); + + const scoped_refptr<viz::RasterContextProvider> raster_context_provider_; + const bool enable_sw_decoding_; + const bool use_overlays_for_video_; + + OutputCB output_cb_; + WaitingCB waiting_cb_; + + // Aspect ratio specified in container. + VideoAspectRatio container_aspect_ratio_; + + std::unique_ptr<SysmemBufferStream> sysmem_buffer_stream_; + + // Initialized in InitializeSysmemBufferStream() + size_t max_decoder_requests_ = 1; + + VideoDecoderConfig current_config_; + + std::unique_ptr<StreamProcessorHelper> decoder_; + + SysmemAllocatorClient sysmem_allocator_; + std::unique_ptr<gfx::ClientNativePixmapFactory> client_native_pixmap_factory_; + + // Callbacks for pending Decode() request. + std::deque<DecodeCB> decode_callbacks_; + + // Input buffers for |decoder_|. + std::unique_ptr<SysmemCollectionClient> input_buffer_collection_; + + // Output buffers for |decoder_|. + fuchsia::media::VideoUncompressedFormat output_format_; + std::unique_ptr<SysmemCollectionClient> output_buffer_collection_; + gfx::SysmemBufferCollectionId output_buffer_collection_id_; + std::vector<OutputMailbox*> output_mailboxes_; + + size_t num_used_output_buffers_ = 0; + + base::WeakPtr<FuchsiaVideoDecoder> weak_this_; + base::WeakPtrFactory<FuchsiaVideoDecoder> weak_factory_{this}; + + // WeakPtrFactory used to schedule CallNextDecodeCallbacks(). These pointers + // are discarded in DropInputQueue() in order to avoid calling + // Decode() callback when the decoder queue is discarded. + base::WeakPtrFactory<FuchsiaVideoDecoder> decode_callbacks_weak_factory_{ + this}; +}; } // namespace media
diff --git a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc index 24bebcc..aced32b7 100644 --- a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc +++ b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
@@ -293,8 +293,8 @@ : raster_context_provider_( base::MakeRefCounted<TestRasterContextProvider>()), decoder_( - CreateFuchsiaVideoDecoderForTests(raster_context_provider_.get(), - /*enable_sw_decoding=*/true)) {} + FuchsiaVideoDecoder::CreateForTests(raster_context_provider_.get(), + /*enable_sw_decoding=*/true)) {} ~FuchsiaVideoDecoderTest() override = default; bool InitializeDecoder(VideoDecoderConfig config) WARN_UNUSED_RESULT {
diff --git a/media/formats/webm/webm_cluster_parser.cc b/media/formats/webm/webm_cluster_parser.cc index 84423638..1907980 100644 --- a/media/formats/webm/webm_cluster_parser.cc +++ b/media/formats/webm/webm_cluster_parser.cc
@@ -74,7 +74,7 @@ WebMClusterParser::~WebMClusterParser() = default; void WebMClusterParser::Reset() { - last_block_timecode_ = -1; + last_block_timecode_.reset(); cluster_timecode_ = -1; cluster_start_time_ = kNoTimestamp; cluster_ended_ = false; @@ -117,7 +117,7 @@ // call. parser_.Reset(); - last_block_timecode_ = -1; + last_block_timecode_.reset(); cluster_timecode_ = -1; } @@ -458,15 +458,7 @@ return false; } - // TODO(acolwell): Should relative negative timecode offsets be rejected? Or - // only when the absolute timecode is negative? See http://crbug.com/271794 - if (timecode < 0) { - MEDIA_LOG(ERROR, media_log_) << "Got a block with negative timecode offset " - << timecode; - return false; - } - - if (last_block_timecode_ != -1 && timecode < last_block_timecode_) { + if (last_block_timecode_.has_value() && timecode < *last_block_timecode_) { MEDIA_LOG(ERROR, media_log_) << "Got a block with a timecode before the previous block."; return false;
diff --git a/media/formats/webm/webm_cluster_parser.h b/media/formats/webm/webm_cluster_parser.h index 4eaa97e..1f2ffcba 100644 --- a/media/formats/webm/webm_cluster_parser.h +++ b/media/formats/webm/webm_cluster_parser.h
@@ -21,6 +21,7 @@ #include "media/base/stream_parser_buffer.h" #include "media/formats/webm/webm_parser.h" #include "media/formats/webm/webm_tracks_parser.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace media { @@ -279,7 +280,11 @@ WebMListParser parser_; - int64_t last_block_timecode_ = -1; + // A |last_block_timecode_| value of -1 is not enough to indicate it is unset + // now that negative block timecodes are allowed, so we explicitly use + // absl::optional to know if it is currently set. + absl::optional<int64_t> last_block_timecode_ = absl::nullopt; + std::unique_ptr<uint8_t[]> block_data_; int block_data_size_ = -1; int64_t block_duration_ = -1;
diff --git a/media/gpu/ipc/common/media_messages.h b/media/gpu/ipc/common/media_messages.h index 8d0e1f8..880734f 100644 --- a/media/gpu/ipc/common/media_messages.h +++ b/media/gpu/ipc/common/media_messages.h
@@ -34,15 +34,6 @@ IPC_STRUCT_END() //------------------------------------------------------------------------------ -// Utility Messages - -// Sent from Renderer to GPU process to request a token identifying the channel. -// These tokens can be used to prove ownership of the channel. The intended use -// case is to share the command buffer with MojoMediaApplication. -IPC_SYNC_MESSAGE_CONTROL0_1(GpuCommandBufferMsg_GetChannelToken, - base::UnguessableToken /* channel_token */) - -//------------------------------------------------------------------------------ // Accelerated Video Decoder Messages // These messages are sent from Renderer process to GPU process.
diff --git a/media/gpu/ipc/service/media_gpu_channel.cc b/media/gpu/ipc/service/media_gpu_channel.cc index 927c538..52f530c 100644 --- a/media/gpu/ipc/service/media_gpu_channel.cc +++ b/media/gpu/ipc/service/media_gpu_channel.cc
@@ -5,9 +5,7 @@ #include "media/gpu/ipc/service/media_gpu_channel.h" #include "base/single_thread_task_runner.h" -#include "base/unguessable_token.h" #include "gpu/ipc/service/gpu_channel.h" -#include "ipc/message_filter.h" #include "media/gpu/ipc/common/media_messages.h" #include "media/gpu/ipc/service/gpu_video_decode_accelerator.h" @@ -33,54 +31,10 @@ DISALLOW_COPY_AND_ASSIGN(MediaGpuChannelDispatchHelper); }; -// Filter to respond to GetChannelToken on the IO thread. -class MediaGpuChannelFilter : public IPC::MessageFilter { - public: - explicit MediaGpuChannelFilter(const base::UnguessableToken& channel_token) - : channel_token_(channel_token) {} - - void OnFilterAdded(IPC::Channel* channel) override { channel_ = channel; } - - void OnFilterRemoved() override { channel_ = nullptr; } - - bool OnMessageReceived(const IPC::Message& msg) override { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MediaGpuChannelFilter, msg) - IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetChannelToken, - OnGetChannelToken) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; - } - - void OnGetChannelToken(IPC::Message* reply_message) { - GpuCommandBufferMsg_GetChannelToken::WriteReplyParams(reply_message, - channel_token_); - Send(reply_message); - } - - bool Send(IPC::Message* msg) { - if (channel_) - return channel_->Send(msg); - return false; - } - - private: - ~MediaGpuChannelFilter() override = default; - - IPC::Channel* channel_; - base::UnguessableToken channel_token_; -}; - MediaGpuChannel::MediaGpuChannel( gpu::GpuChannel* channel, - const base::UnguessableToken& channel_token, const AndroidOverlayMojoFactoryCB& overlay_factory_cb) - : channel_(channel), - filter_(new MediaGpuChannelFilter(channel_token)), - overlay_factory_cb_(overlay_factory_cb) { - channel_->AddFilter(filter_.get()); -} + : channel_(channel), overlay_factory_cb_(overlay_factory_cb) {} MediaGpuChannel::~MediaGpuChannel() = default;
diff --git a/media/gpu/ipc/service/media_gpu_channel.h b/media/gpu/ipc/service/media_gpu_channel.h index 8d21c2a..a7abf875 100644 --- a/media/gpu/ipc/service/media_gpu_channel.h +++ b/media/gpu/ipc/service/media_gpu_channel.h
@@ -18,12 +18,10 @@ namespace media { class MediaGpuChannelDispatchHelper; -class MediaGpuChannelFilter; class MediaGpuChannel : public IPC::Listener, public IPC::Sender { public: MediaGpuChannel(gpu::GpuChannel* channel, - const base::UnguessableToken& channel_token, const AndroidOverlayMojoFactoryCB& overlay_factory_cb); ~MediaGpuChannel() override; @@ -43,7 +41,6 @@ IPC::Message* reply_message); gpu::GpuChannel* const channel_; - scoped_refptr<MediaGpuChannelFilter> filter_; AndroidOverlayMojoFactoryCB overlay_factory_cb_; DISALLOW_COPY_AND_ASSIGN(MediaGpuChannel);
diff --git a/media/gpu/ipc/service/media_gpu_channel_manager.cc b/media/gpu/ipc/service/media_gpu_channel_manager.cc index 479ebaa..2bd70bdf 100644 --- a/media/gpu/ipc/service/media_gpu_channel_manager.cc +++ b/media/gpu/ipc/service/media_gpu_channel_manager.cc
@@ -22,12 +22,13 @@ MediaGpuChannelManager::~MediaGpuChannelManager() = default; -void MediaGpuChannelManager::AddChannel(int32_t client_id) { +void MediaGpuChannelManager::AddChannel( + int32_t client_id, + const base::UnguessableToken& channel_token) { gpu::GpuChannel* gpu_channel = channel_manager_->LookupChannel(client_id); DCHECK(gpu_channel); - base::UnguessableToken channel_token = base::UnguessableToken::Create(); - std::unique_ptr<MediaGpuChannel> media_gpu_channel( - new MediaGpuChannel(gpu_channel, channel_token, overlay_factory_cb_)); + auto media_gpu_channel = + std::make_unique<MediaGpuChannel>(gpu_channel, overlay_factory_cb_); gpu_channel->SetUnhandledMessageListener(media_gpu_channel.get()); media_gpu_channels_[client_id] = std::move(media_gpu_channel); channel_to_token_[client_id] = channel_token;
diff --git a/media/gpu/ipc/service/media_gpu_channel_manager.h b/media/gpu/ipc/service/media_gpu_channel_manager.h index 1e0832ad..6594269 100644 --- a/media/gpu/ipc/service/media_gpu_channel_manager.h +++ b/media/gpu/ipc/service/media_gpu_channel_manager.h
@@ -33,7 +33,8 @@ explicit MediaGpuChannelManager(gpu::GpuChannelManager* channel_manager); ~MediaGpuChannelManager(); - void AddChannel(int32_t client_id); + void AddChannel(int32_t client_id, + const base::UnguessableToken& channel_token); void RemoveChannel(int32_t client_id); void DestroyAllChannels();
diff --git a/media/mojo/common/input_error_code_converter.cc b/media/mojo/common/input_error_code_converter.cc index 3829bb7..c740d65 100644 --- a/media/mojo/common/input_error_code_converter.cc +++ b/media/mojo/common/input_error_code_converter.cc
@@ -10,6 +10,8 @@ switch (code) { case mojom::InputStreamErrorCode::kSystemPermissions: return AudioCapturerSource::ErrorCode::kSystemPermissions; + case mojom::InputStreamErrorCode::kDeviceInUse: + return AudioCapturerSource::ErrorCode::kDeviceInUse; case mojom::InputStreamErrorCode::kUnknown: break; }
diff --git a/media/mojo/mojom/audio_input_stream.mojom b/media/mojo/mojom/audio_input_stream.mojom index 9f48a3a..2ca29b1 100644 --- a/media/mojo/mojom/audio_input_stream.mojom +++ b/media/mojo/mojom/audio_input_stream.mojom
@@ -43,6 +43,7 @@ kStreamCreationFailed = 3, kDocumentDestroyed = 4, kSystemPermissions = 5, + kDeviceInUse = 6, }; // It will be called only once when input stream starts recording.
diff --git a/media/mojo/mojom/media_types.mojom b/media/mojo/mojom/media_types.mojom index c24b4a0..5567be82 100644 --- a/media/mojo/mojom/media_types.mojom +++ b/media/mojo/mojom/media_types.mojom
@@ -485,6 +485,7 @@ enum InputStreamErrorCode { kUnknown = 0, kSystemPermissions = 1, + kDeviceInUse = 2, }; // See media/base/renderer_factory_selector.h for description.
diff --git a/media/renderers/default_decoder_factory.cc b/media/renderers/default_decoder_factory.cc index 5e242d36..779f8e6 100644 --- a/media/renderers/default_decoder_factory.cc +++ b/media/renderers/default_decoder_factory.cc
@@ -176,7 +176,7 @@ // // TODO(crbug.com/580386): Handle context loss properly. if (context_provider) { - video_decoders->push_back(CreateFuchsiaVideoDecoder(context_provider)); + video_decoders->push_back(FuchsiaVideoDecoder::Create(context_provider)); } else { DLOG(ERROR) << "Can't create FuchsiaVideoDecoder due to GPU context loss.";
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc index 66dc1b0..ff60394 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -120,7 +120,8 @@ // and prone to leakage. Switch this to pass around std::unique_ptr // such that callers own resources explicitly. struct FrameResources { - explicit FrameResources(const gfx::Size& size) : size(size) {} + explicit FrameResources(const gfx::Size& size, gfx::BufferUsage usage) + : size(size), usage(usage) {} void MarkUsed() { is_used_ = true; last_use_time_ = base::TimeTicks(); @@ -133,6 +134,7 @@ base::TimeTicks last_use_time() const { return last_use_time_; } const gfx::Size size; + const gfx::BufferUsage usage; PlaneResource plane_resources[VideoFrame::kMaxPlanes]; // The sync token used to recycle or destroy the resources. It is set when // the resources are returned from the VideoFrame (via @@ -192,8 +194,9 @@ // Return true if |resources| can be used to represent a frame for // specific |format| and |size|. static bool AreFrameResourcesCompatible(const FrameResources* resources, - const gfx::Size& size) { - return size == resources->size; + const gfx::Size& size, + gfx::BufferUsage usage) { + return size == resources->size && usage == resources->usage; } // Get the resources needed for a frame out of the pool, or create them if @@ -201,7 +204,8 @@ // This also drops the LRU resources that can't be reuse for this frame. FrameResources* GetOrCreateFrameResources( const gfx::Size& size, - GpuVideoAcceleratorFactories::OutputFormat format); + GpuVideoAcceleratorFactories::OutputFormat format, + gfx::BufferUsage usage); // Calls the FrameReadyCB of the first entry in |frame_copy_requests_|, with // the provided |video_frame|, then deletes the entry from @@ -865,7 +869,7 @@ ? nullptr : GetOrCreateFrameResources( CodedSize(request.video_frame.get(), output_format_), - output_format_); + output_format_, gfx::BufferUsage::SCANOUT_CPU_READ_WRITE); if (!frame_resources) { std::move(request.frame_ready_cb).Run(std::move(request.video_frame)); frame_copy_requests_.pop_front(); @@ -1214,14 +1218,15 @@ GpuMemoryBufferVideoFramePool::PoolImpl::FrameResources* GpuMemoryBufferVideoFramePool::PoolImpl::GetOrCreateFrameResources( const gfx::Size& size, - GpuVideoAcceleratorFactories::OutputFormat format) { + GpuVideoAcceleratorFactories::OutputFormat format, + gfx::BufferUsage usage) { DCHECK(media_task_runner_->BelongsToCurrentThread()); auto it = resources_pool_.begin(); while (it != resources_pool_.end()) { FrameResources* frame_resources = *it; if (!frame_resources->is_used()) { - if (AreFrameResourcesCompatible(frame_resources, size)) { + if (AreFrameResourcesCompatible(frame_resources, size, usage)) { frame_resources->MarkUsed(); return frame_resources; } else { @@ -1235,7 +1240,7 @@ } // Create the resources. - FrameResources* frame_resources = new FrameResources(size); + FrameResources* frame_resources = new FrameResources(size, usage); resources_pool_.push_back(frame_resources); for (size_t i = 0; i < NumGpuMemoryBuffers(output_format_); i++) { PlaneResource& plane_resource = frame_resources->plane_resources[i]; @@ -1247,8 +1252,7 @@ const gfx::BufferFormat buffer_format = GpuMemoryBufferFormat(format, i); plane_resource.gpu_memory_buffer = gpu_factories_->CreateGpuMemoryBuffer( - plane_resource.size, buffer_format, - gfx::BufferUsage::SCANOUT_CPU_READ_WRITE); + plane_resource.size, buffer_format, usage); } return frame_resources; }
diff --git a/mojo/PRESUBMIT.py b/mojo/PRESUBMIT.py index 47196cf..67910ac 100644 --- a/mojo/PRESUBMIT.py +++ b/mojo/PRESUBMIT.py
@@ -10,6 +10,9 @@ import os.path +USE_PYTHON3 = True + + def CheckChangeOnUpload(input_api, output_api): # Additional python module paths (we're in src/mojo/); not everyone needs # them, but it's easiest to add them to everyone's path.
diff --git a/native_client_sdk/src/doc/PRESUBMIT.py b/native_client_sdk/src/doc/PRESUBMIT.py index 35d7beb..e629a36 100644 --- a/native_client_sdk/src/doc/PRESUBMIT.py +++ b/native_client_sdk/src/doc/PRESUBMIT.py
@@ -4,6 +4,9 @@ import subprocess +USE_PYTHON3 = True + + def _CheckSphinxBuild(input_api, output_api): """Check that the docs are buildable without any warnings. @@ -18,7 +21,7 @@ stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: return [output_api.PresubmitNotifyResult('sphinx_build failed:\n' + - e.output)] + e.output.decode('utf-8'))] return []
diff --git a/net/base/port_util.cc b/net/base/port_util.cc index 3051823..c243c191 100644 --- a/net/base/port_util.cc +++ b/net/base/port_util.cc
@@ -20,45 +20,33 @@ namespace { -// Records ports newly blocked in https://github.com/whatwg/fetch/pull/1148 for -// "NAT Slipstreaming v2.0" vulnerability, plus 10080, to measure the breakage -// from blocking them. Every other port is logged as kOther to provide a -// baseline. See also https://samy.pl/slipstream/. Ports are logged regardless -// of protocol and whether they are blocked or not. -// TODO(ricea): Remove this in April 2021. -void LogSlipstreamRestrictedPort(int port) { - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class SlipstreamPort { - kOther = 0, - k69 = 1, - k137 = 2, - k161 = 3, - k554 = 4, - k1719 = 5, - k1720 = 6, - k1723 = 7, - k6566 = 8, - k10080 = 9, - kMaxValue = k10080, +// Records ports that may need blocking to mitigate the ALPACA vulnerability. +// See https://alpaca-attack.com/ and https://github.com/whatwg/fetch/pull/1250. +void LogAlpacaPort(int port) { + // Unlike the obsolete Net.Port.SlipStreamRestricted histogram, we don't + // record an "Other" category. Instead, historical data from + // Net.Port.SlipStreamRestricted can be used as a baseline for comparisons. + enum class AlpacaPort { + k26 = 0, + k989 = 1, + k990 = 2, + k2525 = 3, + kMaxValue = k2525, }; - constexpr auto kMap = base::MakeFixedFlatMap<int, SlipstreamPort>({ - {69, SlipstreamPort::k69}, - {137, SlipstreamPort::k137}, - {161, SlipstreamPort::k161}, - {554, SlipstreamPort::k554}, - {1719, SlipstreamPort::k1719}, - {1720, SlipstreamPort::k1720}, - {1723, SlipstreamPort::k1723}, - {6566, SlipstreamPort::k6566}, - {10080, SlipstreamPort::k10080}, - }); + constexpr std::pair<int, AlpacaPort> kMap[] = { + {26, AlpacaPort::k26}, + {989, AlpacaPort::k989}, + {990, AlpacaPort::k990}, + {2525, AlpacaPort::k2525}, + }; - auto* it = kMap.find(port); - SlipstreamPort as_enum = - it == kMap.end() ? SlipstreamPort::kOther : it->second; - base::UmaHistogramEnumeration("Net.Port.SlipstreamRestricted", as_enum); + for (const auto& pair : kMap) { + if (pair.first == port) { + base::UmaHistogramEnumeration("Net.Port.Alpaca", pair.second); + return; + } + } } // The general list of blocked ports. Will be blocked unless a specific @@ -181,7 +169,7 @@ if (!IsPortValid(port)) return false; - LogSlipstreamRestrictedPort(port); + LogAlpacaPort(port); // Allow explicitly allowed ports for any scheme. if (g_explicitly_allowed_ports.Get().count(port) > 0)
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index adba3ec..d99dc66 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -274,6 +274,13 @@ CanonicalCookie::CanonicalCookie(const CanonicalCookie& other) = default; +CanonicalCookie::CanonicalCookie(CanonicalCookie&& other) = default; + +CanonicalCookie& CanonicalCookie::operator=(const CanonicalCookie& other) = + default; + +CanonicalCookie& CanonicalCookie::operator=(CanonicalCookie&& other) = default; + CanonicalCookie::CanonicalCookie(const std::string& name, const std::string& value, const std::string& domain,
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h index e211388..5cbe335 100644 --- a/net/cookies/canonical_cookie.h +++ b/net/cookies/canonical_cookie.h
@@ -59,11 +59,11 @@ CanonicalCookie(); CanonicalCookie(const CanonicalCookie& other); - + CanonicalCookie(CanonicalCookie&& other); + CanonicalCookie& operator=(const CanonicalCookie& other); + CanonicalCookie& operator=(CanonicalCookie&& other); ~CanonicalCookie(); - // Supports the default copy constructor. - // Creates a new |CanonicalCookie| from the |cookie_line| and the // |creation_time|. Canonicalizes inputs. May return nullptr if // an attribute value is invalid. |url| must be valid. |creation_time| may
diff --git a/net/quic/dedicated_web_transport_http3_client.cc b/net/quic/dedicated_web_transport_http3_client.cc index aa10bb1..9b1ead65 100644 --- a/net/quic/dedicated_web_transport_http3_client.cc +++ b/net/quic/dedicated_web_transport_http3_client.cc
@@ -287,6 +287,9 @@ if (url_.scheme_piece() != url::kHttpsScheme) return ERR_DISALLOWED_URL_SCHEME; + if (!IsPortAllowedForScheme(url_.EffectiveIntPort(), url_.scheme_piece())) + return ERR_UNSAFE_PORT; + // TODO(vasilvv): check if QUIC is disabled by policy. // Ensure that for the duration of the origin trial, a fixed QUIC transport
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn index fb6e80f..ac156d23 100644 --- a/pdf/BUILD.gn +++ b/pdf/BUILD.gn
@@ -118,6 +118,8 @@ "paint_manager.h", "paint_ready_rect.cc", "paint_ready_rect.h", + "parsed_params.cc", + "parsed_params.h", "pdf_engine.h", "pdf_init.cc", "pdf_init.h", @@ -402,6 +404,7 @@ "document_loader_impl_unittest.cc", "draw_utils/coordinates_unittest.cc", "page_orientation_unittest.cc", + "parsed_params_unittest.cc", "pdf_transform_unittest.cc", "pdf_utils/dates_unittest.cc", "pdf_view_plugin_base_unittest.cc",
diff --git a/pdf/accessibility_helper.cc b/pdf/accessibility_helper.cc index 1822bad..6de42f1 100644 --- a/pdf/accessibility_helper.cc +++ b/pdf/accessibility_helper.cc
@@ -38,7 +38,7 @@ return text_range; uint32_t end_char_index = checked_end_char_index.ValueOrDie(); uint32_t current_char_index = 0; - absl::optional<uint32_t> start_text_run; + absl::optional<size_t> start_text_run; for (size_t i = 0; i < text_runs.size(); ++i) { if (!start_text_run.has_value() && IsCharWithinTextRun(text_runs[i], current_char_index,
diff --git a/pdf/accessibility_structs.h b/pdf/accessibility_structs.h index 7bdb1b7a..8fa1b178 100644 --- a/pdf/accessibility_structs.h +++ b/pdf/accessibility_structs.h
@@ -106,7 +106,7 @@ struct AccessibilityTextRunRangeInfo { // Index of the starting text run of the annotation in the collection of all // text runs in the page. - uint32_t index = 0; + size_t index = 0; // Count of the text runs spanning the annotation. uint32_t count = 0; };
diff --git a/pdf/parsed_params.cc b/pdf/parsed_params.cc new file mode 100644 index 0000000..898777b --- /dev/null +++ b/pdf/parsed_params.cc
@@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "pdf/parsed_params.h" + +#include <string> + +#include "base/strings/string_number_conversions.h" +#include "third_party/blink/public/platform/web_string.h" +#include "third_party/blink/public/web/web_plugin_params.h" + +namespace chrome_pdf { + +ParsedParams::ParsedParams() = default; + +ParsedParams::ParsedParams(const ParsedParams& other) = default; + +ParsedParams::~ParsedParams() = default; + +absl::optional<ParsedParams> ParseWebPluginParams( + const blink::WebPluginParams& params) { + ParsedParams result; + for (size_t i = 0; i < params.attribute_names.size(); ++i) { + if (params.attribute_names[i] == "src") { + result.original_url = params.attribute_values[i].Utf8(); + } else if (params.attribute_names[i] == "stream-url") { + result.stream_url = params.attribute_values[i].Utf8(); + } else if (params.attribute_names[i] == "full-frame") { + result.full_frame = true; + } else if (params.attribute_names[i] == "background-color") { + SkColor background_color; + if (!base::StringToUint(params.attribute_values[i].Utf8(), + &background_color)) { + return absl::nullopt; + } + result.background_color = background_color; + } + } + + if (result.original_url.empty()) + return absl::nullopt; + + if (result.stream_url.empty()) + result.stream_url = result.original_url; + + return result; +} + +} // namespace chrome_pdf
diff --git a/pdf/parsed_params.h b/pdf/parsed_params.h new file mode 100644 index 0000000..acc03655 --- /dev/null +++ b/pdf/parsed_params.h
@@ -0,0 +1,44 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDF_PARSED_PARAMS_H_ +#define PDF_PARSED_PARAMS_H_ + +#include <string> + +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace blink { +struct WebPluginParams; +} + +namespace chrome_pdf { + +struct ParsedParams { + ParsedParams(); + ParsedParams(const ParsedParams& other); + ~ParsedParams(); + + // Document URL. Must not be empty. + std::string original_url; + + // Document stream URL. Must not be empty. + std::string stream_url; + + // The background color for the PDF viewer. + absl::optional<SkColor> background_color; + + // Whether the plugin should occupy the entire frame. + bool full_frame = false; +}; + +// Creates an `ParsedParams` by parsing a `blink::WebPluginParams`. If +// `blink::WebPluginParams` is invalid, returns absl::nullopt. +absl::optional<ParsedParams> ParseWebPluginParams( + const blink::WebPluginParams& params); + +} // namespace chrome_pdf + +#endif // PDF_PARSED_PARAMS_H_
diff --git a/pdf/parsed_params_unittest.cc b/pdf/parsed_params_unittest.cc new file mode 100644 index 0000000..e09a917 --- /dev/null +++ b/pdf/parsed_params_unittest.cc
@@ -0,0 +1,119 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "pdf/parsed_params.h" + +#include <string> + +#include "base/strings/string_number_conversions.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/platform/web_string.h" +#include "third_party/blink/public/platform/web_vector.h" +#include "third_party/blink/public/web/web_plugin_params.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace chrome_pdf { + +namespace { + +constexpr char kDummyOriginalUrl[] = "https://test.com/dummy.pdf"; +constexpr char kDummyStreamUrl[] = "chrome-extension://dummy-stream-url"; + +constexpr SkColor kNewBackgroundColor = SkColorSetARGB(0xFF, 0x52, 0x56, 0x59); + +// `kNewBackgroundColor` as a decimal number in string format. +constexpr char kNewBackgroundColorStr[] = "4283586137"; + +// Creates a `blink::WebPluginParams` without any URL attributes, namely "src" +// and "stream-url". The return value only contains valid "background-color" and +// "full-frame" attributes. +blink::WebPluginParams CreateWebPluginParamsWithoutUrl() { + blink::WebPluginParams params; + params.attribute_names.push_back(blink::WebString("background-color")); + params.attribute_values.push_back(blink::WebString(kNewBackgroundColorStr)); + params.attribute_names.push_back(blink::WebString("full-frame")); + params.attribute_values.push_back(blink::WebString("")); + return params; +} + +// Creates a `blink::WebPluginParams` with only the URL attributes: "src" and +// "stream-url". +blink::WebPluginParams CreateWebPluginParamsWithUrls() { + blink::WebPluginParams params; + params.attribute_names.push_back(blink::WebString("src")); + params.attribute_values.push_back(blink::WebString(kDummyOriginalUrl)); + params.attribute_names.push_back(blink::WebString("stream-url")); + params.attribute_values.push_back(blink::WebString(kDummyStreamUrl)); + return params; +} + +} // namespace + +TEST(ParsedParamsTest, ParseValidWebPluginParams) { + blink::WebPluginParams params = CreateWebPluginParamsWithoutUrl(); + params.attribute_names.push_back(blink::WebString("src")); + params.attribute_values.push_back(blink::WebString(kDummyOriginalUrl)); + params.attribute_names.push_back(blink::WebString("stream-url")); + params.attribute_values.push_back(blink::WebString(kDummyStreamUrl)); + + absl::optional<ParsedParams> result = ParseWebPluginParams(params); + ASSERT_TRUE(result.has_value()); + EXPECT_EQ(kDummyOriginalUrl, result->original_url); + EXPECT_EQ(kDummyStreamUrl, result->stream_url); + ASSERT_TRUE(result->background_color.has_value()); + EXPECT_EQ(kNewBackgroundColor, result->background_color.value()); + EXPECT_TRUE(result->full_frame); +} + +TEST(ParsedParamsTest, ParseWebPluginParamsWithoutOriginalUrl) { + blink::WebPluginParams params = CreateWebPluginParamsWithoutUrl(); + params.attribute_names.push_back(blink::WebString("stream-url")); + params.attribute_values.push_back(blink::WebString(kDummyStreamUrl)); + + // Expect the `ParsedParams` to be invalid due to missing the original URL. + absl::optional<ParsedParams> result = ParseWebPluginParams(params); + EXPECT_FALSE(result.has_value()); +} + +TEST(ParseParsedParamsTest, ParseWebPluginParamsWithoutStreamUrl) { + blink::WebPluginParams params = CreateWebPluginParamsWithoutUrl(); + params.attribute_names.push_back(blink::WebString("src")); + params.attribute_values.push_back(blink::WebString(kDummyOriginalUrl)); + + // Expect the `ParsedParams` to be valid and `stream_url` to be the same as + // `original_url`. + absl::optional<ParsedParams> result = ParseWebPluginParams(params); + ASSERT_TRUE(result.has_value()); + EXPECT_EQ(kDummyOriginalUrl, result->original_url); + EXPECT_EQ(kDummyOriginalUrl, result->stream_url); + ASSERT_TRUE(result->background_color.has_value()); + EXPECT_EQ(kNewBackgroundColor, result->background_color.value()); + EXPECT_TRUE(result->full_frame); +} + +TEST(ParsedParamsTest, ParseWebPluginParamsWithoutBackgroundColor) { + blink::WebPluginParams params = CreateWebPluginParamsWithUrls(); + + // The `ParsedParams` can still be valid without the background color + // attribute. + absl::optional<ParsedParams> result = ParseWebPluginParams(params); + ASSERT_TRUE(result.has_value()); + EXPECT_EQ(kDummyOriginalUrl, result->original_url); + EXPECT_EQ(kDummyStreamUrl, result->stream_url); + EXPECT_FALSE(result->background_color.has_value()); + EXPECT_FALSE(result->full_frame); +} + +TEST(ParsedParamsTest, ParseWebPluginParamsWithInvalidBackgroundColor) { + blink::WebPluginParams params = CreateWebPluginParamsWithUrls(); + params.attribute_names.push_back(blink::WebString("background-color")); + params.attribute_values.push_back(blink::WebString("red")); + + // Expect the `ParsedParams` to be invalid because the background color's + // attribute value is in the wrong format. + absl::optional<ParsedParams> result = ParseWebPluginParams(params); + EXPECT_FALSE(result.has_value()); +} + +} // namespace chrome_pdf
diff --git a/pdf/pdf_view_web_plugin.cc b/pdf/pdf_view_web_plugin.cc index 5ba0d395..a9e1a7f 100644 --- a/pdf/pdf_view_web_plugin.cc +++ b/pdf/pdf_view_web_plugin.cc
@@ -30,6 +30,7 @@ #include "content/public/renderer/render_frame.h" #include "net/cookies/site_for_cookies.h" #include "pdf/accessibility_structs.h" +#include "pdf/parsed_params.h" #include "pdf/pdf_engine.h" #include "pdf/pdf_init.h" #include "pdf/pdfium/pdfium_engine.h" @@ -59,7 +60,6 @@ #include "third_party/blink/public/web/web_local_frame.h" #include "third_party/blink/public/web/web_plugin_container.h" #include "third_party/blink/public/web/web_plugin_params.h" -#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkRect.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "ui/base/cursor/cursor.h" @@ -188,42 +188,23 @@ std::unique_ptr<ContainerWrapper> container_wrapper) { container_wrapper_ = std::move(container_wrapper); - std::string original_url; - std::string stream_url; - // TODO(https://crbug.com/1199558): Make a helper method to parse - // `initial_params_` without processing the results, and add a unit test for - // it. - for (size_t i = 0; i < initial_params_.attribute_names.size(); ++i) { - if (initial_params_.attribute_names[i] == "src") { - original_url = initial_params_.attribute_values[i].Utf8(); - } else if (initial_params_.attribute_names[i] == "stream-url") { - stream_url = initial_params_.attribute_values[i].Utf8(); - } else if (initial_params_.attribute_names[i] == "full-frame") { - set_full_frame(true); - } else if (initial_params_.attribute_names[i] == "background-color") { - SkColor background_color; - if (!base::StringToUint(initial_params_.attribute_values[i].Utf8(), - &background_color)) { - return false; - } - SetBackgroundColor(background_color); - } - } + absl::optional<ParsedParams> params = ParseWebPluginParams(initial_params_); - // Contents of `initial_params_` no longer needed. + // The contents of `initial_params_` are no longer needed. initial_params_ = {}; - if (original_url.empty()) + if (!params.has_value()) return false; - if (stream_url.empty()) - stream_url = original_url; + set_full_frame(params->full_frame); + if (params->background_color.has_value()) + SetBackgroundColor(params->background_color.value()); PerProcessInitializer::GetInstance().Acquire(); InitializeEngine(std::make_unique<PDFiumEngine>( this, PDFiumFormFiller::ScriptOption::kNoJavaScript)); - LoadUrl(stream_url, /*is_print_preview=*/false); - set_url(original_url); + LoadUrl(params->stream_url, /*is_print_preview=*/false); + set_url(params->original_url); post_message_sender_.set_container(Container()); return true; } @@ -612,7 +593,7 @@ } void PdfViewWebPlugin::SetContentRestrictions(int content_restrictions) { - NOTIMPLEMENTED(); + GetPdfService()->UpdateContentRestrictions(content_restrictions); } void PdfViewWebPlugin::SetPluginCanSave(bool can_save) {
diff --git a/pdf/pdf_view_web_plugin_unittest.cc b/pdf/pdf_view_web_plugin_unittest.cc index df3961c..b438677f 100644 --- a/pdf/pdf_view_web_plugin_unittest.cc +++ b/pdf/pdf_view_web_plugin_unittest.cc
@@ -17,6 +17,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_text_input_type.h" +#include "third_party/blink/public/platform/web_vector.h" #include "third_party/blink/public/web/web_associated_url_loader.h" #include "third_party/blink/public/web/web_plugin_params.h" #include "third_party/skia/include/core/SkBitmap.h"
diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc index d4dd776..78f4e26 100644 --- a/pdf/pdfium/pdfium_page.cc +++ b/pdf/pdfium/pdfium_page.cc
@@ -849,7 +849,7 @@ char16_t PDFiumPage::GetCharAtIndex(int index) { if (!available_) - return L'\0'; + return u'\0'; return static_cast<char16_t>(FPDFText_GetUnicode(GetTextPage(), index)); }
diff --git a/remoting/host/it2me/it2me_native_messaging_host_lacros.cc b/remoting/host/it2me/it2me_native_messaging_host_lacros.cc index c00cf9c..2b587481 100644 --- a/remoting/host/it2me/it2me_native_messaging_host_lacros.cc +++ b/remoting/host/it2me/it2me_native_messaging_host_lacros.cc
@@ -9,6 +9,7 @@ #include <map> #include <memory> #include <string> +#include <utility> #include "base/bind.h" #include "base/json/json_reader.h" @@ -117,7 +118,7 @@ It2MeNativeMessagingHostLacros::It2MeNativeMessagingHostLacros( scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : task_runner_(task_runner) {} + : task_runner_(std::move(task_runner)) {} It2MeNativeMessagingHostLacros::~It2MeNativeMessagingHostLacros() = default; @@ -420,10 +421,9 @@ std::unique_ptr<extensions::NativeMessageHost> CreateIt2MeNativeMessagingHostForLacros( - scoped_refptr<base::SingleThreadTaskRunner> io_runnner, scoped_refptr<base::SingleThreadTaskRunner> ui_runnner) { - // TODO(joedow): Verify |io_runner| is not required then remove it. - return std::make_unique<It2MeNativeMessagingHostLacros>(ui_runnner); + return std::make_unique<It2MeNativeMessagingHostLacros>( + std::move(ui_runnner)); } } // namespace remoting
diff --git a/remoting/host/it2me/it2me_native_messaging_host_lacros.h b/remoting/host/it2me/it2me_native_messaging_host_lacros.h index 93feeeb..2f3fe7a4 100644 --- a/remoting/host/it2me/it2me_native_messaging_host_lacros.h +++ b/remoting/host/it2me/it2me_native_messaging_host_lacros.h
@@ -20,7 +20,6 @@ std::unique_ptr<extensions::NativeMessageHost> CreateIt2MeNativeMessagingHostForLacros( - scoped_refptr<base::SingleThreadTaskRunner> io_runnner, scoped_refptr<base::SingleThreadTaskRunner> ui_runnner); } // namespace remoting
diff --git a/remoting/resources/remoting_strings_az.xtb b/remoting/resources/remoting_strings_az.xtb index d8d6f75..0278b52 100644 --- a/remoting/resources/remoting_strings_az.xtb +++ b/remoting/resources/remoting_strings_az.xtb
@@ -67,6 +67,7 @@ <translation id="4176825807642096119">Giriş kodu</translation> <translation id="4227991223508142681">Host Təchizetmə Proqramı</translation> <translation id="4240294130679914010">Chromoting Host Sistemdən Silən</translation> +<translation id="4257751272692708833"><ph name="PRODUCT_NAME" /> Keçid Yönləndiricisi</translation> <translation id="4277736576214464567">Giriş kodu etibarsızdır. Yenidən cəhd edin.</translation> <translation id="4281844954008187215">Xidmət Şərtləri</translation> <translation id="4405930547258349619">Kök Kitabxana</translation> @@ -121,6 +122,7 @@ <translation id="6612717000975622067">Ctrl-Alt-Del göndərin</translation> <translation id="6654753848497929428">Paylaşın</translation> <translation id="677755392401385740">Host istifadəçi üçün başladı: <ph name="HOST_USERNAME" /> .</translation> +<translation id="6902524959760471898"><ph name="PRODUCT_NAME" /> müştəri cihazında keçidi açmaq üçün yardımçı tətbiq</translation> <translation id="6939719207673461467">Klaviaturanı göstərin/gizlədin.</translation> <translation id="6963936880795878952">Kimsə yanlış PIN kod ilə qoşulmağa cəhd etdiyi üçün uzaqdan idarə edilən kompüterə qoşulma müvəqqəti olaraq blok edilib. Yenidən cəhd edin.</translation> <translation id="6965382102122355670">OK</translation>
diff --git a/remoting/resources/remoting_strings_fr-CA.xtb b/remoting/resources/remoting_strings_fr-CA.xtb index 42fb0e7..19d1a2fa 100644 --- a/remoting/resources/remoting_strings_fr-CA.xtb +++ b/remoting/resources/remoting_strings_fr-CA.xtb
@@ -67,6 +67,7 @@ <translation id="4176825807642096119">Code d'accès</translation> <translation id="4227991223508142681">Utilitaire d'approvisionnement de l'hôte</translation> <translation id="4240294130679914010">Programme de désinstallation de l'hôte de Google Chromoting</translation> +<translation id="4257751272692708833">Transfert d'URL <ph name="PRODUCT_NAME" /></translation> <translation id="4277736576214464567">Le code d'accès n'est pas valide. Veuillez réessayer.</translation> <translation id="4281844954008187215">Conditions d'utilisation</translation> <translation id="4405930547258349619">Bibliothèque principale</translation> @@ -121,6 +122,7 @@ <translation id="6612717000975622067">Envoyer Ctrl-Alt-Suppr</translation> <translation id="6654753848497929428">Partager</translation> <translation id="677755392401385740">Hôte démarré pour l'utilisateur : <ph name="HOST_USERNAME" />.</translation> +<translation id="6902524959760471898">Application d'aide pour ouvrir une URL du client <ph name="PRODUCT_NAME" /></translation> <translation id="6939719207673461467">Afficher et masquer le clavier.</translation> <translation id="6963936880795878952">Les connexions à l'ordinateur distant sont momentanément bloquées, car un utilisateur a tenté de s'y connecter en utilisant un NIP erroné. Veuillez réessayer plus tard.</translation> <translation id="6965382102122355670">OK</translation>
diff --git a/remoting/resources/remoting_strings_gl.xtb b/remoting/resources/remoting_strings_gl.xtb index 97294405..620658f2 100644 --- a/remoting/resources/remoting_strings_gl.xtb +++ b/remoting/resources/remoting_strings_gl.xtb
@@ -67,6 +67,7 @@ <translation id="4176825807642096119">Código de acceso</translation> <translation id="4227991223508142681">Utilidade de abastecemento de host</translation> <translation id="4240294130679914010">Desinstalador do host de Chromoting</translation> +<translation id="4257751272692708833">Aplicación de envío de URL de <ph name="PRODUCT_NAME" /></translation> <translation id="4277736576214464567">O código de acceso non é válido. Téntao de novo.</translation> <translation id="4281844954008187215">Condicións de servizo</translation> <translation id="4405930547258349619">Biblioteca principal</translation> @@ -121,6 +122,7 @@ <translation id="6612717000975622067">Enviar Ctrl-Alt-Supr</translation> <translation id="6654753848497929428">Compartir</translation> <translation id="677755392401385740">Host iniciado para o usuario: <ph name="HOST_USERNAME" />.</translation> +<translation id="6902524959760471898">Aplicación de asistencia para abrir os URL no cliente de <ph name="PRODUCT_NAME" /></translation> <translation id="6939719207673461467">Mostrar/ocultar teclado.</translation> <translation id="6963936880795878952">As conexións co ordenador remoto bloqueáronse temporalmente debido a que alguén estaba tentando conectarse a el cun PIN non válido. Téntao de novo máis tarde.</translation> <translation id="6965382102122355670">Aceptar</translation>
diff --git a/remoting/resources/remoting_strings_kk.xtb b/remoting/resources/remoting_strings_kk.xtb index 15885163..45263d7 100644 --- a/remoting/resources/remoting_strings_kk.xtb +++ b/remoting/resources/remoting_strings_kk.xtb
@@ -67,6 +67,7 @@ <translation id="4176825807642096119">Кіру коды</translation> <translation id="4227991223508142681">Хостқа орналастыру бағдарламасы</translation> <translation id="4240294130679914010">Chromoting Host Uninstaller</translation> +<translation id="4257751272692708833"><ph name="PRODUCT_NAME" /> пайдаланатын URL бағытын өзгерту қолданбасы</translation> <translation id="4277736576214464567">Рұқсат коды жарамсыз. Әрекетті қайталап көріңіз.</translation> <translation id="4281844954008187215">Қызмет көрсету шарттары</translation> <translation id="4405930547258349619">Негізгі кітапхана</translation> @@ -121,6 +122,7 @@ <translation id="6612717000975622067">Ctrl-Alt-Del жіберу</translation> <translation id="6654753848497929428">Бөлісу</translation> <translation id="677755392401385740">Пайдаланушы үшін хост іске қосылды: <ph name="HOST_USERNAME" />.</translation> +<translation id="6902524959760471898"><ph name="PRODUCT_NAME" /> клиентінде URL мекенжайын ашуға көмектесетін қолданба</translation> <translation id="6939719207673461467">Пернетақтаны көрсету/жасыру.</translation> <translation id="6963936880795878952">Қашықтағы компьютерге жарамсыз PIN кодымен кіру әрекеті жасалғандықтан, оған қосылу уақытша мүмкін емес. Әрекетіңізді кейінірек қайталаңыз.</translation> <translation id="6965382102122355670">Жарайды</translation>
diff --git a/remoting/resources/remoting_strings_ky.xtb b/remoting/resources/remoting_strings_ky.xtb index f34fab98e..a52c16f 100644 --- a/remoting/resources/remoting_strings_ky.xtb +++ b/remoting/resources/remoting_strings_ky.xtb
@@ -67,6 +67,7 @@ <translation id="4176825807642096119">Мүмкүндүк алуу коду</translation> <translation id="4227991223508142681">Хостту камсыздоочу кызматтык программа</translation> <translation id="4240294130679914010">Chromoting Хостун орнотуудан чыгаргыч</translation> +<translation id="4257751272692708833"><ph name="PRODUCT_NAME" /> URL'ди багыттагыч</translation> <translation id="4277736576214464567">Мүмкүндүк алуу коду жараксыз. Кайра аракет кылып көрүңүз.</translation> <translation id="4281844954008187215">Тейлөө шарттары</translation> <translation id="4405930547258349619">Ички китепкана</translation> @@ -121,6 +122,7 @@ <translation id="6612717000975622067">Ctrl-Alt-Del жөнөтүү</translation> <translation id="6654753848497929428">Бөлүшүү</translation> <translation id="677755392401385740">Хост төмөнкү колдонуучу үчүн башталды: <ph name="HOST_USERNAME" />.</translation> +<translation id="6902524959760471898">URL'ди <ph name="PRODUCT_NAME" /> кардарында ачууга жардам берген колдонмо</translation> <translation id="6939719207673461467">Баскычтопту көрсөтүү/жашыруу.</translation> <translation id="6963936880795878952">Кимдир-бирөө алыскы компьютерге туура эмес PIN-код менен киргенге аракет кылып жаткандыктан, ушул компьютерге болгон туташуулар убактылуу бөгөттөлдү. Бир аздан кийин кайталап көрүңүз.</translation> <translation id="6965382102122355670">OK</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb index 121764e..ff06dc38 100644 --- a/remoting/resources/remoting_strings_vi.xtb +++ b/remoting/resources/remoting_strings_vi.xtb
@@ -67,6 +67,7 @@ <translation id="4176825807642096119">Mã truy cập</translation> <translation id="4227991223508142681">Tiện ích cấp phép máy chủ</translation> <translation id="4240294130679914010">Trình gỡ cài đặt máy chủ kết nối từ xa trên Chrome</translation> +<translation id="4257751272692708833">Trình chuyển tiếp URL của <ph name="PRODUCT_NAME" /></translation> <translation id="4277736576214464567">Mã truy cập không hợp lệ. Vui lòng thử lại.</translation> <translation id="4281844954008187215">Điều khoản dịch vụ</translation> <translation id="4405930547258349619">Thư viện trung tâm</translation> @@ -121,6 +122,7 @@ <translation id="6612717000975622067">Gửi Ctrl-Alt-Del</translation> <translation id="6654753848497929428">Chia sẻ</translation> <translation id="677755392401385740">Máy chủ đã khởi động cho người dùng: <ph name="HOST_USERNAME" />.</translation> +<translation id="6902524959760471898">Ứng dụng trợ giúp để mở một URL trên máy khách của <ph name="PRODUCT_NAME" /></translation> <translation id="6939719207673461467">Hiển thị / ẩn bàn phím.</translation> <translation id="6963936880795878952">Kết nối với máy tính từ xa tạm thời bị chặn vì ai đó đang cố gắng kết nối với máy tính đó bằng mã PIN không hợp lệ. Vui lòng thử lại sau.</translation> <translation id="6965382102122355670">OK</translation>
diff --git a/remoting/resources/remoting_strings_zh-HK.xtb b/remoting/resources/remoting_strings_zh-HK.xtb index 53f8822..7e07bc0 100644 --- a/remoting/resources/remoting_strings_zh-HK.xtb +++ b/remoting/resources/remoting_strings_zh-HK.xtb
@@ -67,7 +67,7 @@ <translation id="4176825807642096119">存取碼</translation> <translation id="4227991223508142681">主機佈建程式</translation> <translation id="4240294130679914010">Chromoting 主機解除安裝程式</translation> -<translation id="4257751272692708833"><ph name="PRODUCT_NAME" />轉址工具</translation> +<translation id="4257751272692708833">「<ph name="PRODUCT_NAME" />」轉址工具</translation> <translation id="4277736576214464567">存取碼無效,請再試一次。</translation> <translation id="4281844954008187215">服務條款</translation> <translation id="4405930547258349619">核心資料庫</translation> @@ -122,7 +122,7 @@ <translation id="6612717000975622067">傳送 Ctrl-Alt-Del</translation> <translation id="6654753848497929428">共用</translation> <translation id="677755392401385740">已為下列使用者啟動主機:<ph name="HOST_USERNAME" />`</translation> -<translation id="6902524959760471898">協助在 <ph name="PRODUCT_NAME" />用戶端上開啟網址的輔助應用程式</translation> +<translation id="6902524959760471898">協助在「<ph name="PRODUCT_NAME" />」用戶端上開啟網址的輔助應用程式</translation> <translation id="6939719207673461467">顯示/隱藏鍵盤。</translation> <translation id="6963936880795878952">由於有人嘗試使用無效的 PIN 連線至遠端電腦,因此系統暫時封鎖您的連線,請稍後再試。</translation> <translation id="6965382102122355670">確定</translation>
diff --git a/sandbox/policy/BUILD.gn b/sandbox/policy/BUILD.gn index 7dfa776..8321d8d 100644 --- a/sandbox/policy/BUILD.gn +++ b/sandbox/policy/BUILD.gn
@@ -92,7 +92,7 @@ ] deps += [ "//chromeos/assistant:buildflags" ] - if (enable_libassistant_sandbox) { + if (enable_cros_libassistant) { sources += [ "linux/bpf_libassistant_policy_linux.cc", "linux/bpf_libassistant_policy_linux.h",
diff --git a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc index 5d572af..fe643a9 100644 --- a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc +++ b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc
@@ -61,9 +61,9 @@ #include "sandbox/policy/linux/bpf_tts_policy_linux.h" #include "chromeos/assistant/buildflags.h" -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "sandbox/policy/linux/bpf_libassistant_policy_linux.h" -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) using sandbox::bpf_dsl::Allow; @@ -199,10 +199,10 @@ return std::make_unique<ImeProcessPolicy>(); case SandboxType::kTts: return std::make_unique<TtsProcessPolicy>(); -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) case SandboxType::kLibassistant: return std::make_unique<LibassistantProcessPolicy>(); -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kZygoteIntermediateSandbox: case SandboxType::kNoSandbox: @@ -247,9 +247,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kIme: case SandboxType::kTts: -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) case SandboxType::kLibassistant: -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kAudio: case SandboxType::kService:
diff --git a/sandbox/policy/sandbox_type.cc b/sandbox/policy/sandbox_type.cc index 21b207ca3..c03b072 100644 --- a/sandbox/policy/sandbox_type.cc +++ b/sandbox/policy/sandbox_type.cc
@@ -59,10 +59,10 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kIme: case SandboxType::kTts: -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) case SandboxType::kLibassistant: -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) -#endif +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) +#endif // // BUILDFLAG(IS_CHROMEOS_ASH) #if !defined(OS_MAC) case SandboxType::kService: #endif @@ -130,9 +130,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) case SandboxType::kIme: case SandboxType::kTts: -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) case SandboxType::kLibassistant: -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if defined(OS_MAC) case SandboxType::kMirroring: @@ -271,10 +271,10 @@ return switches::kImeSandbox; case SandboxType::kTts: return switches::kTtsSandbox; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) case SandboxType::kLibassistant: return switches::kLibassistantSandbox; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) // The following are not utility processes so should not occur. case SandboxType::kRenderer: @@ -342,10 +342,10 @@ return SandboxType::kIme; if (sandbox_string == switches::kTtsSandbox) return SandboxType::kTts; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) if (sandbox_string == switches::kLibassistantSandbox) return SandboxType::kLibassistant; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) return SandboxType::kUtility; }
diff --git a/sandbox/policy/sandbox_type.h b/sandbox/policy/sandbox_type.h index 88903f7..9e6da74 100644 --- a/sandbox/policy/sandbox_type.h +++ b/sandbox/policy/sandbox_type.h
@@ -98,9 +98,9 @@ // Text-to-speech. kTts, -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) kLibassistant, -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/sandbox/policy/switches.cc b/sandbox/policy/switches.cc index c0438f6..9ab64bc 100644 --- a/sandbox/policy/switches.cc +++ b/sandbox/policy/switches.cc
@@ -53,9 +53,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) const char kImeSandbox[] = "ime"; const char kTtsSandbox[] = "tts"; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) const char kLibassistantSandbox[] = "libassistant"; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) // Flags owned by the service manager sandbox.
diff --git a/sandbox/policy/switches.h b/sandbox/policy/switches.h index a0315cd..1f7dc946 100644 --- a/sandbox/policy/switches.h +++ b/sandbox/policy/switches.h
@@ -54,9 +54,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) SANDBOX_POLICY_EXPORT extern const char kImeSandbox[]; SANDBOX_POLICY_EXPORT extern const char kTtsSandbox[]; -#if BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) SANDBOX_POLICY_EXPORT extern const char kLibassistantSandbox[]; -#endif // BUILDFLAG(ENABLE_LIBASSISTANT_SANDBOX) +#endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #endif // BUILDFLAG(IS_CHROMEOS_ASH) // Flags owned by the service manager sandbox.
diff --git a/services/audio/input_controller.cc b/services/audio/input_controller.cc index 905c60b..da0e68209 100644 --- a/services/audio/input_controller.cc +++ b/services/audio/input_controller.cc
@@ -32,6 +32,8 @@ namespace audio { namespace { +using OpenOutcome = media::AudioInputStream::OpenOutcome; + const int kMaxInputChannels = 3; constexpr base::TimeDelta kCheckMutedStateInterval = base::TimeDelta::FromSeconds(1); @@ -395,6 +397,17 @@ DCHECK_CALLED_ON_VALID_THREAD(owning_thread_); } +InputController::ErrorCode MapOpenOutcomeToErrorCode(OpenOutcome outcome) { + switch (outcome) { + case OpenOutcome::kFailedSystemPermissions: + return InputController::STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR; + case OpenOutcome::kFailedInUse: + return InputController::STREAM_OPEN_DEVICE_IN_USE_ERROR; + default: + return InputController::STREAM_OPEN_ERROR; + } +} + void InputController::DoCreate(media::AudioManager* audio_manager, const media::AudioParameters& params, const std::string& device_id, @@ -425,14 +438,10 @@ } auto open_outcome = stream->Open(); - if (open_outcome != media::AudioInputStream::OpenOutcome::kSuccess) { + if (open_outcome != OpenOutcome::kSuccess) { stream->Close(); LogCaptureStartupResult(CAPTURE_STARTUP_OPEN_STREAM_FAILED); - handler_->OnError( - open_outcome == - media::AudioInputStream::OpenOutcome::kFailedSystemPermissions - ? STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR - : STREAM_OPEN_ERROR); + handler_->OnError(MapOpenOutcomeToErrorCode(open_outcome)); return; }
diff --git a/services/audio/input_controller.h b/services/audio/input_controller.h index a0f3b8d..81a20fb7 100644 --- a/services/audio/input_controller.h +++ b/services/audio/input_controller.h
@@ -63,6 +63,9 @@ // Open failed due to lack of system permissions. STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR, // = 4 + + // Open failed due to device in use by another app. + STREAM_OPEN_DEVICE_IN_USE_ERROR, // = 5 }; #if defined(AUDIO_POWER_MONITORING)
diff --git a/services/audio/input_stream.cc b/services/audio/input_stream.cc index 59440d5..032f5eac 100644 --- a/services/audio/input_stream.cc +++ b/services/audio/input_stream.cc
@@ -27,6 +27,10 @@ namespace { const int kMaxInputChannels = 3; +using InputStreamErrorCode = media::mojom::InputStreamErrorCode; +using DisconnectReason = + media::mojom::AudioInputStreamObserver::DisconnectReason; + const char* ErrorCodeToString(InputController::ErrorCode error) { switch (error) { case (InputController::STREAM_CREATE_ERROR): @@ -37,6 +41,8 @@ return "STREAM_ERROR"; case (InputController::STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR): return "STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR"; + case (InputController::STREAM_OPEN_DEVICE_IN_USE_ERROR): + return "STREAM_OPEN_DEVICE_IN_USE_ERROR"; default: NOTREACHED(); } @@ -100,10 +106,9 @@ SendLogMessage("%s", GetCtorLogString(device_id, params, enable_agc).c_str()); // |this| owns these objects, so unretained is safe. - base::RepeatingClosure error_handler = base::BindRepeating( - &InputStream::OnStreamError, base::Unretained(this), - absl::optional< - media::mojom::AudioInputStreamObserver::DisconnectReason>()); + base::RepeatingClosure error_handler = + base::BindRepeating(&InputStream::OnStreamError, base::Unretained(this), + absl::optional<DisconnectReason>()); receiver_.set_disconnect_handler(error_handler); client_.set_disconnect_handler(error_handler); @@ -139,8 +144,7 @@ if (observer_) { observer_.ResetWithReason( - static_cast<uint32_t>(media::mojom::AudioInputStreamObserver:: - DisconnectReason::kTerminatedByClient), + static_cast<uint32_t>(DisconnectReason::kTerminatedByClient), std::string()); } @@ -223,24 +227,41 @@ initially_muted, id_); } +DisconnectReason InputErrorToDisconnectReason(InputController::ErrorCode code) { + switch (code) { + case InputController::STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR: + return DisconnectReason::kSystemPermissions; + case InputController::STREAM_OPEN_DEVICE_IN_USE_ERROR: + return DisconnectReason::kDeviceInUse; + default: + break; + } + return DisconnectReason::kPlatformError; +} + +InputStreamErrorCode InputControllerErrorToStreamError( + InputController::ErrorCode code) { + switch (code) { + case InputController::STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR: + return InputStreamErrorCode::kSystemPermissions; + case InputController::STREAM_OPEN_DEVICE_IN_USE_ERROR: + return InputStreamErrorCode::kDeviceInUse; + default: + break; + } + return InputStreamErrorCode::kUnknown; +} + void InputStream::OnError(InputController::ErrorCode error_code) { DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); TRACE_EVENT_NESTABLE_ASYNC_INSTANT0("audio", "Error", this); - bool is_permissions_error = - error_code == InputController::STREAM_OPEN_SYSTEM_PERMISSIONS_ERROR; - - client_->OnError(is_permissions_error - ? media::mojom::InputStreamErrorCode::kSystemPermissions - : media::mojom::InputStreamErrorCode::kUnknown); + client_->OnError(InputControllerErrorToStreamError(error_code)); if (log_) log_->OnError(); SendLogMessage("%s({error_code=%s})", __func__, ErrorCodeToString(error_code)); - OnStreamError(is_permissions_error ? media::mojom::AudioInputStreamObserver:: - DisconnectReason::kSystemPermissions - : media::mojom::AudioInputStreamObserver:: - DisconnectReason::kPlatformError); + OnStreamError(InputErrorToDisconnectReason(error_code)); } void InputStream::OnLog(base::StringPiece message) { @@ -255,13 +276,11 @@ } void InputStream::OnStreamPlatformError() { - OnStreamError( - media::mojom::AudioInputStreamObserver::DisconnectReason::kPlatformError); + OnStreamError(DisconnectReason::kPlatformError); } void InputStream::OnStreamError( - absl::optional<media::mojom::AudioInputStreamObserver::DisconnectReason> - reason_to_report) { + absl::optional<DisconnectReason> reason_to_report) { DCHECK_CALLED_ON_VALID_SEQUENCE(owning_sequence_); TRACE_EVENT_NESTABLE_ASYNC_INSTANT0("audio", "OnStreamError", this);
diff --git a/services/device/public/mojom/wake_lock.mojom b/services/device/public/mojom/wake_lock.mojom index 18e1377..57b8eb1 100644 --- a/services/device/public/mojom/wake_lock.mojom +++ b/services/device/public/mojom/wake_lock.mojom
@@ -4,6 +4,7 @@ module device.mojom; +[Stable, Extensible] enum WakeLockType { // Prevent the application from being suspended. On some platforms, apps may // be suspended when they are not visible to the user. This type of block @@ -24,6 +25,7 @@ kPreventDisplaySleepAllowDimming = 2, }; +[Stable, Extensible] enum WakeLockReason { // Audio is being played. kAudioPlayback = 0,
diff --git a/services/device/wake_lock/power_save_blocker/BUILD.gn b/services/device/wake_lock/power_save_blocker/BUILD.gn index 8ca1d4d..5bc4ea6 100644 --- a/services/device/wake_lock/power_save_blocker/BUILD.gn +++ b/services/device/wake_lock/power_save_blocker/BUILD.gn
@@ -12,6 +12,9 @@ source_set("power_save_blocker") { visibility = [ + # Crosapi power API needs to directly use the Ash PowerBlocker . + "//chrome/browser/ash/crosapi", + # //remoting runs in a separate process which is outside of the context of # the ServiceManager-based world. Instead of embedding a Service Manager # environment and Device Service in it, we allow the power save blocker to @@ -36,13 +39,21 @@ deps += [ ":jni_headers" ] public_deps += [ "//ui/android" ] } else if (is_chromeos_ash) { - sources += [ "power_save_blocker_chromeos.cc" ] + sources += [ "power_save_blocker_ash.cc" ] deps += [ "//chromeos/dbus/power", "//chromeos/dbus/power:power_manager_proto", ] } else if ((is_linux || is_chromeos) && use_dbus) { - sources += [ "power_save_blocker_linux.cc" ] + if (is_chromeos_lacros) { + sources += [ "power_save_blocker_lacros.cc" ] + deps += [ + "//chromeos/crosapi/mojom", + "//chromeos/lacros", + ] + } else { + sources += [ "power_save_blocker_linux.cc" ] + } deps += [ "//dbus", "//ui/gfx",
diff --git a/services/device/wake_lock/power_save_blocker/power_save_blocker_chromeos.cc b/services/device/wake_lock/power_save_blocker/power_save_blocker_ash.cc similarity index 97% rename from services/device/wake_lock/power_save_blocker/power_save_blocker_chromeos.cc rename to services/device/wake_lock/power_save_blocker/power_save_blocker_ash.cc index 6be8cab..f5c867b 100644 --- a/services/device/wake_lock/power_save_blocker/power_save_blocker_chromeos.cc +++ b/services/device/wake_lock/power_save_blocker/power_save_blocker_ash.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/check.h" #include "base/location.h" -#include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/notreached.h" #include "base/sequenced_task_runner.h" @@ -49,6 +48,9 @@ block_id_(0), ui_task_runner_(ui_task_runner) {} + Delegate(const Delegate&) = delete; + const Delegate& operator=(const Delegate&) = delete; + void ApplyBlock() { DCHECK(ui_task_runner_->RunsTasksInCurrentSequence()); if (!chromeos::PowerPolicyController::IsInitialized()) @@ -93,8 +95,6 @@ int block_id_; scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; - - DISALLOW_COPY_AND_ASSIGN(Delegate); }; PowerSaveBlocker::PowerSaveBlocker(
diff --git a/services/device/wake_lock/power_save_blocker/power_save_blocker_lacros.cc b/services/device/wake_lock/power_save_blocker/power_save_blocker_lacros.cc new file mode 100644 index 0000000..99cf56c --- /dev/null +++ b/services/device/wake_lock/power_save_blocker/power_save_blocker_lacros.cc
@@ -0,0 +1,89 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/device/wake_lock/power_save_blocker/power_save_blocker.h" + +#include <string> + +#include "base/memory/ref_counted.h" +#include "chromeos/crosapi/mojom/power.mojom.h" +#include "chromeos/lacros/lacros_service.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace device { + +/******** PowerSaveBlocker::Delegate ********/ + +// Lacros-chrome PowerSaveBlocker uses ash-chrome ProwerSaveBlocker via crosapi. +// RAII style is maintained by keeping a crosapi::mojom::PowerWakeLock Mojo +// connection, whose disconnection triggers resource release in ash-chrome. + +class PowerSaveBlocker::Delegate + : public base::RefCountedThreadSafe<PowerSaveBlocker::Delegate> { + public: + Delegate(mojom::WakeLockType type, + mojom::WakeLockReason reason, + const std::string& description, + scoped_refptr<base::SequencedTaskRunner> ui_task_runner) + : type_(type), + reason_(reason), + description_(description), + ui_task_runner_(ui_task_runner) {} + Delegate(const Delegate&) = delete; + Delegate& operator=(const Delegate&) = delete; + + void ApplyBlock() { + DCHECK(ui_task_runner_->RunsTasksInCurrentSequence()); + auto* lacros_service = chromeos::LacrosService::Get(); + if (lacros_service->IsAvailable<crosapi::mojom::Power>()) { + lacros_service->GetRemote<crosapi::mojom::Power>()->AddPowerSaveBlocker( + receiver_.BindNewPipeAndPassRemote(), type_, reason_, description_); + } + } + + void RemoveBlock() { + DCHECK(ui_task_runner_->RunsTasksInCurrentSequence()); + // Disconnect to make ash-chrome release its PowerSaveBlocker. + receiver_.reset(); + } + + private: + friend class base::RefCountedThreadSafe<Delegate>; + virtual ~Delegate() {} + + // Connection to ash-chrome via crosapi. Disconnection from RemoveBlock() or + // Lacros termination triggers resource release in ash-chrome. + crosapi::mojom::PowerWakeLock lock_; + mojo::Receiver<crosapi::mojom::PowerWakeLock> receiver_{&lock_}; + + mojom::WakeLockType type_; + mojom::WakeLockReason reason_; + std::string description_; + scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; +}; + +/******** PowerSaveBlocker ********/ + +PowerSaveBlocker::PowerSaveBlocker( + mojom::WakeLockType type, + mojom::WakeLockReason reason, + const std::string& description, + scoped_refptr<base::SequencedTaskRunner> ui_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> blocking_task_runner) + : delegate_(base::MakeRefCounted<Delegate>(type, + reason, + description, + ui_task_runner)), + ui_task_runner_(ui_task_runner), + blocking_task_runner_(blocking_task_runner) { + ui_task_runner_->PostTask(FROM_HERE, + base::BindOnce(&Delegate::ApplyBlock, delegate_)); +} + +PowerSaveBlocker::~PowerSaveBlocker() { + ui_task_runner_->PostTask(FROM_HERE, + base::BindOnce(&Delegate::RemoveBlock, delegate_)); +} + +} // namespace device
diff --git a/services/network/public/cpp/self_deleting_url_loader_factory.h b/services/network/public/cpp/self_deleting_url_loader_factory.h index 8e84590e..34f9b48 100644 --- a/services/network/public/cpp/self_deleting_url_loader_factory.h +++ b/services/network/public/cpp/self_deleting_url_loader_factory.h
@@ -29,6 +29,10 @@ ~SelfDeletingURLLoaderFactory() override; + // The override below is marked as |final| to make sure derived classes do not + // accidentally side-step lifetime management. + void Clone(mojo::PendingReceiver<mojom::URLLoaderFactory> loader) final; + // Sometimes a derived class can no longer function, even when the set of // |receivers_| is still non-empty. This should be rare (typically the // lifetime of users of mojo::Remote<mojom::URLLoaderFactory> should @@ -44,10 +48,6 @@ THREAD_CHECKER(thread_checker_); private: - // The override below is marked as |final| to make sure derived classes do not - // accidentally side-step lifetime management. - void Clone(mojo::PendingReceiver<mojom::URLLoaderFactory> loader) final; - void OnDisconnect(); mojo::ReceiverSet<mojom::URLLoaderFactory> receivers_;
diff --git a/services/network/web_transport_unittest.cc b/services/network/web_transport_unittest.cc index 4b9c804..1c02da1 100644 --- a/services/network/web_transport_unittest.cc +++ b/services/network/web_transport_unittest.cc
@@ -125,6 +125,7 @@ void OnHandshakeFailed( const absl::optional<net::WebTransportError>& error) override { has_seen_handshake_failure_ = true; + handshake_error_ = error; receiver_.reset(); std::move(callback_).Run(); } @@ -149,6 +150,9 @@ bool has_seen_mojo_connection_error() const { return has_seen_mojo_connection_error_; } + absl::optional<net::WebTransportError> handshake_error() const { + return handshake_error_; + } private: mojo::Receiver<mojom::WebTransportHandshakeClient> receiver_; @@ -159,6 +163,7 @@ bool has_seen_connection_establishment_ = false; bool has_seen_handshake_failure_ = false; bool has_seen_mojo_connection_error_ = false; + absl::optional<net::WebTransportError> handshake_error_; }; class TestClient final : public mojom::WebTransportClient { @@ -430,6 +435,33 @@ EXPECT_EQ(0u, network_context().NumOpenWebTransports()); } +TEST_P(WebTransportTest, ConnectToBannedPort) { + if (GetParam() == "quic-transport") { + return; + } + + base::RunLoop run_loop_for_handshake; + mojo::PendingRemote<mojom::WebTransportHandshakeClient> handshake_client; + TestHandshakeClient test_handshake_client( + handshake_client.InitWithNewPipeAndPassReceiver(), + run_loop_for_handshake.QuitClosure()); + + CreateWebTransport(GURL("https://test.example.com:5060/echo"), origin(), + std::move(handshake_client)); + + run_loop_for_handshake.Run(); + + EXPECT_FALSE(test_handshake_client.has_seen_connection_establishment()); + EXPECT_TRUE(test_handshake_client.has_seen_handshake_failure()); + EXPECT_FALSE(test_handshake_client.has_seen_mojo_connection_error()); + + EXPECT_EQ(0u, network_context().NumOpenWebTransports()); + + ASSERT_TRUE(test_handshake_client.handshake_error().has_value()); + EXPECT_EQ(test_handshake_client.handshake_error()->net_error, + net::ERR_UNSAFE_PORT); +} + TEST_P(WebTransportTest, SendDatagram) { base::RunLoop run_loop_for_handshake; mojo::PendingRemote<mojom::WebTransportHandshakeClient> handshake_client;
diff --git a/sql/recover_module/module_unittest.cc b/sql/recover_module/module_unittest.cc index 2e0db47..8ab83ad 100644 --- a/sql/recover_module/module_unittest.cc +++ b/sql/recover_module/module_unittest.cc
@@ -897,91 +897,35 @@ TEST_F(RecoverModuleTest, VarintEncodings) { const std::vector<int64_t> values = { // 1-byte varints. - 0x00, - 0x01, - 0x02, - 0x7e, - 0x7f, + 0x00, 0x01, 0x02, 0x7e, 0x7f, // 2-byte varints - 0x80, - 0x81, - 0xff, - 0x0100, - 0x0101, - 0x1234, - 0x1ffe, - 0x1fff, - 0x3ffe, - 0x3fff, + 0x80, 0x81, 0xff, 0x0100, 0x0101, 0x1234, 0x1ffe, 0x1fff, 0x3ffe, 0x3fff, // 3-byte varints - 0x4000, - 0x4001, - 0x0ffffe, - 0x0fffff, - 0x123456, - 0x1fedcb, - 0x1ffffe, + 0x4000, 0x4001, 0x0ffffe, 0x0fffff, 0x123456, 0x1fedcb, 0x1ffffe, 0x1fffff, // 4-byte varints - 0x200000, - 0x200001, - 0x123456, - 0xfedcba, - 0xfffffe, - 0xffffff, - 0x01234567, - 0x0fedcba9, - 0x0ffffffe, - 0x0fffffff, + 0x200000, 0x200001, 0x123456, 0xfedcba, 0xfffffe, 0xffffff, 0x01234567, + 0x0fedcba9, 0x0ffffffe, 0x0fffffff, // 5-byte varints - 0x10000000, - 0x10000001, - 0x12345678, - 0xfedcba98, - 0x0123456789, - 0x07fffffffe, - 0x07ffffffff, + 0x10000000, 0x10000001, 0x12345678, 0xfedcba98, 0x01'23456789, + 0x07'fffffffe, 0x07'ffffffff, // 6-byte varints - 0x0800000000, - 0x0800000001, - 0x123456789a, - 0xfedcba9876, - 0x0123456789ab, - 0x03fffffffffe, - 0x03ffffffffff, + 0x08'00000000, 0x08'00000001, 0x12'3456789a, 0xfe'dcba9876, + 0x0123'456789ab, 0x03ff'fffffffe, 0x03ff'ffffffff, // 7-byte varints - 0x040000000000, - 0x40000000001, - 0xfedcba987654, - 0x0123456789abcd, - 0x01fffffffffffe, - 0x01ffffffffffff, + 0x0400'00000000, 0x0400'00000001, 0xfedc'ba987654, 0x012345'6789abcd, + 0x01ffff'fffffffe, 0x01ffff'ffffffff, // 8-byte varints - 0x02000000000000, - 0x2000000000001, - 0x0fedcba9876543, - 0x123456789abcde, - 0xfedcba98765432, - 0xfffffffffffffe, - 0xffffffffffffff, + 0x020000'00000000, 0x020000'00000001, 0x0fedcb'a9876543, + 0x123456'789abcde, 0xfedcba'98765432, 0xffffff'fffffffe, + 0xffffff'ffffffff, // 9-byte positive varints - 0x0100000000000000, - 0x0100000000000001, - 0x123456789abcdef0, - 0xfedcba9876543210, - 0x7ffffffffffffffe, - 0x7fffffffffffffff, + 0x01000000'00000000, 0x01000000'00000001, 0x12345678'9abcdef0, + 0x7fedcba9'87654321, 0x7fffffff'fffffffe, 0x7fffffff'ffffffff, // 9-byte negative varints - -0x01, - -0x02, - -0x7e, - -0x7f, - -0x80, - -0x81, - -0x123456789abcdef0, - -0xfedcba9876543210, - -0x7fffffffffffffff, - -0x8000000000000000, + -0x01, -0x02, -0x7e, -0x7f, -0x80, -0x81, -0x12345678'9abcdef0, + -0x7fedcba9'87654321, -0x7fffffff'ffffffff, + -0x7fffffff'ffffffff - 1, // -0x80000000'00000000 is not a valid literal }; ASSERT_TRUE(db_.Execute("CREATE TABLE varints(value INTEGER PRIMARY KEY)"));
diff --git a/testing/buildbot/PRESUBMIT.py b/testing/buildbot/PRESUBMIT.py index 485e5c0..0aa5f9c 100644 --- a/testing/buildbot/PRESUBMIT.py +++ b/testing/buildbot/PRESUBMIT.py
@@ -8,6 +8,8 @@ for more details on the presubmit API built into depot_tools. """ +USE_PYTHON3 = True + def CommonChecks(input_api, output_api): commands = [
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index a647a5d..f3c7a2e6 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -117,6 +117,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -179,6 +186,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -243,6 +257,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -305,6 +326,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -362,6 +390,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "angle_unittests", @@ -416,6 +451,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -478,6 +520,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -540,6 +589,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -602,6 +658,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -664,6 +727,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -728,6 +798,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -791,6 +868,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -853,6 +937,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -915,6 +1006,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -978,6 +1076,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1040,6 +1145,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1103,6 +1215,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1165,6 +1284,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1235,6 +1361,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1298,6 +1431,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1362,6 +1502,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1425,6 +1572,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1489,6 +1643,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1552,6 +1713,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1616,6 +1784,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1678,6 +1853,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1740,6 +1922,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1802,6 +1991,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1864,6 +2060,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1926,6 +2129,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -1988,6 +2198,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2050,6 +2267,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2115,6 +2339,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2177,6 +2408,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2239,6 +2477,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2301,6 +2546,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2363,6 +2615,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2425,6 +2684,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2487,6 +2753,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2549,6 +2822,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2611,6 +2891,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2673,6 +2960,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2735,6 +3029,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2798,6 +3099,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2860,6 +3168,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2922,6 +3237,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -2984,6 +3306,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3046,6 +3375,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3108,6 +3444,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3170,6 +3513,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3233,6 +3583,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3296,6 +3653,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3358,6 +3722,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3420,6 +3791,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3482,6 +3860,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3544,6 +3929,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3606,6 +3998,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3668,6 +4067,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3730,6 +4136,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3792,6 +4205,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3854,6 +4274,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3917,6 +4344,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -3980,6 +4414,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4043,6 +4484,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4106,6 +4554,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4168,6 +4623,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4231,6 +4693,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4294,6 +4763,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4356,6 +4832,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android30" + } + ] + }, "output_links": [ { "link": [ @@ -4502,6 +4985,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 18 }, @@ -4560,6 +5050,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -4638,6 +5135,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -4689,7 +5193,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4717,6 +5221,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -4768,7 +5279,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4796,6 +5307,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -4875,6 +5393,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -4926,7 +5451,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -4954,6 +5479,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -5005,7 +5537,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -5033,6 +5565,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android29" + } + ] + }, "output_links": [ { "link": [ @@ -5100,6 +5639,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 18 }, @@ -5158,6 +5704,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 }, @@ -5214,6 +5767,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 18 },
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index ebe68fa..1fb2ed3 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -24721,7 +24721,7 @@ }, "android-lollipop-arm-rel": { "additional_compile_targets": [ - "android_lint_test", + "android_nocompile_tests", "cronet_test_instrumentation_apk", "errorprone_plugin_tests", "monochrome_static_initializers" @@ -35994,6 +35994,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36063,6 +36070,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36125,6 +36139,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36187,6 +36208,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36249,6 +36277,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36318,6 +36353,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36381,6 +36423,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36448,6 +36497,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36510,6 +36566,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36573,6 +36636,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36635,6 +36705,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36692,6 +36769,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "angle_unittests", @@ -36745,6 +36829,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36807,6 +36898,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36869,6 +36967,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36931,6 +37036,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -36993,6 +37105,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37055,6 +37174,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37117,6 +37243,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37179,6 +37312,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37242,6 +37382,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37304,6 +37451,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37367,6 +37521,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37429,6 +37590,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37491,6 +37659,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37555,6 +37730,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37619,6 +37801,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37682,6 +37871,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37745,6 +37941,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37807,6 +38010,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37869,6 +38079,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37931,6 +38148,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -37993,6 +38217,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38055,6 +38286,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38117,6 +38355,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38179,6 +38424,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38244,6 +38496,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38306,6 +38565,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38368,6 +38634,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38430,6 +38703,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38492,6 +38772,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38554,6 +38841,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38616,6 +38910,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38678,6 +38979,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38740,6 +39048,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38802,6 +39117,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38864,6 +39186,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38927,6 +39256,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -38989,6 +39325,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39051,6 +39394,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39113,6 +39463,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39176,6 +39533,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39240,6 +39604,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39302,6 +39673,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39364,6 +39742,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39426,6 +39811,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39488,6 +39880,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39550,6 +39949,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39612,6 +40018,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39674,6 +40087,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39736,6 +40156,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39798,6 +40225,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39861,6 +40295,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39923,6 +40364,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -39985,6 +40433,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -40047,6 +40502,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -40109,6 +40571,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -40172,6 +40641,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -40234,6 +40710,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -40296,6 +40779,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_perftests/" @@ -40342,6 +40832,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://chrome/android/monochrome:monochrome_public_apk_checker/" @@ -49042,6 +49539,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49105,6 +49609,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49169,6 +49680,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49231,6 +49749,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49288,6 +49813,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "angle_unittests", @@ -49341,6 +49873,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49403,6 +49942,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49465,6 +50011,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49527,6 +50080,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49589,6 +50149,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49652,6 +50219,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49715,6 +50289,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49777,6 +50358,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49839,6 +50427,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49902,6 +50497,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -49964,6 +50566,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50027,6 +50636,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50089,6 +50705,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50151,6 +50774,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50213,6 +50843,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50283,6 +50920,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_playstore_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50346,6 +50990,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50408,6 +51059,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50472,6 +51130,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50536,6 +51201,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50599,6 +51271,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50662,6 +51341,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50724,6 +51410,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50786,6 +51479,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50848,6 +51548,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50910,6 +51617,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -50972,6 +51686,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51034,6 +51755,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51096,6 +51824,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51161,6 +51896,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51223,6 +51965,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51285,6 +52034,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51347,6 +52103,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51409,6 +52172,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51471,6 +52241,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51533,6 +52310,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51595,6 +52379,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51657,6 +52448,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51719,6 +52517,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51781,6 +52586,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51844,6 +52656,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51906,6 +52725,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -51968,6 +52794,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52030,6 +52863,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52092,6 +52932,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52154,6 +53001,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52216,6 +53070,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52279,6 +53140,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52343,6 +53211,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52405,6 +53280,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52467,6 +53349,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52529,6 +53418,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52591,6 +53487,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52653,6 +53556,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52715,6 +53625,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52777,6 +53694,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52839,6 +53763,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52901,6 +53832,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -52963,6 +53901,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53026,6 +53971,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53089,6 +54041,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53151,6 +54110,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53213,6 +54179,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53275,6 +54248,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53337,6 +54317,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53399,6 +54386,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53466,6 +54460,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53530,6 +54531,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53593,6 +54601,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53655,6 +54670,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53717,6 +54739,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -53800,6 +54829,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -53852,7 +54888,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -53880,6 +54916,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -53932,7 +54975,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -53960,6 +55003,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -54040,6 +55090,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -54092,7 +55149,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54120,6 +55177,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -54172,7 +55236,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54200,6 +55264,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android23" + } + ] + }, "output_links": [ { "link": [ @@ -54268,6 +55339,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54346,6 +55424,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54397,7 +55482,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54425,6 +55510,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54476,7 +55568,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54504,6 +55596,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54583,6 +55682,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54634,7 +55740,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54662,6 +55768,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54713,7 +55826,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54741,6 +55854,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android27" + } + ] + }, "output_links": [ { "link": [ @@ -54809,6 +55929,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -54887,6 +56014,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -54938,7 +56072,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -54966,6 +56100,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -55017,7 +56158,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -55045,6 +56186,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -55124,6 +56272,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -55175,7 +56330,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M91", - "revision": "version:91.0.4472.106" + "revision": "version:91.0.4472.107" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -55203,6 +56358,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [ @@ -55254,7 +56416,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M92", - "revision": "version:92.0.4515.52" + "revision": "version:92.0.4515.54" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -55282,6 +56444,13 @@ "path": ".emulator_sdk" } ], + "optional_dimensions": { + "60": [ + { + "caches": "avd_generic_android28" + } + ] + }, "output_links": [ { "link": [
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 4f6cb436..aec1073 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -1261,6 +1261,32 @@ }, { "args": [ + "--board=eve", + "--flash" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "cc_unittests_eve", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_type": "eve", + "os": "ChromeOS" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cc_unittests", + "test_id_prefix": "ninja://cc:cc_unittests/", + "trigger_script": { + "script": "//testing/trigger_scripts/chromeos_device_trigger.py" + } + }, + { + "args": [ "--board=amd64-generic", "--use-vm" ], @@ -1310,6 +1336,32 @@ }, "test": "ozone_unittests", "test_id_prefix": "ninja://ui/ozone:ozone_unittests/" + }, + { + "args": [ + "--board=eve", + "--flash" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "ozone_unittests_eve", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_type": "eve", + "os": "ChromeOS" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ozone_unittests", + "test_id_prefix": "ninja://ui/ozone:ozone_unittests/", + "trigger_script": { + "script": "//testing/trigger_scripts/chromeos_device_trigger.py" + } } ] },
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 90d5bf5..8e0fca4d 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -43503,7 +43503,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43553,7 +43553,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43603,7 +43603,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43653,7 +43653,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43703,7 +43703,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43753,7 +43753,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43803,7 +43803,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43853,7 +43853,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43903,7 +43903,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -43953,7 +43953,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44003,7 +44003,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44053,7 +44053,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44103,7 +44103,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44153,7 +44153,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44203,7 +44203,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44253,7 +44253,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44303,7 +44303,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44353,7 +44353,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "named_caches": [ @@ -44424,7 +44424,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44469,7 +44469,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44514,7 +44514,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44559,7 +44559,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44604,7 +44604,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44649,7 +44649,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44694,7 +44694,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44739,7 +44739,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44784,7 +44784,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44829,7 +44829,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44874,7 +44874,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44919,7 +44919,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -44964,7 +44964,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -45009,7 +45009,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -45054,7 +45054,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -45099,7 +45099,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -45144,7 +45144,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600, @@ -45189,7 +45189,7 @@ { "cpu": "x86-64", "device": "iPhone8,1", - "os": "Mac-11|Mac-10.16" + "os": "Mac-10.15" } ], "expiration": 21600,
diff --git a/testing/buildbot/chromium.perf.calibration.json b/testing/buildbot/chromium.perf.calibration.json index fe11e0ac..17434cf 100644 --- a/testing/buildbot/chromium.perf.calibration.json +++ b/testing/buildbot/chromium.perf.calibration.json
@@ -10,13 +10,13 @@ "--upload-results", "--test-shard-map-filename=android-pixel2-perf-calibration_map.json" ], - "isolate_name": "performance_test_suite_android_clank_monochrome_64_32_bundle", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_monochrome_64_32_bundle", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_monochrome_64_32_bundle" + "performance_test_suite" ], "resultdb": { "enable": true
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index e95a3dd..180b781 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -24,13 +24,13 @@ "--output-format=histograms", "--experimental-tbmv3-metrics" ], - "isolate_name": "performance_test_suite_android_clank_chrome", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_chrome", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_chrome" + "performance_test_suite" ], "resultdb": { "enable": true @@ -73,13 +73,13 @@ "--upload-results", "--test-shard-map-filename=android-pixel2-perf-aab-fyi_map.json" ], - "isolate_name": "performance_test_suite_android_clank_monochrome_bundle", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_monochrome_bundle", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_monochrome_bundle" + "performance_test_suite" ], "resultdb": { "enable": true @@ -126,13 +126,13 @@ "--output-format=histograms", "--experimental-tbmv3-metrics" ], - "isolate_name": "performance_test_suite_android_clank_chrome", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_chrome", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_chrome" + "performance_test_suite" ], "resultdb": { "enable": true
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 43d2b7d..1576e97b 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -11,13 +11,13 @@ "--test-shard-map-filename=android_nexus5_perf_map.json", "--assert-gpu-compositing" ], - "isolate_name": "performance_test_suite_android_chrome", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_chrome", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_chrome" + "performance_test_suite" ], "resultdb": { "enable": true @@ -407,7 +407,7 @@ "--upload-results", "--test-shard-map-filename=android-go-perf_map.json" ], - "isolate_name": "performance_test_suite_android_clank_chrome", + "isolate_name": "performance_test_suite", "merge": { "args": [ "--lightweight", @@ -417,7 +417,7 @@ }, "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_chrome" + "performance_test_suite" ], "resultdb": { "enable": true @@ -517,7 +517,7 @@ "--upload-results", "--test-shard-map-filename=android-pixel2-perf_map.json" ], - "isolate_name": "performance_test_suite_android_clank_monochrome_64_32_bundle", + "isolate_name": "performance_test_suite", "merge": { "args": [ "--lightweight", @@ -525,9 +525,9 @@ ], "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_monochrome_64_32_bundle", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_monochrome_64_32_bundle" + "performance_test_suite" ], "resultdb": { "enable": true @@ -689,13 +689,13 @@ "--upload-results", "--test-shard-map-filename=android-pixel4-perf_map.json" ], - "isolate_name": "performance_test_suite_android_clank_trichrome_bundle", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_trichrome_bundle", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_trichrome_bundle" + "performance_test_suite" ], "resultdb": { "enable": true @@ -837,13 +837,13 @@ "--test-shard-map-filename=android-pixel4a_power-perf_map.json", "--experimental-tbmv3-metrics" ], - "isolate_name": "performance_test_suite_android_clank_chrome", + "isolate_name": "performance_test_suite", "merge": { "script": "//tools/perf/process_perf_results.py" }, - "name": "performance_test_suite_android_clank_chrome", + "name": "performance_test_suite", "override_compile_targets": [ - "performance_test_suite_android_clank_chrome" + "performance_test_suite" ], "resultdb": { "enable": true
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 4ad3e70..28cf9a2 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -92,8 +92,8 @@ "label": "//chrome/test:android_browsertests", "type": "windowed_test_launcher", }, - "android_lint_test": { - "label": "//build/android/test:android_lint_test", + "android_nocompile_tests": { + "label": "//build/android/test:android_nocompile_tests", "type": "additional_compile_target", }, "android_sync_integration_tests": { @@ -1437,26 +1437,6 @@ "label": "//chrome/test:performance_test_suite", "type": "generated_script", }, - "performance_test_suite_android_chrome": { - "label": "//chrome/test:performance_test_suite_android_chrome", - "type": "generated_script", - }, - "performance_test_suite_android_clank_chrome": { - "label": "//chrome/test:performance_test_suite_android_clank_chrome", - "type": "generated_script", - }, - "performance_test_suite_android_clank_monochrome_64_32_bundle": { - "label": "//chrome/test:performance_test_suite_android_clank_monochrome_64_32_bundle", - "type": "generated_script", - }, - "performance_test_suite_android_clank_monochrome_bundle": { - "label": "//chrome/test:performance_test_suite_android_clank_monochrome_bundle", - "type": "generated_script", - }, - "performance_test_suite_android_clank_trichrome_bundle": { - "label": "//chrome/test:performance_test_suite_android_clank_trichrome_bundle", - "type": "generated_script", - }, "performance_test_suite_eve": { "label": "//chrome/test:performance_test_suite_eve", "type": "generated_script",
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index be5fedac..09533ec 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -133,6 +133,14 @@ ], }, 'swarming': { + # soft affinity so that bots with caches will be picked first + 'optional_dimensions': { + '60': [ + { + 'caches': 'avd_generic_android29', + } + ], + }, 'named_caches': [ { 'name': 'avd_generic_android29', @@ -152,6 +160,14 @@ ], }, 'swarming': { + # soft affinity so that bots with caches will be picked first + 'optional_dimensions': { + '60': [ + { + 'caches': 'avd_generic_android30', + } + ], + }, 'named_caches': [ { 'name': 'avd_generic_android30', @@ -876,6 +892,14 @@ ], }, 'swarming': { + # soft affinity so that bots with caches will be picked first + 'optional_dimensions': { + '60': [ + { + 'caches': 'avd_generic_android23', + } + ], + }, 'named_caches': [ { 'name': 'avd_generic_android23', @@ -923,6 +947,14 @@ ], }, 'swarming': { + # soft affinity so that bots with caches will be picked first + 'optional_dimensions': { + '60': [ + { + 'caches': 'avd_generic_android27', + } + ], + }, 'named_caches': [ { 'name': 'avd_generic_android27', @@ -958,6 +990,14 @@ ], }, 'swarming': { + # soft affinity so that bots with caches will be picked first + 'optional_dimensions': { + '60': [ + { + 'caches': 'avd_generic_android28', + } + ], + }, 'named_caches': [ { 'name': 'avd_generic_android28',
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index e4434b0b..00b0096 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -160,6 +160,12 @@ 'lacros-amd64-generic-rel', ] }, + 'aura_unittests_eve': { + 'remove_from': [ + # TODO(crbug.com/1204231): Re-enable. + 'lacros-amd64-generic-rel', + ] + }, 'base_unittests': { 'modifications': { 'android-11-x86-fyi-rel': { @@ -919,6 +925,14 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter', ], 'swarming': { + # soft affinity so that bots with caches will be picked first + 'optional_dimensions': { + '60': [ + { + 'caches': 'avd_generic_playstore_android28', + } + ], + }, 'named_caches': [ { 'name': 'avd_generic_playstore_android28', @@ -1782,6 +1796,12 @@ 'lacros-amd64-generic-rel', ] }, + 'interactive_ui_tests_eve': { + 'remove_from': [ + # TODO(crbug.com/1204231): Re-enable. + 'lacros-amd64-generic-rel', + ] + }, 'interactive_ui_tests_wayland': { 'modifications': { # CQ tester.
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 04136961..250dd50 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -7263,6 +7263,7 @@ 'lacros_device_or_vm_gtests': { 'variants': [ 'LACROS_AMD64_GENERIC', + 'LACROS_EVE', ] }, },
diff --git a/testing/buildbot/trybot_analyze_config.json b/testing/buildbot/trybot_analyze_config.json index 75655d3..e5c6c9a7 100644 --- a/testing/buildbot/trybot_analyze_config.json +++ b/testing/buildbot/trybot_analyze_config.json
@@ -64,6 +64,7 @@ "third_party/vulkan-deps/DEPS", "third_party/web-animations-js/.*(css|html|js)", "third_party/zlib/google/test/data/.*", + "tools/android/avd/proto/creation/.*", "tools/clang/scripts/update.py", "tools/grit/.*", "tools/mb/.*",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index e71f05e..072c36a7 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -472,7 +472,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M92', - 'revision': 'version:92.0.4515.52', + 'revision': 'version:92.0.4515.54', } ], }, @@ -496,7 +496,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M91', - 'revision': 'version:91.0.4472.106', + 'revision': 'version:91.0.4472.107', } ], }, @@ -544,7 +544,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M92', - 'revision': 'version:92.0.4515.52', + 'revision': 'version:92.0.4515.54', } ], }, @@ -568,7 +568,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M91', - 'revision': 'version:91.0.4472.106', + 'revision': 'version:91.0.4472.107', } ], }, @@ -616,7 +616,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M92', - 'revision': 'version:92.0.4515.52', + 'revision': 'version:92.0.4515.54', } ], }, @@ -640,7 +640,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M91', - 'revision': 'version:91.0.4472.106', + 'revision': 'version:91.0.4472.107', } ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 87fe8695..6ac573c71 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -836,7 +836,7 @@ 'lollipop', ], 'additional_compile_targets': [ - 'android_lint_test', + 'android_nocompile_tests', 'cronet_test_instrumentation_apk', 'errorprone_plugin_tests', 'monochrome_static_initializers', @@ -1987,7 +1987,7 @@ ], 'mixins': [ 'enable_resultdb', - 'mac_11_x64', + 'mac_10.15', 'mac_toolchain', 'out_dir_arg', 'xcode_12d4e', @@ -2021,7 +2021,7 @@ 'enable_resultdb', 'ios_restart_device', 'limited_capacity_bot', - 'mac_11_x64', + 'mac_10.15', 'mac_toolchain', 'out_dir_arg', 'xcode_12d4e',
diff --git a/testing/merge_scripts/PRESUBMIT.py b/testing/merge_scripts/PRESUBMIT.py index 3ba0cf1..3c01237 100644 --- a/testing/merge_scripts/PRESUBMIT.py +++ b/testing/merge_scripts/PRESUBMIT.py
@@ -8,6 +8,8 @@ for more details about the presubmit API built into depot_tools. """ +USE_PYTHON3 = True + def CommonChecks(input_api, output_api): return input_api.canned_checks.RunUnitTestsInDirectory( input_api, output_api, '.', [ r'^.+_test\.py$'])
diff --git a/testing/scripts/common.py b/testing/scripts/common.py index c13ccce..5d73109e 100644 --- a/testing/scripts/common.py +++ b/testing/scripts/common.py
@@ -46,9 +46,9 @@ # ACL might be explicitly set or inherited. CORRECT_ACL_VARIANTS = [ 'APPLICATION PACKAGE AUTHORITY' \ - '\ALL RESTRICTED APPLICATION PACKAGES:(OI)(CI)(RX)', \ + '\\ALL RESTRICTED APPLICATION PACKAGES:(OI)(CI)(RX)', \ 'APPLICATION PACKAGE AUTHORITY' \ - '\ALL RESTRICTED APPLICATION PACKAGES:(I)(OI)(CI)(RX)' + '\\ALL RESTRICTED APPLICATION PACKAGES:(I)(OI)(CI)(RX)' ]
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 224544df..c9c7260 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1424,6 +1424,26 @@ ] } ], + "CLSScrollAnchoring": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CLSScrollAnchoring" + ] + } + ] + } + ], "CPSS": [ { "platforms": [ @@ -3423,21 +3443,6 @@ ] } ], - "FeedShare": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled_20210204", - "enable_features": [ - "FeedShare" - ] - } - ] - } - ], "FillingAcrossAffiliatedWebsites": [ { "platforms": [ @@ -3531,27 +3536,6 @@ ] } ], - "ForceSynchronousHTMLParsing": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ForceSynchronousHTMLParsing" - ] - } - ] - } - ], "FuzzyAppSearch": [ { "platforms": [ @@ -5599,8 +5583,7 @@ "mode": "always-new-tab" }, "enable_features": [ - "AdaptiveButtonInTopToolbar", - "AdaptiveButtonInTopToolbarCustomization" + "AdaptiveButtonInTopToolbar" ] }, { @@ -5609,8 +5592,7 @@ "mode": "always-share" }, "enable_features": [ - "AdaptiveButtonInTopToolbar", - "AdaptiveButtonInTopToolbarCustomization" + "AdaptiveButtonInTopToolbar" ] }, { @@ -5619,8 +5601,7 @@ "mode": "always-voice" }, "enable_features": [ - "AdaptiveButtonInTopToolbar", - "AdaptiveButtonInTopToolbarCustomization" + "AdaptiveButtonInTopToolbar" ] }, { @@ -8950,6 +8931,23 @@ ] } ], + "WebRTC-Audio-OpusAvoidNoisePumpingDuringDtx": [ + { + "platforms": [ + "android", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled" + } + ] + } + ], "WebRTC-Bwe-ReceiverLimitCapsOnly": [ { "platforms": [
diff --git a/third_party/blink/common/messaging/web_message_port.cc b/third_party/blink/common/messaging/web_message_port.cc index 98e6c3f..88adf1b 100644 --- a/third_party/blink/common/messaging/web_message_port.cc +++ b/third_party/blink/common/messaging/web_message_port.cc
@@ -69,6 +69,14 @@ WebMessagePort(port_pair.TakePort1())); } +// static +WebMessagePort WebMessagePort::Create(MessagePortDescriptor port) { + DCHECK(port.IsValid()); + DCHECK(!port.IsEntangled()); + + return WebMessagePort(std::move(port)); +} + void WebMessagePort::SetReceiver( MessageReceiver* receiver, scoped_refptr<base::SequencedTaskRunner> runner) {
diff --git a/third_party/blink/public/common/messaging/web_message_port.h b/third_party/blink/public/common/messaging/web_message_port.h index 713e217..43b8469 100644 --- a/third_party/blink/public/common/messaging/web_message_port.h +++ b/third_party/blink/public/common/messaging/web_message_port.h
@@ -83,6 +83,10 @@ // are conjugates of each other. static std::pair<WebMessagePort, WebMessagePort> CreatePair(); + // Wraps one end of a message channel. |port|'s mojo pipe must + // be paired, valid and not entangled. + static WebMessagePort Create(MessagePortDescriptor port); + // Sets a message receiver for this message port. Once bound any incoming // messages to this port will be routed to the provided |receiver| with // callbacks invoked on the provided |runner|. Note that if you set a receiver
diff --git a/third_party/blink/public/mojom/mediastream/media_stream.mojom b/third_party/blink/public/mojom/mediastream/media_stream.mojom index 9d6092c..4a972bb 100644 --- a/third_party/blink/public/mojom/mediastream/media_stream.mojom +++ b/third_party/blink/public/mojom/mediastream/media_stream.mojom
@@ -66,6 +66,7 @@ FAILED_DUE_TO_SHUTDOWN, KILL_SWITCH_ON, SYSTEM_PERMISSION_DENIED, + DEVICE_IN_USE, NUM_MEDIA_REQUEST_RESULTS };
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index e122d4f..a428fe7 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom
@@ -4,6 +4,7 @@ module blink.mojom; import "mojo/public/mojom/base/time.mojom"; +import "skia/public/mojom/skcolor.mojom"; import "third_party/blink/public/mojom/page/page_visibility_state.mojom"; import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom"; import "third_party/blink/public/mojom/renderer_preferences.mojom"; @@ -73,4 +74,7 @@ // Set history offset and length. SetHistoryOffsetAndLength(int32 offset, int32 length); + + // Sent to whole page, but should only be used by the main frame. + SetPageBaseBackgroundColor(skia.mojom.SkColor? color); };
diff --git a/third_party/blink/public/mojom/page/widget.mojom b/third_party/blink/public/mojom/page/widget.mojom index ec4bd81..986c3f1 100644 --- a/third_party/blink/public/mojom/page/widget.mojom +++ b/third_party/blink/public/mojom/page/widget.mojom
@@ -13,6 +13,7 @@ import "services/viz/public/mojom/compositing/local_surface_id.mojom"; import "services/viz/public/mojom/hit_test/input_target_client.mojom"; import "skia/public/mojom/bitmap.mojom"; +import "skia/public/mojom/skcolor.mojom"; import "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom"; import "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom"; import "third_party/blink/public/mojom/input/input_handler.mojom";
diff --git a/third_party/blink/public/platform/web_content_decryption_module_session.h b/third_party/blink/public/platform/web_content_decryption_module_session.h index cae958b..9f47b3ce 100644 --- a/third_party/blink/public/platform/web_content_decryption_module_session.h +++ b/third_party/blink/public/platform/web_content_decryption_module_session.h
@@ -38,6 +38,8 @@ #include "third_party/blink/public/platform/web_vector.h" namespace media { +enum class CdmMessageType; +enum class CdmSessionClosedReason; enum class EmeInitDataType; } @@ -50,17 +52,10 @@ public: class BLINK_PLATFORM_EXPORT Client { public: - enum class MessageType { - kLicenseRequest, - kLicenseRenewal, - kLicenseRelease, - kIndividualizationRequest - }; - - virtual void OnSessionMessage(MessageType, + virtual void OnSessionMessage(media::CdmMessageType, const unsigned char* message, size_t message_length) = 0; - virtual void OnSessionClosed() = 0; + virtual void OnSessionClosed(media::CdmSessionClosedReason reason) = 0; // Called when the expiration time for the session changes. // |updated_expiry_time_in_ms| is specified as the number of milliseconds
diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h index 97e150f..27db1610 100644 --- a/third_party/blink/public/web/web_view.h +++ b/third_party/blink/public/web/web_view.h
@@ -114,6 +114,9 @@ // to inform blink it is in the foreground or background. Whereas this bit // refers to user-visibility and whether the tab needs to produce pixels to // put on the screen at some point or not. + // |page_base_background_color| initial base background color used by the main + // frame. Set on create to avoid races. Passing in nullopt indicates the + // default base background color should be used. // TODO(yuzus): Remove |is_hidden| and start using |PageVisibilityState|. BLINK_EXPORT static WebView* Create( WebViewClient*, @@ -125,7 +128,8 @@ CrossVariantMojoAssociatedReceiver<mojom::PageBroadcastInterfaceBase> page_handle, scheduler::WebAgentGroupScheduler& agent_group_scheduler, - const SessionStorageNamespaceId& session_storage_namespace_id); + const SessionStorageNamespaceId& session_storage_namespace_id, + absl::optional<SkColor> page_base_background_color); // Destroys the WebView. virtual void Close() = 0; @@ -353,11 +357,6 @@ // Custom colors ------------------------------------------------------- - // Sets the default background color when the page has not loaded enough to - // know a background colour. This can be overridden by the methods below as - // well. - virtual void SetBaseBackgroundColor(SkColor) {} - virtual void SetDeviceColorSpaceForTesting( const gfx::ColorSpace& color_space) = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/dictionary.h b/third_party/blink/renderer/bindings/core/v8/dictionary.h index 9909d90..4444970 100644 --- a/third_party/blink/renderer/bindings/core/v8/dictionary.h +++ b/third_party/blink/renderer/bindings/core/v8/dictionary.h
@@ -27,6 +27,7 @@ #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_DICTIONARY_H_ #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/core_export.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/idl_types.h b/third_party/blink/renderer/bindings/core/v8/idl_types.h index bf1d91e..5b317ca 100644 --- a/third_party/blink/renderer/bindings/core/v8/idl_types.h +++ b/third_party/blink/renderer/bindings/core/v8/idl_types.h
@@ -335,7 +335,7 @@ // member. template <typename T> struct IDLOptional final : public IDLBase { - using ImplType = void; + using ImplType = typename NativeValueTraits<T>::ImplType; }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h index a4449557..9d7e21a9 100644 --- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h +++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h
@@ -67,7 +67,7 @@ template <> struct CORE_EXPORT NativeValueTraits<IDLOptional<IDLAny>> - : public NativeValueTraitsBase<IDLAny> { + : public NativeValueTraitsBase<IDLOptional<IDLAny>> { static ScriptValue NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -88,7 +88,7 @@ template <> struct CORE_EXPORT NativeValueTraits<IDLOptional<IDLBoolean>> - : public NativeValueTraitsBase<IDLBoolean> { + : public NativeValueTraitsBase<IDLOptional<IDLBoolean>> { static bool NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -412,7 +412,7 @@ template <> struct CORE_EXPORT NativeValueTraits<IDLOptional<IDLByteStringV2>> - : public NativeValueTraitsBase<IDLByteStringV2> { + : public NativeValueTraitsBase<IDLOptional<IDLByteStringV2>> { static decltype(auto) NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -471,7 +471,7 @@ template <> struct CORE_EXPORT NativeValueTraits<IDLOptional<IDLStringV2>> - : public NativeValueTraitsBase<IDLStringV2> { + : public NativeValueTraitsBase<IDLOptional<IDLStringV2>> { static decltype(auto) NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -514,7 +514,7 @@ template <> struct CORE_EXPORT NativeValueTraits<IDLOptional<IDLUSVStringV2>> - : public NativeValueTraitsBase<IDLUSVStringV2> { + : public NativeValueTraitsBase<IDLOptional<IDLUSVStringV2>> { static decltype(auto) NativeValue(v8::Isolate* isolate, v8::Local<v8::Value> value, ExceptionState& exception_state) { @@ -965,7 +965,7 @@ template <typename T> struct NativeValueTraits<IDLOptional<IDLSequence<T>>> - : public NativeValueTraitsBase<IDLSequence<T>> { + : public NativeValueTraitsBase<IDLOptional<IDLSequence<T>>> { static typename NativeValueTraits<IDLSequence<T>>::ImplType NativeValue( v8::Isolate* isolate, v8::Local<v8::Value> value, @@ -975,6 +975,17 @@ return NativeValueTraits<IDLSequence<T>>::NativeValue(isolate, value, exception_state); } + + static typename NativeValueTraits<IDLSequence<T>>::ImplType ArgumentValue( + v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { + if (value->IsUndefined()) + return {}; + return NativeValueTraits<IDLSequence<T>>::ArgumentValue( + isolate, argument_index, value, exception_state); + } }; // Frozen array types @@ -1342,6 +1353,13 @@ ExceptionState& exception_state) { return T::Create(isolate, value, exception_state); } + + static T* ArgumentValue(v8::Isolate* isolate, + int argument_index, + v8::Local<v8::Value> value, + ExceptionState& exception_state) { + return T::Create(isolate, value, exception_state); + } }; template <typename T>
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index ea27133..2c8828f 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -1154,6 +1154,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_encoding_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_message_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_message_type.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_session_closed_reason.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_session_closed_reason.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_session_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_session_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_key_status.cc",
diff --git a/third_party/blink/renderer/bindings/scripts/validate_web_idl.py b/third_party/blink/renderer/bindings/scripts/validate_web_idl.py index f3b98074..671e238 100644 --- a/third_party/blink/renderer/bindings/scripts/validate_web_idl.py +++ b/third_party/blink/renderer/bindings/scripts/validate_web_idl.py
@@ -32,7 +32,8 @@ ] for required_option_name in required_option_names: if getattr(options, required_option_name) is None: - parser.error("--{} is a required option.".format(opt_name)) + parser.error( + "--{} is a required option.".format(required_option_name)) return options, args
diff --git a/third_party/blink/renderer/config.gni b/third_party/blink/renderer/config.gni index f814f2d..1cd55f13 100644 --- a/third_party/blink/renderer/config.gni +++ b/third_party/blink/renderer/config.gni
@@ -52,7 +52,7 @@ # If true, the new implementation (experimental) of Blink-V8 bindings # (of IDL dictionary) is used. - use_blink_v8_binding_new_idl_dictionary = false + use_blink_v8_binding_new_idl_dictionary = true # If true, the new implementation (experimental) of Blink-V8 bindings # (of IDL interface) is used.
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index b601c941..6564708d 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1648,6 +1648,7 @@ "//components/paint_preview/common:common", "//components/shared_highlighting/core/common", "//components/ukm:test_support", + "//content/test:test_support", "//mojo/public/cpp/system", "//mojo/public/cpp/test_support:test_utils", "//services/metrics/public/cpp:ukm_builders",
diff --git a/third_party/blink/renderer/core/OWNERS b/third_party/blink/renderer/core/OWNERS index ab038c7..5570212 100644 --- a/third_party/blink/renderer/core/OWNERS +++ b/third_party/blink/renderer/core/OWNERS
@@ -9,6 +9,7 @@ # Reviewers (comments indicate areas of expertise): alexis.menard@intel.com almaher@microsoft.com +andruud@chromium.org # bokan reviews changes around viewport behavior, scrolling, cc/blink interaction, co-ordinate spaces and input events bokan@chromium.org cbiesinger@chromium.org
diff --git a/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent.cc b/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent.cc index 11f599f..09a63f77 100644 --- a/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent.cc +++ b/third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent.cc
@@ -4,7 +4,6 @@ #include "third_party/blink/renderer/core/accessibility/scoped_blink_ax_event_intent.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" namespace blink {
diff --git a/third_party/blink/renderer/core/animation/animation_effect_test.cc b/third_party/blink/renderer/core/animation/animation_effect_test.cc index 7628a5a1..401444372 100644 --- a/third_party/blink/renderer/core/animation/animation_effect_test.cc +++ b/third_party/blink/renderer/core/animation/animation_effect_test.cc
@@ -790,12 +790,25 @@ effect->updateTiming(effect_timing); EXPECT_EQ("ease-in-out", effect->getTiming()->easing()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + EXPECT_EQ("auto", effect->getTiming()->duration()->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ("auto", effect->getTiming()->duration().GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing = OptionalEffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + effect_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>(2.5)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDuration( UnrestrictedDoubleOrString::FromUnrestrictedDouble(2.5)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect->updateTiming(effect_timing); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + EXPECT_EQ(2.5, effect->getTiming()->duration()->GetAsUnrestrictedDouble()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ(2.5, effect->getTiming()->duration().GetAsUnrestrictedDouble()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } TEST(AnimationAnimationEffectTest, UpdateTimingThrowsWhenExpected) { @@ -826,15 +839,26 @@ // If it is a number, duration must be non-negative and non-null. exception_state.ClearException(); effect_timing = OptionalEffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + effect_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>(-100)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDuration( UnrestrictedDoubleOrString::FromUnrestrictedDouble(-100)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect->updateTiming(effect_timing, exception_state); EXPECT_TRUE(exception_state.HadException()); exception_state.ClearException(); effect_timing = OptionalEffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + effect_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>( + std::numeric_limits<double>::quiet_NaN())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDuration(UnrestrictedDoubleOrString::FromUnrestrictedDouble( std::numeric_limits<double>::quiet_NaN())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect->updateTiming(effect_timing, exception_state); EXPECT_TRUE(exception_state.HadException()); @@ -896,8 +920,13 @@ effect_timing = OptionalEffectTiming::Create(); effect_timing->setIterations(3); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + effect_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>(2000)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDuration( UnrestrictedDoubleOrString::FromUnrestrictedDouble(2000)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDirection("alternate-reverse"); effect->updateTiming(effect_timing);
diff --git a/third_party/blink/renderer/core/animation/animation_test.cc b/third_party/blink/renderer/core/animation/animation_test.cc index 90ab0a3..be0ffc33 100644 --- a/third_party/blink/renderer/core/animation/animation_test.cc +++ b/third_party/blink/renderer/core/animation/animation_test.cc
@@ -1509,8 +1509,14 @@ animation->CheckCanStartAnimationOnCompositor(nullptr)); OptionalEffectTiming* effect_timing = OptionalEffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + effect_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>( + std::numeric_limits<double>::infinity())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDuration(UnrestrictedDoubleOrString::FromUnrestrictedDouble( std::numeric_limits<double>::infinity())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) animation->effect()->updateTiming(effect_timing); EXPECT_EQ(CompositorAnimations::kEffectHasUnsupportedTimingParameters, animation->CheckCanStartAnimationOnCompositor(nullptr)); @@ -1682,8 +1688,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 20), mojom::blink::ScrollType::kProgrammatic); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -1751,8 +1762,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 100), mojom::blink::ScrollType::kProgrammatic); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -1830,8 +1846,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 20), mojom::blink::ScrollType::kProgrammatic); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -1886,8 +1907,13 @@ // Create ScrollTimeline ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -2233,8 +2259,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 20), mojom::blink::ScrollType::kProgrammatic); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline =
diff --git a/third_party/blink/renderer/core/animation/animation_test_helpers.cc b/third_party/blink/renderer/core/animation/animation_test_helpers.cc index 081611a..7d75e8c 100644 --- a/third_party/blink/renderer/core/animation/animation_test_helpers.cc +++ b/third_party/blink/renderer/core/animation/animation_test_helpers.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/animation/animation_test_helpers.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_csskeywordvalue_cssnumericvalue_scrolltimelineelementbasedoffset_string.h" #include "third_party/blink/renderer/core/animation/css_interpolation_environment.h" #include "third_party/blink/renderer/core/animation/css_interpolation_types_map.h" #include "third_party/blink/renderer/core/animation/invalidatable_interpolation.h" @@ -89,6 +90,22 @@ cascade.Apply(); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8ScrollTimelineOffset* OffsetFromString(Document& document, + const String& string) { + const CSSValue* value = css_test_helpers::ParseValue( + document, "<length-percentage> | auto", string); + + if (const auto* primitive = DynamicTo<CSSPrimitiveValue>(value)) { + return MakeGarbageCollected<V8ScrollTimelineOffset>( + CSSNumericValue::FromCSSValue(*primitive)); + } else if (DynamicTo<CSSIdentifierValue>(value)) { + return MakeGarbageCollected<V8ScrollTimelineOffset>( + CSSKeywordValue::Create("auto")); + } + return MakeGarbageCollected<V8ScrollTimelineOffset>(string); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ScrollTimelineOffsetValue OffsetFromString(Document& document, const String& string) { ScrollTimelineOffsetValue result; @@ -105,6 +122,7 @@ return result; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace animation_test_helpers } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/animation_test_helpers.h b/third_party/blink/renderer/core/animation/animation_test_helpers.h index dd701819..442ee34 100644 --- a/third_party/blink/renderer/core/animation/animation_test_helpers.h +++ b/third_party/blink/renderer/core/animation/animation_test_helpers.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_ANIMATION_TEST_HELPERS_H_ #include "third_party/blink/renderer/bindings/core/v8/css_numeric_value_or_string_or_css_keyword_value_or_scroll_timeline_element_based_offset.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" #include "third_party/blink/renderer/core/animation/interpolation.h" #include "third_party/blink/renderer/core/animation/scroll_timeline_offset.h" #include "third_party/blink/renderer/platform/wtf/text/string_view.h" @@ -50,7 +51,11 @@ // <length-percentage>. // - A CSSKeywordValue. if the incoming string can be parsed as 'auto'. // - Otherwise, the incoming string. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8ScrollTimelineOffset* OffsetFromString(Document&, const String&); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ScrollTimelineOffsetValue OffsetFromString(Document&, const String&); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace animation_test_helpers } // namespace blink
diff --git a/third_party/blink/renderer/core/animation/effect_input.cc b/third_party/blink/renderer/core/animation/effect_input.cc index e6b9c92e..f746728 100644 --- a/third_party/blink/renderer/core/animation/effect_input.cc +++ b/third_party/blink/renderer/core/animation/effect_input.cc
@@ -64,6 +64,30 @@ // Converts the composite property of a BasePropertyIndexedKeyframe into a // vector of absl::optional<EffectModel::CompositeOperation> enums. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +Vector<absl::optional<EffectModel::CompositeOperation>> ParseCompositeProperty( + const BasePropertyIndexedKeyframe* keyframe) { + const auto* composite = keyframe->composite(); + switch (composite->GetContentType()) { + case V8UnionCompositeOperationOrAutoOrCompositeOperationOrAutoSequence:: + ContentType::kCompositeOperationOrAuto: + return {EffectModel::StringToCompositeOperation( + composite->GetAsCompositeOperationOrAuto().AsString())}; + case V8UnionCompositeOperationOrAutoOrCompositeOperationOrAutoSequence:: + ContentType::kCompositeOperationOrAutoSequence: { + Vector<absl::optional<EffectModel::CompositeOperation>> result; + for (const auto& composite_operation : + composite->GetAsCompositeOperationOrAutoSequence()) { + result.push_back(EffectModel::StringToCompositeOperation( + composite_operation.AsString())); + } + return result; + } + } + NOTREACHED(); + return {}; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Vector<absl::optional<EffectModel::CompositeOperation>> ParseCompositeProperty( const BasePropertyIndexedKeyframe* keyframe) { const CompositeOperationOrAutoOrCompositeOperationOrAutoSequence& composite = @@ -82,6 +106,7 @@ } return result; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void SetKeyframeValue(Element* element, Document& document, @@ -454,20 +479,36 @@ return {}; Vector<absl::optional<double>> offsets; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (property_indexed_keyframe->offset()->IsNull()) + offsets.push_back(absl::nullopt); + else if (property_indexed_keyframe->offset()->IsDouble()) + offsets.push_back(property_indexed_keyframe->offset()->GetAsDouble()); + else + offsets = property_indexed_keyframe->offset()->GetAsDoubleOrNullSequence(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (property_indexed_keyframe->offset().IsNull()) offsets.push_back(absl::nullopt); else if (property_indexed_keyframe->offset().IsDouble()) offsets.push_back(property_indexed_keyframe->offset().GetAsDouble()); else offsets = property_indexed_keyframe->offset().GetAsDoubleOrNullSequence(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // The web-animations spec explicitly states that easings should be kept as // DOMStrings here and not parsed into timing functions until later. Vector<String> easings; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (property_indexed_keyframe->easing()->IsString()) + easings.push_back(property_indexed_keyframe->easing()->GetAsString()); + else + easings = property_indexed_keyframe->easing()->GetAsStringSequence(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (property_indexed_keyframe->easing().IsString()) easings.push_back(property_indexed_keyframe->easing().GetAsString()); else easings = property_indexed_keyframe->easing().GetAsStringSequence(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Vector<absl::optional<EffectModel::CompositeOperation>> composite_operations = ParseCompositeProperty(property_indexed_keyframe);
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc index 4917fa3..0110802 100644 --- a/third_party/blink/renderer/core/animation/keyframe_effect_test.cc +++ b/third_party/blink/renderer/core/animation/keyframe_effect_test.cc
@@ -304,10 +304,17 @@ timing_input_dictionary_with_duration); EffectTiming* specified_with_duration = animation_with_duration->getTiming(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* duration = specified_with_duration->duration(); + EXPECT_TRUE(duration->IsUnrestrictedDouble()); + EXPECT_EQ(2.5, duration->GetAsUnrestrictedDouble()); + EXPECT_FALSE(duration->IsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnrestrictedDoubleOrString duration = specified_with_duration->duration(); EXPECT_TRUE(duration.IsUnrestrictedDouble()); EXPECT_EQ(2.5, duration.GetAsUnrestrictedDouble()); EXPECT_FALSE(duration.IsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) v8::Local<v8::Object> timing_input_no_duration = v8::Object::New(scope.GetIsolate()); @@ -321,10 +328,17 @@ timing_input_dictionary_no_duration); EffectTiming* specified_no_duration = animation_no_duration->getTiming(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* duration2 = specified_no_duration->duration(); + EXPECT_FALSE(duration2->IsUnrestrictedDouble()); + EXPECT_TRUE(duration2->IsString()); + EXPECT_EQ("auto", duration2->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnrestrictedDoubleOrString duration2 = specified_no_duration->duration(); EXPECT_FALSE(duration2.IsUnrestrictedDouble()); EXPECT_TRUE(duration2.IsString()); EXPECT_EQ("auto", duration2.GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } TEST_F(AnimationKeyframeEffectV8Test, SetKeyframesAdditiveCompositeOperation) {
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc index c4a8b6b..537515b 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc
@@ -136,9 +136,15 @@ } absl::optional<double> time_range; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (options->timeRange()->IsDouble()) { + time_range = absl::make_optional(options->timeRange()->GetAsDouble()); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (options->timeRange().IsDouble()) { time_range = absl::make_optional(options->timeRange().GetAsDouble()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // The scrollingElement depends on style/layout-tree in quirks mode. Update // such that subsequent calls to ScrollingElementNoLayout returns up-to-date
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_offset.cc b/third_party/blink/renderer/core/animation/scroll_timeline_offset.cc index 4f0711a..3c17a05f 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_offset.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_offset.cc
@@ -22,7 +22,8 @@ namespace { -bool ValidateElementBasedOffset(ScrollTimelineElementBasedOffset* offset) { +bool ValidateElementBasedOffset( + const ScrollTimelineElementBasedOffset* offset) { if (!offset->hasTarget()) return false; @@ -66,6 +67,7 @@ o1->threshold() == o2->threshold(); } +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) CSSKeywordValue* GetCSSKeywordValue(const ScrollTimelineOffsetValue& offset) { if (offset.IsCSSKeywordValue()) return offset.GetAsCSSKeywordValue(); @@ -74,9 +76,51 @@ return CSSKeywordValue::Create(offset.GetAsString()); return nullptr; } +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +// static +ScrollTimelineOffset* ScrollTimelineOffset::Create( + const V8ScrollTimelineOffset* offset) { + switch (offset->GetContentType()) { + case V8ScrollTimelineOffset::ContentType::kCSSKeywordValue: { + const auto* keyword = offset->GetAsCSSKeywordValue(); + if (keyword->KeywordValueID() != CSSValueID::kAuto) + return nullptr; + return MakeGarbageCollected<ScrollTimelineOffset>(); + } + case V8ScrollTimelineOffset::ContentType::kCSSNumericValue: { + const auto* value = + To<CSSPrimitiveValue>(offset->GetAsCSSNumericValue()->ToCSSValue()); + bool matches_length_percentage = + value->IsLength() || value->IsPercentage() || + value->IsCalculatedPercentageWithLength(); + if (!matches_length_percentage) + return nullptr; + return MakeGarbageCollected<ScrollTimelineOffset>(value); + } + case V8ScrollTimelineOffset::ContentType:: + kScrollTimelineElementBasedOffset: { + auto* value = offset->GetAsScrollTimelineElementBasedOffset(); + if (!ValidateElementBasedOffset(value)) + return nullptr; + return MakeGarbageCollected<ScrollTimelineOffset>(value); + } + case V8ScrollTimelineOffset::ContentType::kString: { + if (offset->GetAsString().IsEmpty()) + return nullptr; + const auto* keyword = CSSKeywordValue::Create(offset->GetAsString()); + if (keyword->KeywordValueID() != CSSValueID::kAuto) + return nullptr; + return MakeGarbageCollected<ScrollTimelineOffset>(); + } + } + NOTREACHED(); + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // static ScrollTimelineOffset* ScrollTimelineOffset::Create( const ScrollTimelineOffsetValue& input_offset) { @@ -107,6 +151,7 @@ return nullptr; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) absl::optional<double> ScrollTimelineOffset::ResolveOffset( Node* scroll_source,
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_offset.h b/third_party/blink/renderer/core/animation/scroll_timeline_offset.h index bcb2888b..8c1dca9 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_offset.h +++ b/third_party/blink/renderer/core/animation/scroll_timeline_offset.h
@@ -14,18 +14,24 @@ namespace blink { +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) class CSSNumericValueOrStringOrCSSKeywordValueOrScrollTimelineElementBasedOffset; using ScrollTimelineOffsetValue = CSSNumericValueOrStringOrCSSKeywordValueOrScrollTimelineElementBasedOffset; +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // Represent a scroll timeline start/end offset which can be an // scroll offset or an element based offset class CORE_EXPORT ScrollTimelineOffset final : public GarbageCollected<ScrollTimelineOffset> { public: +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + static ScrollTimelineOffset* Create(const V8ScrollTimelineOffset* offset); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) static ScrollTimelineOffset* Create(const ScrollTimelineOffsetValue& offset); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // Create a default offset representing 'auto'. ScrollTimelineOffset() = default;
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_offset_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_offset_test.cc index fb88361..22182ab 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_offset_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_offset_test.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/animation/scroll_timeline_offset.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_csskeywordvalue_cssnumericvalue_scrolltimelineelementbasedoffset_string.h" #include "third_party/blink/renderer/core/animation/animation_test_helpers.h" #include "third_party/blink/renderer/core/animation/scroll_timeline_offset.h" #include "third_party/blink/renderer/core/css/parser/css_parser_context.h" @@ -27,8 +28,12 @@ auto* inner = CreateElementBasedOffset(target, edge, threshold); if (!inner) return nullptr; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* param = MakeGarbageCollected<V8ScrollTimelineOffset>(inner); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ScrollTimelineOffsetValue param; param.SetScrollTimelineElementBasedOffset(inner); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return ScrollTimelineOffset::Create(param); }
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_test.cc index bdc9d1c9..b3b75042 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_test.cc
@@ -91,9 +91,15 @@ return count; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + V8ScrollTimelineOffset* OffsetFromString(const String& value) { + return animation_test_helpers::OffsetFromString(GetDocument(), value); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ScrollTimelineOffsetValue OffsetFromString(const String& value) { return animation_test_helpers::OffsetFromString(GetDocument(), value); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) }; class TestScrollTimeline : public ScrollTimeline { @@ -134,8 +140,13 @@ ASSERT_TRUE(scroller); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -164,8 +175,13 @@ PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); ASSERT_TRUE(scrollable_area); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); options->setScrollOffsets( @@ -200,16 +216,26 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 90), mojom::blink::ScrollType::kProgrammatic); SimulateFrame(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + EXPECT_EQ(scroll_timeline->CurrentTimeMilliseconds(), + time_range->GetAsDouble()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ(scroll_timeline->CurrentTimeMilliseconds(), time_range.GetAsDouble()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ("after", scroll_timeline->phase()); current_time_is_null = true; scrollable_area->SetScrollOffset(ScrollOffset(0, 100), mojom::blink::ScrollType::kProgrammatic); SimulateFrame(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + EXPECT_EQ(scroll_timeline->CurrentTimeMilliseconds(), + time_range->GetAsDouble()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ(scroll_timeline->CurrentTimeMilliseconds(), time_range.GetAsDouble()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ("after", scroll_timeline->phase()); EXPECT_TRUE(scroll_timeline->IsActive()); } @@ -233,8 +259,13 @@ PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); ASSERT_TRUE(scrollable_area); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); options->setScrollOffsets( @@ -262,8 +293,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 100), mojom::blink::ScrollType::kProgrammatic); SimulateFrame(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + EXPECT_EQ(time_range->GetAsDouble(), + scroll_timeline->CurrentTimeMilliseconds()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ(time_range.GetAsDouble(), scroll_timeline->CurrentTimeMilliseconds()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ("after", scroll_timeline->phase()); EXPECT_TRUE(scroll_timeline->IsActive()); } @@ -286,8 +322,13 @@ PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); ASSERT_TRUE(scrollable_area); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); options->setScrollOffsets( @@ -333,8 +374,13 @@ // Create the ScrollTimeline with Document.scrollingElement() as source. The // resolved scroll source should be the Document. ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetDocument().scrollingElement()); ScrollTimeline* scroll_timeline = @@ -359,8 +405,13 @@ // Create the ScrollTimeline with Document.scrollingElement() as source. The // resolved scroll source should be the Document. ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetDocument().scrollingElement()); ScrollTimeline* scroll_timeline = @@ -724,8 +775,13 @@ PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); ASSERT_TRUE(scrollable_area); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); @@ -933,11 +989,21 @@ ASSERT_TRUE(scrollable_area); double time_range = 100.0; ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setTimeRange( + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>( + time_range)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange( DoubleOrScrollTimelineAutoKeyword::FromDouble(time_range)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setScrollSource(GetElementById("scroller")); // Empty scroll offsets resolve into [0, 100%]. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + HeapVector<Member<V8ScrollTimelineOffset>> scroll_offsets = {}; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) HeapVector<ScrollTimelineOffsetValue> scroll_offsets = {}; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setScrollOffsets(scroll_offsets); ScrollTimeline* scroll_timeline = @@ -1000,10 +1066,20 @@ ASSERT_TRUE(scrollable_area); double time_range = 100.0; ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setTimeRange( + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>( + time_range)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange( DoubleOrScrollTimelineAutoKeyword::FromDouble(time_range)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setScrollSource(GetElementById("scroller")); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + HeapVector<Member<V8ScrollTimelineOffset>> scroll_offsets; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) HeapVector<ScrollTimelineOffsetValue> scroll_offsets; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) scroll_offsets.push_back(OffsetFromString("10px")); scroll_offsets.push_back(OffsetFromString("20px")); scroll_offsets.push_back(OffsetFromString("40px")); @@ -1091,12 +1167,24 @@ ASSERT_TRUE(scrollable_area); double time_range = 100.0; ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setTimeRange( + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>( + time_range)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange( DoubleOrScrollTimelineAutoKeyword::FromDouble(time_range)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setScrollSource(GetElementById("scroller")); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + HeapVector<Member<V8ScrollTimelineOffset>> scroll_offsets = { + OffsetFromString("90px"), OffsetFromString("40px"), + OffsetFromString("10px")}; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) HeapVector<ScrollTimelineOffsetValue> scroll_offsets = { OffsetFromString("90px"), OffsetFromString("40px"), OffsetFromString("10px")}; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setScrollOffsets(scroll_offsets); ScrollTimeline* scroll_timeline =
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc index 9742ddd..0752627 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_util_test.cc
@@ -61,8 +61,14 @@ ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); options->setScrollSource(scroller); const double time_range = 100; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setTimeRange( + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>( + time_range)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange( DoubleOrScrollTimelineAutoKeyword::FromDouble(time_range)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setOrientation("block"); options->setScrollOffsets({OffsetFromString(GetDocument(), "50px"), OffsetFromString(GetDocument(), "auto")}); @@ -116,8 +122,13 @@ ASSERT_FALSE(div->GetLayoutBox()); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(div); ScrollTimeline* timeline =
diff --git a/third_party/blink/renderer/core/animation/timing.cc b/third_party/blink/renderer/core/animation/timing.cc index c1cec54..1c6a919 100644 --- a/third_party/blink/renderer/core/animation/timing.cc +++ b/third_party/blink/renderer/core/animation/timing.cc
@@ -94,6 +94,16 @@ effect_timing->setFill(FillModeString(fill_mode)); effect_timing->setIterationStart(iteration_start); effect_timing->setIterations(iteration_count); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + V8UnionStringOrUnrestrictedDouble* duration; + if (iteration_duration) { + duration = MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>( + iteration_duration->InMillisecondsF()); + } else { + duration = MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>("auto"); + } + effect_timing->setDuration(duration); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnrestrictedDoubleOrString duration; if (iteration_duration) { duration.SetUnrestrictedDouble(iteration_duration->InMillisecondsF()); @@ -101,6 +111,7 @@ duration.SetString("auto"); } effect_timing->setDuration(duration); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDirection(PlaybackDirectionString(direction)); effect_timing->setEasing(timing_function->ToString()); @@ -113,16 +124,32 @@ ComputedEffectTiming* computed_timing = ComputedEffectTiming::Create(); // ComputedEffectTiming members. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + computed_timing->setEndTime(MakeGarbageCollected<V8CSSNumberish>( + EndTimeInternal().InMillisecondsF())); + computed_timing->setActiveDuration( + MakeGarbageCollected<V8CSSNumberish>(ActiveDuration().InMillisecondsF())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) computed_timing->setEndTime( CSSNumberish::FromDouble(EndTimeInternal().InMillisecondsF())); computed_timing->setActiveDuration( CSSNumberish::FromDouble(ActiveDuration().InMillisecondsF())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (calculated_timing.local_time) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + computed_timing->setLocalTime(MakeGarbageCollected<V8CSSNumberish>( + calculated_timing.local_time->InMillisecondsF())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) computed_timing->setLocalTime(CSSNumberish::FromDouble( calculated_timing.local_time->InMillisecondsF())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } else { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + computed_timing->setLocalTime(nullptr); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) computed_timing->setLocalTime(CSSNumberish()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } if (calculated_timing.is_in_effect) { @@ -132,8 +159,13 @@ computed_timing->setCurrentIteration( calculated_timing.current_iteration.value()); } else { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + computed_timing->setProgress(absl::nullopt); + computed_timing->setCurrentIteration(absl::nullopt); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) computed_timing->setProgressToNull(); computed_timing->setCurrentIterationToNull(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // For the EffectTiming members, getComputedTiming is equivalent to getTiming @@ -147,9 +179,15 @@ computed_timing->setIterationStart(iteration_start); computed_timing->setIterations(iteration_count); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + computed_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>( + IterationDuration().InMillisecondsF())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnrestrictedDoubleOrString duration; duration.SetUnrestrictedDouble(IterationDuration().InMillisecondsF()); computed_timing->setDuration(duration); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) computed_timing->setDirection(Timing::PlaybackDirectionString(direction)); computed_timing->setEasing(timing_function->ToString());
diff --git a/third_party/blink/renderer/core/animation/timing_input.cc b/third_party/blink/renderer/core/animation/timing_input.cc index 17e214c..f15b87d 100644 --- a/third_party/blink/renderer/core/animation/timing_input.cc +++ b/third_party/blink/renderer/core/animation/timing_input.cc
@@ -28,6 +28,16 @@ return Timing::PlaybackDirection::NORMAL; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +absl::optional<AnimationTimeDelta> ConvertIterationDuration( + const V8UnionStringOrUnrestrictedDouble* duration) { + if (duration->IsUnrestrictedDouble()) { + return AnimationTimeDelta::FromMillisecondsD( + duration->GetAsUnrestrictedDouble()); + } + return absl::nullopt; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) absl::optional<AnimationTimeDelta> ConvertIterationDuration( const UnrestrictedDoubleOrString& duration) { if (duration.IsUnrestrictedDouble()) { @@ -36,6 +46,7 @@ } return absl::nullopt; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Timing ConvertEffectTiming(const EffectTiming* timing_input, Document* document, @@ -79,9 +90,15 @@ // Let timing input be a new EffectTiming object with all members set to // their default values and duration set to options. EffectTiming* timing_input = EffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + timing_input->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>( + options->GetAsUnrestrictedDouble())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) timing_input->setDuration( UnrestrictedDoubleOrString::FromUnrestrictedDouble( options->GetAsUnrestrictedDouble())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return ConvertEffectTiming(timing_input, document, exception_state); } } @@ -109,9 +126,15 @@ // Let timing input be a new EffectTiming object with all members set to // their default values and duration set to options. EffectTiming* timing_input = EffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + timing_input->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>( + options->GetAsUnrestrictedDouble())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) timing_input->setDuration( UnrestrictedDoubleOrString::FromUnrestrictedDouble( options->GetAsUnrestrictedDouble())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return ConvertEffectTiming(timing_input, document, exception_state); } } @@ -146,6 +169,25 @@ // https://github.com/w3c/csswg-drafts/issues/247 . if (input->hasDuration()) { const char* error_message = "duration must be non-negative or auto"; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (input->duration()->GetContentType()) { + case V8UnionStringOrUnrestrictedDouble::ContentType::kString: + if (input->duration()->GetAsString() != "auto") { + exception_state.ThrowTypeError(error_message); + return false; + } + break; + case V8UnionStringOrUnrestrictedDouble::ContentType:: + kUnrestrictedDouble: { + double duration = input->duration()->GetAsUnrestrictedDouble(); + if (std::isnan(duration) || duration < 0) { + exception_state.ThrowTypeError(error_message); + return false; + } + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (input->duration().IsUnrestrictedDouble()) { double duration = input->duration().GetAsUnrestrictedDouble(); if (std::isnan(duration) || duration < 0) { @@ -156,6 +198,7 @@ exception_state.ThrowTypeError(error_message); return false; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // 4. If the easing member of input is present but cannot be parsed using the
diff --git a/third_party/blink/renderer/core/app_history/app_history.cc b/third_party/blink/renderer/core/app_history/app_history.cc index 9f0447f..a5a186f6c 100644 --- a/third_party/blink/renderer/core/app_history/app_history.cc +++ b/third_party/blink/renderer/core/app_history/app_history.cc
@@ -6,9 +6,10 @@ #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/v8_app_history_navigate_event_init.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_app_history_navigate_options.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/app_history/app_history_entry.h" #include "third_party/blink/renderer/core/app_history/app_history_navigate_event.h" -#include "third_party/blink/renderer/core/app_history/app_history_navigate_options.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/events/error_event.h" #include "third_party/blink/renderer/core/frame/history_util.h" @@ -255,8 +256,16 @@ MakeGarbageCollected<ScriptPromiseResolver>(script_state)); base::AutoReset<bool> did_react(&did_react_to_promise_, false); goto_promise_resolver_ = nullptr; - base::AutoReset<ScriptValue> event_info(&navigate_event_info_, - options->navigateInfo()); + base::AutoReset<ScriptValue> event_info( + &navigate_event_info_, +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->getNavigateInfoOr( + ScriptValue(script_state->GetIsolate(), + v8::Undefined(script_state->GetIsolate()))) +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->navigateInfo() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ); WebFrameLoadType frame_load_type = options->replace() ? WebFrameLoadType::kReplaceCurrentItem : WebFrameLoadType::kStandard; @@ -323,8 +332,16 @@ &navigate_method_call_promise_resolver_, MakeGarbageCollected<ScriptPromiseResolver>(script_state)); goto_promise_resolver_ = nullptr; - base::AutoReset<ScriptValue> event_info(&navigate_event_info_, - options->navigateInfo()); + base::AutoReset<ScriptValue> event_info( + &navigate_event_info_, +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->getNavigateInfoOr( + ScriptValue(script_state->GetIsolate(), + v8::Undefined(script_state->GetIsolate()))) +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->navigateInfo() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ); AppHistoryEntry* destination = entries_[keys_to_indices_.at(key)]; // TODO(japhet): Right now this is the only kind of back/forward navigation // that fires the navigate event. This should probably move to a more central @@ -422,7 +439,8 @@ init->setUserInitiated(involvement != UserNavigationInvolvement::kNone); init->setFormData(form ? FormData::Create(form, ASSERT_NO_EXCEPTION) : nullptr); - init->setInfo(navigate_event_info_); + if (!(navigate_event_info_.IsEmpty() || navigate_event_info_.IsUndefined())) + init->setInfo(navigate_event_info_); auto* navigate_event = AppHistoryNavigateEvent::Create( GetSupplementable(), event_type_names::kNavigate, init); navigate_event->SetUrl(url);
diff --git a/third_party/blink/renderer/core/app_history/app_history_navigate_event.cc b/third_party/blink/renderer/core/app_history/app_history_navigate_event.cc index aca594e..f1f7bbd 100644 --- a/third_party/blink/renderer/core/app_history/app_history_navigate_event.cc +++ b/third_party/blink/renderer/core/app_history/app_history_navigate_event.cc
@@ -23,7 +23,10 @@ user_initiated_(init->userInitiated()), hash_change_(init->hashChange()), form_data_(init->formData()), - info_(init->info()) { + info_(init->hasInfo() + ? init->info() + : ScriptValue(context->GetIsolate(), + v8::Undefined(context->GetIsolate()))) { DCHECK(IsA<LocalDOMWindow>(context)); }
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer_item.h b/third_party/blink/renderer/core/clipboard/data_transfer_item.h index 5b8eb4a..e51f88d 100644 --- a/third_party/blink/renderer/core/clipboard/data_transfer_item.h +++ b/third_party/blink/renderer/core/clipboard/data_transfer_item.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CLIPBOARD_DATA_TRANSFER_ITEM_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CLIPBOARD_DATA_TRANSFER_ITEM_H_ -#include "base/macros.h" #include "third_party/blink/renderer/bindings/core/v8/v8_function_string_callback.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
diff --git a/third_party/blink/renderer/core/clipboard/dragged_isolated_file_system.h b/third_party/blink/renderer/core/clipboard/dragged_isolated_file_system.h index 15fbc94..75092ce1 100644 --- a/third_party/blink/renderer/core/clipboard/dragged_isolated_file_system.h +++ b/third_party/blink/renderer/core/clipboard/dragged_isolated_file_system.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CLIPBOARD_DRAGGED_ISOLATED_FILE_SYSTEM_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CLIPBOARD_DRAGGED_ISOLATED_FILE_SYSTEM_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni index 0a17b28f..61db1e3 100644 --- a/third_party/blink/renderer/core/css/build.gni +++ b/third_party/blink/renderer/core/css/build.gni
@@ -718,6 +718,7 @@ "selector_query_test.cc", "style_element_test.cc", "style_engine_test.cc", + "style_recalc_test.cc", "style_environment_variables_test.cc", "style_rule_test.cc", "style_sheet_contents_test.cc",
diff --git a/third_party/blink/renderer/core/css/css_layout_function_value.h b/third_party/blink/renderer/core/css/css_layout_function_value.h index 853110df..ea14616f 100644 --- a/third_party/blink/renderer/core/css/css_layout_function_value.h +++ b/third_party/blink/renderer/core/css/css_layout_function_value.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_LAYOUT_FUNCTION_VALUE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_LAYOUT_FUNCTION_VALUE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_value.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/casting.h"
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.cc b/third_party/blink/renderer/core/css/css_style_sheet.cc index 92739eb0..f63be44 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet.cc +++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -110,12 +110,24 @@ sheet->ClearOwnerRule(); contents->RegisterClient(sheet); scoped_refptr<MediaQuerySet> media_query_set; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (options->media()->GetContentType()) { + case V8UnionMediaListOrString::ContentType::kMediaList: + media_query_set = options->media()->GetAsMediaList()->Queries()->Copy(); + break; + case V8UnionMediaListOrString::ContentType::kString: + media_query_set = MediaQuerySet::Create(options->media()->GetAsString(), + document.GetExecutionContext()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (options->media().IsString()) { media_query_set = MediaQuerySet::Create(options->media().GetAsString(), document.GetExecutionContext()); } else { media_query_set = options->media().GetAsMediaList()->Queries()->Copy(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* media_list = MakeGarbageCollected<MediaList>( media_query_set, const_cast<CSSStyleSheet*>(sheet)); sheet->SetMedia(media_list);
diff --git a/third_party/blink/renderer/core/css/css_style_sheet_test.cc b/third_party/blink/renderer/core/css/css_style_sheet_test.cc index 2ecb48e2..b18dda2 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet_test.cc +++ b/third_party/blink/renderer/core/css/css_style_sheet_test.cc
@@ -56,7 +56,12 @@ CSSStyleSheetConstructionWithNonEmptyCSSStyleSheetInit) { DummyExceptionStateForTesting exception_state; CSSStyleSheetInit* init = CSSStyleSheetInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setMedia( + MakeGarbageCollected<V8UnionMediaListOrString>("screen, print")); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setMedia(MediaListOrString::FromString("screen, print")); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setTitle("test"); init->setAlternate(true); init->setDisabled(true); @@ -68,7 +73,11 @@ EXPECT_EQ(sheet->ownerNode(), nullptr); EXPECT_EQ(sheet->ownerRule(), nullptr); EXPECT_EQ(sheet->media()->length(), 2U); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + EXPECT_EQ(sheet->media()->mediaText(nullptr), init->media()->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ(sheet->media()->mediaText(nullptr), init->media().GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ(sheet->title(), init->title()); EXPECT_TRUE(sheet->AlternateFromConstructor()); EXPECT_TRUE(sheet->disabled());
diff --git a/third_party/blink/renderer/core/css/css_syntax_component.h b/third_party/blink/renderer/core/css/css_syntax_component.h index a4e1101..3dbd4b443 100644 --- a/third_party/blink/renderer/core/css/css_syntax_component.h +++ b/third_party/blink/renderer/core/css/css_syntax_component.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SYNTAX_COMPONENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SYNTAX_COMPONENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_value.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h index 284dd41..63b7aac4 100644 --- a/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h +++ b/third_party/blink/renderer/core/css/cssom/style_property_map_read_only.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_STYLE_PROPERTY_MAP_READ_ONLY_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSSOM_STYLE_PROPERTY_MAP_READ_ONLY_H_ -#include "base/macros.h" #include "third_party/blink/renderer/bindings/core/v8/iterable.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_property_names.h"
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index a135d0c..d17baa3 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -1915,6 +1915,8 @@ false); PROPAGATE_FROM(document_element_style, ScrollbarGutter, SetScrollbarGutter, kScrollbarGutterAuto); + PROPAGATE_FROM(document_element_style, ForcedColorAdjust, + SetForcedColorAdjust, EForcedColorAdjust::kAuto); } changed |= PropagateScrollSnapStyleToViewport(
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index 7a60175..0be1cd0 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -2027,20 +2027,34 @@ ToPhysicalSize(logical_size, writing_mode), style); PhysicalAxes physical_axes = ToPhysicalAxes(contained_axes, writing_mode); - StyleRecalcChange::Propagate propagate = - StyleRecalcChange::kRecalcContainerQueryDependent; + StyleRecalcChange change; auto* evaluator = container.GetContainerQueryEvaluator(); DCHECK(evaluator); - auto change = evaluator->ContainerChanged(physical_size, physical_axes); - if (change == ContainerQueryEvaluator::Change::kNone) - return; - if (change == ContainerQueryEvaluator::Change::kNamed) - propagate = StyleRecalcChange::kRecalcDescendantContainerQueryDependent; + + switch (evaluator->ContainerChanged(physical_size, physical_axes)) { + case ContainerQueryEvaluator::Change::kNone: + return; + case ContainerQueryEvaluator::Change::kUnnamed: + change = change.ForceRecalcContainer(); + break; + case ContainerQueryEvaluator::Change::kNamed: + change = change.ForceRecalcDescendantContainers(); + break; + } + + // The container node must not need recalc at this point. + DCHECK(!StyleRecalcChange().ShouldRecalcStyleFor(container)); + + // If the container itself depends on an outer container, then its + // DependsOnContainerQueries flag will be set, and we would recalc its + // style (due to ForceRecalcContainer/ForceRecalcDescendantContainers). + // This is not necessary, hence we suppress recalc for this element. + change = change.SuppressRecalc(); NthIndexCache nth_index_cache(GetDocument()); style_recalc_root_.Update(nullptr, &container); - RecalcStyle({propagate}, StyleRecalcContext()); + RecalcStyle(change, StyleRecalcContext()); // Nodes are marked for whitespace reattachment for DOM removal only. This set // should have been cleared before layout.
diff --git a/third_party/blink/renderer/core/css/style_recalc.cc b/third_party/blink/renderer/core/css/style_recalc.cc index e97aae6..bc6f80f 100644 --- a/third_party/blink/renderer/core/css/style_recalc.cc +++ b/third_party/blink/renderer/core/css/style_recalc.cc
@@ -25,6 +25,8 @@ } bool StyleRecalcChange::ShouldRecalcStyleFor(const Node& node) const { + if (flags_ & kSuppressRecalc) + return false; if (RecalcChildren()) return true; if (node.NeedsStyleRecalc()) @@ -58,16 +60,12 @@ StyleRecalcChange::Flags StyleRecalcChange::FlagsForChildren( const Element& element) const { - // kRecalc[Descendant]ContainerQueryDependent means we are at the container - // root for a container query recalc. - if (propagate_ == kRecalcContainerQueryDependent) - return flags_ | kRecalcContainer; - if (propagate_ == kRecalcDescendantContainerQueryDependent) - return flags_ | kRecalcDescendantContainers; - Flags result = flags_; - if ((result & kRecalcContainerFlags) == kRecalcContainer) { + // Note that kSuppressRecalc is used on the root container for the + // interleaved style recalc. + if ((result & (kRecalcContainerFlags | kSuppressRecalc)) == + kRecalcContainer) { // Don't traverse into children if we hit a descendant container while // recalculating container queries. If the queries for this container also // changes, we will enter another container query recalc for this subtree @@ -77,6 +75,8 @@ result &= ~kRecalcContainer; } + result &= ~kSuppressRecalc; + return result; }
diff --git a/third_party/blink/renderer/core/css/style_recalc.h b/third_party/blink/renderer/core/css/style_recalc.h index 1a35fe1..ea6e5cd 100644 --- a/third_party/blink/renderer/core/css/style_recalc.h +++ b/third_party/blink/renderer/core/css/style_recalc.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_STYLE_RECALC_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_STYLE_RECALC_H_ +#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" namespace blink { @@ -16,7 +17,7 @@ // Class for keeping track of the need for traversing down flat tree children, // recompute their computed styles, and marking nodes for layout tree re- // attachment during the style recalc phase. -class StyleRecalcChange { +class CORE_EXPORT StyleRecalcChange { private: enum Flag { kNoFlags = 0, @@ -28,6 +29,9 @@ kRecalcDescendantContainers = 1 << 1, // If set, need to reattach layout tree. kReattach = 1 << 2, + // If set, will prevent style recalc for the node passed to + // ShouldRecalcStyleFor. This flag is lost when ForChildren is called. + kSuppressRecalc = 1 << 3, }; using Flags = uint8_t; @@ -41,14 +45,6 @@ // Need to traverse children in display:none or non-slotted/distributed // children of shadow hosts to clear ensured computed styles. kClearEnsured, - // Need to traverse descendants to invalidate style for container queries. - // This value is passed in for the container itself, it will translate into - // recalc_container_query_dependent_=true for descendants. We should not - // recalc style for the container itself. - kRecalcContainerQueryDependent, - // Like kRecalcContainerQueryDependent, but we do not stop traversal on - // descendant containers. - kRecalcDescendantContainerQueryDependent, // Need to update existence and style for pseudo elements. kUpdatePseudoElements, // Need to recalculate style for children for inheritance. All changed @@ -85,6 +81,15 @@ StyleRecalcChange ForceReattachLayoutTree() const { return {propagate_, flags_ | kReattach}; } + StyleRecalcChange ForceRecalcContainer() const { + return {propagate_, flags_ | kRecalcContainer}; + } + StyleRecalcChange ForceRecalcDescendantContainers() const { + return {propagate_, flags_ | kRecalcDescendantContainers}; + } + StyleRecalcChange SuppressRecalc() const { + return {propagate_, flags_ | kSuppressRecalc}; + } bool ReattachLayoutTree() const { return flags_ & kReattach; } bool RecalcChildren() const { return propagate_ > kUpdatePseudoElements; }
diff --git a/third_party/blink/renderer/core/css/style_recalc_test.cc b/third_party/blink/renderer/core/css/style_recalc_test.cc new file mode 100644 index 0000000..8c38894 --- /dev/null +++ b/third_party/blink/renderer/core/css/style_recalc_test.cc
@@ -0,0 +1,38 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/css/style_recalc.h" + +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/dom/dom_token_list.h" +#include "third_party/blink/renderer/core/dom/element.h" +#include "third_party/blink/renderer/core/testing/page_test_base.h" + +namespace blink { + +class StyleRecalcTest : public PageTestBase {}; + +TEST_F(StyleRecalcTest, SuppressRecalc) { + SetBodyInnerHTML(R"HTML( + <style> + .foo { color: green; } + </style> + <div id=element></div> + )HTML"); + + Element* element = GetDocument().getElementById("element"); + ASSERT_TRUE(element); + element->classList().Add("foo"); + + EXPECT_TRUE(StyleRecalcChange().ShouldRecalcStyleFor(*element)); + EXPECT_FALSE( + StyleRecalcChange().SuppressRecalc().ShouldRecalcStyleFor(*element)); + // The flag should be lost when ForChildren is called. + EXPECT_TRUE(StyleRecalcChange() + .SuppressRecalc() + .ForChildren(*element) + .ShouldRecalcStyleFor(*element)); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 78b64c6..cb634b3 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -41,7 +41,6 @@ #include "base/auto_reset.h" #include "base/containers/contains.h" #include "base/debug/dump_without_crashing.h" -#include "base/macros.h" #include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "cc/input/overscroll_behavior.h" @@ -2630,6 +2629,7 @@ DCHECK_EQ(lifecycle_.GetState(), DocumentLifecycle::kInactive); DCHECK(!ax_object_cache_ || this != &AXObjectCacheOwner()); + UpdateForcedColors(); layout_view_ = new LayoutView(this); SetLayoutObject(layout_view_); @@ -2654,8 +2654,6 @@ // ExecutionContextLifecycleObserver::contextDestroyed wouldn't be fired. network_state_observer_ = MakeGarbageCollected<NetworkStateObserver>(GetExecutionContext()); - - UpdateForcedColors(); } void Document::Shutdown() {
diff --git a/third_party/blink/renderer/core/dom/events/event_queue.cc b/third_party/blink/renderer/core/dom/events/event_queue.cc index 7fa5be79..75e38e3 100644 --- a/third_party/blink/renderer/core/dom/events/event_queue.cc +++ b/third_party/blink/renderer/core/dom/events/event_queue.cc
@@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/dom/events/event_queue.h" -#include "base/macros.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h"
diff --git a/third_party/blink/renderer/core/dom/id_target_observer_registry.h b/third_party/blink/renderer/core/dom/id_target_observer_registry.h index 997eb12..4d8b18ed 100644 --- a/third_party/blink/renderer/core/dom/id_target_observer_registry.h +++ b/third_party/blink/renderer/core/dom/id_target_observer_registry.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ID_TARGET_OBSERVER_REGISTRY_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_DOM_ID_TARGET_OBSERVER_REGISTRY_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h index b5d2f13..55de04c 100644 --- a/third_party/blink/renderer/core/dom/node.h +++ b/third_party/blink/renderer/core/dom/node.h
@@ -27,7 +27,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_DOM_NODE_H_ #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/core/dom/presentation_attribute_style.cc b/third_party/blink/renderer/core/dom/presentation_attribute_style.cc index e03b0d6..bda69a6 100644 --- a/third_party/blink/renderer/core/dom/presentation_attribute_style.cc +++ b/third_party/blink/renderer/core/dom/presentation_attribute_style.cc
@@ -32,7 +32,6 @@ #include <algorithm> -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_property_value_set.h" #include "third_party/blink/renderer/core/dom/attribute.h" #include "third_party/blink/renderer/core/dom/element.h"
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client.cc b/third_party/blink/renderer/core/editing/caret_display_item_client.cc index faa4373b..cdafeca 100644 --- a/third_party/blink/renderer/core/editing/caret_display_item_client.cc +++ b/third_party/blink/renderer/core/editing/caret_display_item_client.cc
@@ -245,15 +245,20 @@ GraphicsContext& context, const PhysicalOffset& paint_offset, DisplayItem::Type display_item_type) const { - if (DrawingRecorder::UseCachedDrawingIfPossible(context, *this, - display_item_type)) - return; - PhysicalRect drawing_rect = local_rect_; drawing_rect.Move(paint_offset); - DrawingRecorder recorder(context, *this, display_item_type, - EnclosingIntRect(drawing_rect)); + // When caret is in text-combine box with scaling, |context| is already + // associated to drawing record to apply affine transform. + absl::optional<DrawingRecorder> recorder; + if (LIKELY(!context.InDrawingRecorder())) { + if (DrawingRecorder::UseCachedDrawingIfPossible(context, *this, + display_item_type)) + return; + recorder.emplace(context, *this, display_item_type, + EnclosingIntRect(drawing_rect)); + } + IntRect paint_rect = PixelSnappedIntRect(drawing_rect); context.FillRect(paint_rect, is_visible_if_active_ ? color_ : Color(), DarkModeFilter::ElementRole::kText);
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client.h b/third_party/blink/renderer/core/editing/caret_display_item_client.h index 274879b..0a83ae0 100644 --- a/third_party/blink/renderer/core/editing/caret_display_item_client.h +++ b/third_party/blink/renderer/core/editing/caret_display_item_client.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_CARET_DISPLAY_ITEM_CLIENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_CARET_DISPLAY_ITEM_CLIENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/forward.h" #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" @@ -44,6 +43,8 @@ class CORE_EXPORT CaretDisplayItemClient final : public DisplayItemClient { public: CaretDisplayItemClient(); + CaretDisplayItemClient(const CaretDisplayItemClient&) = delete; + CaretDisplayItemClient& operator=(const CaretDisplayItemClient&) = delete; ~CaretDisplayItemClient() override; // Called indirectly from LayoutBlock::willBeDestroyed(). @@ -110,8 +111,6 @@ bool needs_paint_invalidation_ = false; bool is_visible_if_active_ = true; - - DISALLOW_COPY_AND_ASSIGN(CaretDisplayItemClient); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc b/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc index 179b7548..fd002132 100644 --- a/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc +++ b/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc
@@ -525,6 +525,10 @@ // 'beforeinput' event handler may destroy target frame. if (frame.GetDocument()->GetFrame() != frame) return true; + + // No DOM mutation if EditContext is active. + if (frame.GetInputMethodController().GetActiveEditContext()) + return true; } PasteAsPlainTextFromClipboard(frame, source);
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_options.h b/third_party/blink/renderer/core/editing/commands/delete_selection_options.h index aa569f16..556b04c 100644 --- a/third_party/blink/renderer/core/editing/commands/delete_selection_options.h +++ b/third_party/blink/renderer/core/editing/commands/delete_selection_options.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_DELETE_SELECTION_OPTIONS_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_DELETE_SELECTION_OPTIONS_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/core/editing/commands/editing_state.h b/third_party/blink/renderer/core/editing/commands/editing_state.h index b8559cfb..e37b62a 100644 --- a/third_party/blink/renderer/core/editing/commands/editing_state.h +++ b/third_party/blink/renderer/core/editing/commands/editing_state.h
@@ -6,7 +6,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_EDITING_STATE_H_ #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/core/editing/commands/editor_command.cc b/third_party/blink/renderer/core/editing/commands/editor_command.cc index 5eb6e8ab..e5e6d31 100644 --- a/third_party/blink/renderer/core/editing/commands/editor_command.cc +++ b/third_party/blink/renderer/core/editing/commands/editor_command.cc
@@ -1963,7 +1963,6 @@ case EditingCommandType::kInsertBacktab: case EditingCommandType::kInsertNewline: case EditingCommandType::kInsertLineBreak: - case EditingCommandType::kPasteAndMatchStyle: // 1) BeforeInput event only, ex ctrl+B or <enter>. return true; case EditingCommandType::kDeleteBackward:
diff --git a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc index 12a6eddbc..3c0090f 100644 --- a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc +++ b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
@@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/editing/commands/replace_selection_command.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/css/css_property_value_set.h" #include "third_party/blink/renderer/core/css/css_style_declaration.h"
diff --git a/third_party/blink/renderer/core/editing/commands/selection_for_undo_step.h b/third_party/blink/renderer/core/editing/commands/selection_for_undo_step.h index 08e33fa..fa96fa03 100644 --- a/third_party/blink/renderer/core/editing/commands/selection_for_undo_step.h +++ b/third_party/blink/renderer/core/editing/commands/selection_for_undo_step.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_SELECTION_FOR_UNDO_STEP_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_SELECTION_FOR_UNDO_STEP_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/editing/forward.h" #include "third_party/blink/renderer/core/editing/position.h" #include "third_party/blink/renderer/core/editing/text_affinity.h"
diff --git a/third_party/blink/renderer/core/editing/commands/undo_stack.h b/third_party/blink/renderer/core/editing/commands/undo_stack.h index c017ec7..1f685215 100644 --- a/third_party/blink/renderer/core/editing/commands/undo_stack.h +++ b/third_party/blink/renderer/core/editing/commands/undo_stack.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_UNDO_STACK_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMMANDS_UNDO_STACK_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -49,6 +48,8 @@ public: UndoStack(); + UndoStack(const UndoStack&) = delete; + UndoStack& operator=(const UndoStack&) = delete; void RegisterUndoStep(UndoStep*); void RegisterRedoStep(UndoStep*); @@ -88,8 +89,6 @@ UndoStepStack undo_stack_; UndoStepStack redo_stack_; bool in_redo_ = false; - - DISALLOW_COPY_AND_ASSIGN(UndoStack); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/drag_caret.h b/third_party/blink/renderer/core/editing/drag_caret.h index b0d3925..05855fe 100644 --- a/third_party/blink/renderer/core/editing/drag_caret.h +++ b/third_party/blink/renderer/core/editing/drag_caret.h
@@ -29,7 +29,6 @@ #include <memory> -#include "base/macros.h" #include "third_party/blink/renderer/core/dom/synchronous_mutation_observer.h" #include "third_party/blink/renderer/core/editing/caret_display_item_client.h" #include "third_party/blink/renderer/core/editing/position_with_affinity.h" @@ -45,6 +44,8 @@ public SynchronousMutationObserver { public: DragCaret(); + DragCaret(const DragCaret&) = delete; + DragCaret& operator=(const DragCaret&) = delete; virtual ~DragCaret(); // Paint invalidation methods delegating to CaretDisplayItemClient. @@ -74,8 +75,6 @@ PositionWithAffinity position_; const std::unique_ptr<CaretDisplayItemClient> display_item_client_; - - DISALLOW_COPY_AND_ASSIGN(DragCaret); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/editor.cc b/third_party/blink/renderer/core/editing/editor.cc index 7f32503..2e4c534 100644 --- a/third_party/blink/renderer/core/editing/editor.cc +++ b/third_party/blink/renderer/core/editing/editor.cc
@@ -360,6 +360,10 @@ if (frame_->GetDocument()->GetFrame() != frame_) return false; + // No DOM mutation if EditContext is active. + if (frame_->GetInputMethodController().GetActiveEditContext()) + return true; + if (should_delete && drag_source->isConnected()) { DeleteSelectionWithSmartDelete(delete_mode, InputEvent::InputType::kDeleteByDrag, @@ -394,6 +398,10 @@ if (frame_->GetDocument()->GetFrame() != frame_) return false; + // No DOM mutation if EditContext is active. + if (frame_->GetInputMethodController().GetActiveEditContext()) + return true; + if (should_insert && drop_target->isConnected()) ReplaceSelectionAfterDragging(fragment, insert_mode, drag_source_type);
diff --git a/third_party/blink/renderer/core/editing/editor.h b/third_party/blink/renderer/core/editing/editor.h index 8f8d1abd..b9bc273 100644 --- a/third_party/blink/renderer/core/editing/editor.h +++ b/third_party/blink/renderer/core/editing/editor.h
@@ -28,7 +28,6 @@ #include <memory> -#include "base/macros.h" #include "mojo/public/mojom/base/text_direction.mojom-blink-forward.h" #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h" #include "third_party/blink/public/web/web_local_frame_client.h" @@ -67,6 +66,8 @@ class CORE_EXPORT Editor final : public GarbageCollected<Editor> { public: explicit Editor(LocalFrame&); + Editor(const Editor&) = delete; + Editor& operator=(const Editor&) = delete; ~Editor(); CompositeEditCommand* LastEditCommand() { return last_edit_command_.Get(); } @@ -251,8 +252,6 @@ FrameSelection& GetFrameSelection() const; bool HandleEditingKeyboardEvent(KeyboardEvent*); - - DISALLOW_COPY_AND_ASSIGN(Editor); }; inline void Editor::SetStartNewKillRingSequence(bool flag) {
diff --git a/third_party/blink/renderer/core/editing/element_inner_text.cc b/third_party/blink/renderer/core/editing/element_inner_text.cc index 2571bab..a067358 100644 --- a/third_party/blink/renderer/core/editing/element_inner_text.cc +++ b/third_party/blink/renderer/core/editing/element_inner_text.cc
@@ -43,6 +43,9 @@ public: ElementInnerTextCollector() = default; + ElementInnerTextCollector(const ElementInnerTextCollector&) = delete; + ElementInnerTextCollector& operator=(const ElementInnerTextCollector&) = + delete; String RunOn(const Element& element); @@ -51,6 +54,8 @@ class Result final { public: Result() = default; + Result(const Result&) = delete; + Result& operator=(const Result&) = delete; void EmitChar16(UChar code_point); void EmitNewline(); @@ -64,8 +69,6 @@ StringBuilder builder_; int required_line_break_count_ = 0; - - DISALLOW_COPY_AND_ASSIGN(Result); }; static bool HasDisplayContentsStyle(const Node& node); @@ -87,8 +90,6 @@ // Result character buffer. Result result_; - - DISALLOW_COPY_AND_ASSIGN(ElementInnerTextCollector); }; String ElementInnerTextCollector::RunOn(const Element& element) {
diff --git a/third_party/blink/renderer/core/editing/finder/text_finder.h b/third_party/blink/renderer/core/editing/finder/text_finder.h index db5ded5..ca26d049 100644 --- a/third_party/blink/renderer/core/editing/finder/text_finder.h +++ b/third_party/blink/renderer/core/editing/finder/text_finder.h
@@ -32,7 +32,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_FINDER_TEXT_FINDER_H_ #include "base/cancelable_callback.h" -#include "base/macros.h" #include "third_party/blink/public/mojom/frame/find_in_page.mojom-blink.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/renderer/core/core_export.h" @@ -118,6 +117,8 @@ bool finished_whole_request); explicit TextFinder(WebLocalFrameImpl& owner_frame); + TextFinder(const TextFinder&) = delete; + TextFinder& operator=(const TextFinder&) = delete; class FindMatch { DISALLOW_NEW(); @@ -278,8 +279,6 @@ bool find_match_rects_are_valid_; base::CancelableOnceClosure scroll_task_; - - DISALLOW_COPY_AND_ASSIGN(TextFinder); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/frame_caret.h b/third_party/blink/renderer/core/editing/frame_caret.h index e8aaf85..a4f705b 100644 --- a/third_party/blink/renderer/core/editing/frame_caret.h +++ b/third_party/blink/renderer/core/editing/frame_caret.h
@@ -52,6 +52,8 @@ class CORE_EXPORT FrameCaret final : public GarbageCollected<FrameCaret> { public: FrameCaret(LocalFrame&, const SelectionEditor&); + FrameCaret(const FrameCaret&) = delete; + FrameCaret& operator=(const FrameCaret&) = delete; ~FrameCaret(); bool IsActive() const; @@ -105,8 +107,6 @@ bool is_caret_enabled_ = false; bool should_show_caret_ = false; bool is_caret_blinking_suspended_ = false; - - DISALLOW_COPY_AND_ASSIGN(FrameCaret); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/frame_selection.h b/third_party/blink/renderer/core/editing/frame_selection.h index 79333a8..1a576b7 100644 --- a/third_party/blink/renderer/core/editing/frame_selection.h +++ b/third_party/blink/renderer/core/editing/frame_selection.h
@@ -30,7 +30,6 @@ #include <memory> #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/synchronous_mutation_observer.h" @@ -132,6 +131,8 @@ public SynchronousMutationObserver { public: explicit FrameSelection(LocalFrame&); + FrameSelection(const FrameSelection&) = delete; + FrameSelection& operator=(const FrameSelection&) = delete; ~FrameSelection(); bool IsAvailable() const; @@ -342,8 +343,6 @@ std::unique_ptr<GranularityStrategy> granularity_strategy_; const Member<FrameCaret> frame_caret_; - - DISALLOW_COPY_AND_ASSIGN(FrameSelection); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/ime/edit_context.h b/third_party/blink/renderer/core/editing/ime/edit_context.h index 6b40d5b8..36dd4ea 100644 --- a/third_party/blink/renderer/core/editing/ime/edit_context.h +++ b/third_party/blink/renderer/core/editing/ime/edit_context.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_EDIT_CONTEXT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_EDIT_CONTEXT_H_ -#include "base/macros.h" #include "third_party/blink/public/platform/web_text_input_mode.h" #include "third_party/blink/public/platform/web_text_input_type.h" #include "third_party/blink/public/web/web_input_method_controller.h"
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc index f8bbf52f..11fdb07 100644 --- a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc +++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
@@ -26,6 +26,7 @@ #include "third_party/blink/renderer/core/editing/ime/input_method_controller.h" +#include "base/macros.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h"
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.h b/third_party/blink/renderer/core/editing/ime/input_method_controller.h index 03ff06b4..79a7230 100644 --- a/third_party/blink/renderer/core/editing/ime/input_method_controller.h +++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.h
@@ -27,7 +27,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_INPUT_METHOD_CONTROLLER_H_ #include "base/gtest_prod_util.h" -#include "base/macros.h" #include "third_party/blink/public/platform/web_text_input_info.h" #include "third_party/blink/public/platform/web_text_input_type.h" #include "third_party/blink/renderer/core/core_export.h" @@ -62,6 +61,8 @@ }; explicit InputMethodController(LocalDOMWindow&, LocalFrame&); + InputMethodController(const InputMethodController&) = delete; + InputMethodController& operator=(const InputMethodController&) = delete; ~InputMethodController() override; void Trace(Visitor*) const override; @@ -258,8 +259,6 @@ InputModeOfFocusedElement); FRIEND_TEST_ALL_PREFIXES(InputMethodControllerTest, VirtualKeyboardPolicyOfFocusedElement); - - DISALLOW_COPY_AND_ASSIGN(InputMethodController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/ime/text_format_update_event.h b/third_party/blink/renderer/core/editing/ime/text_format_update_event.h index 3f01293..4a0a880 100644 --- a/third_party/blink/renderer/core/editing/ime/text_format_update_event.h +++ b/third_party/blink/renderer/core/editing/ime/text_format_update_event.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_TEXT_FORMAT_UPDATE_EVENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_TEXT_FORMAT_UPDATE_EVENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event.h"
diff --git a/third_party/blink/renderer/core/editing/ime/text_update_event.h b/third_party/blink/renderer/core/editing/ime/text_update_event.h index c651b3a..b7658afd 100644 --- a/third_party/blink/renderer/core/editing/ime/text_update_event.h +++ b/third_party/blink/renderer/core/editing/ime/text_update_event.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_TEXT_UPDATE_EVENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_IME_TEXT_UPDATE_EVENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event.h"
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h b/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h index 24a77ba..7d2e109e 100644 --- a/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h +++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_ITERATORS_TEXT_ITERATOR_BEHAVIOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_ITERATORS_TEXT_ITERATOR_BEHAVIOR_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -106,6 +105,8 @@ public: explicit Builder(const TextIteratorBehavior&); Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; ~Builder(); TextIteratorBehavior Build(); @@ -131,8 +132,6 @@ private: TextIteratorBehavior behavior_; - - DISALLOW_COPY_AND_ASSIGN(Builder); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_text_node_handler.h b/third_party/blink/renderer/core/editing/iterators/text_iterator_text_node_handler.h index 918f263..3faf137 100644 --- a/third_party/blink/renderer/core/editing/iterators/text_iterator_text_node_handler.h +++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_text_node_handler.h
@@ -26,6 +26,9 @@ public: TextIteratorTextNodeHandler(const TextIteratorBehavior&, TextIteratorTextState*); + TextIteratorTextNodeHandler(const TextIteratorTextNodeHandler&) = delete; + TextIteratorTextNodeHandler& operator=(const TextIteratorTextNodeHandler&) = + delete; const Text* GetNode() const { return text_node_; } @@ -111,8 +114,6 @@ // Contains state of emitted text. TextIteratorTextState& text_state_; - - DISALLOW_COPY_AND_ASSIGN(TextIteratorTextNodeHandler); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_text_state.h b/third_party/blink/renderer/core/editing/iterators/text_iterator_text_state.h index 29b509c..366a8af 100644 --- a/third_party/blink/renderer/core/editing/iterators/text_iterator_text_state.h +++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_text_state.h
@@ -44,6 +44,8 @@ public: explicit TextIteratorTextState(const TextIteratorBehavior&); + TextIteratorTextState(const TextIteratorTextState&) = delete; + TextIteratorTextState& operator=(const TextIteratorTextState&) = delete; // Return properties of the current text. unsigned length() const { return text_length_; } @@ -157,8 +159,6 @@ // any other content bool has_emitted_ = false; UChar last_character_ = 0; - - DISALLOW_COPY_AND_ASSIGN(TextIteratorTextState); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.cc b/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.cc index 5b4cafe..d7728cc 100644 --- a/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.cc +++ b/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.cc
@@ -28,7 +28,6 @@ #include "third_party/blink/renderer/core/editing/iterators/text_searcher_icu.h" #include <unicode/usearch.h> -#include "base/macros.h" #include "third_party/blink/renderer/platform/text/character.h" #include "third_party/blink/renderer/platform/text/text_boundaries.h" #include "third_party/blink/renderer/platform/text/text_break_iterator_internal_icu.h" @@ -61,6 +60,9 @@ STACK_ALLOCATED(); public: + ICULockableSearcher(const ICULockableSearcher&) = delete; + ICULockableSearcher& operator=(const ICULockableSearcher&) = delete; + static UStringSearch* AcquireSearcher() { Instance().lock(); return Instance().searcher_; @@ -95,8 +97,6 @@ #if DCHECK_IS_ON() bool locked_ = false; #endif - - DISALLOW_COPY_AND_ASSIGN(ICULockableSearcher); }; } // namespace
diff --git a/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.h b/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.h index 1f251e9..016d1a9 100644 --- a/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.h +++ b/third_party/blink/renderer/core/editing/iterators/text_searcher_icu.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_ITERATORS_TEXT_SEARCHER_ICU_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_ITERATORS_TEXT_SEARCHER_ICU_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/finder/find_options.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -26,6 +25,8 @@ public: TextSearcherICU(); + TextSearcherICU(const TextSearcherICU&) = delete; + TextSearcherICU& operator=(const TextSearcherICU&) = delete; ~TextSearcherICU(); void SetPattern(const StringView& pattern, FindOptions options); @@ -44,8 +45,6 @@ wtf_size_t text_length_ = 0; Vector<UChar> normalized_search_text_; FindOptions options_; - - DISALLOW_COPY_AND_ASSIGN(TextSearcherICU); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/kill_ring.h b/third_party/blink/renderer/core/editing/kill_ring.h index 5a7977c..bc48990 100644 --- a/third_party/blink/renderer/core/editing/kill_ring.h +++ b/third_party/blink/renderer/core/editing/kill_ring.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_KILL_RING_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_KILL_RING_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -37,13 +36,13 @@ public: KillRing() = default; + KillRing(const KillRing&) = delete; + KillRing& operator=(const KillRing&) = delete; void Append(const String&); void Prepend(const String&); String Yank(); void StartNewSequence(); void SetToYankedState(); - - DISALLOW_COPY_AND_ASSIGN(KillRing); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/layout_selection.cc b/third_party/blink/renderer/core/editing/layout_selection.cc index ae7cc6e7..11f94b6d 100644 --- a/third_party/blink/renderer/core/editing/layout_selection.cc +++ b/third_party/blink/renderer/core/editing/layout_selection.cc
@@ -173,11 +173,11 @@ selected_map = std::move(other.selected_map); } + OldSelectedNodes(const OldSelectedNodes&) = delete; + OldSelectedNodes& operator=(const OldSelectedNodes&) = delete; + SelectionPaintRange* paint_range; HeapHashMap<Member<const Node>, SelectionState> selected_map; - - private: - DISALLOW_COPY_AND_ASSIGN(OldSelectedNodes); }; std::ostream& operator<<(std::ostream&, const OldSelectedNodes&); @@ -200,6 +200,10 @@ selected_objects = std::move(other.selected_objects); } + NewPaintRangeAndSelectedNodes(const NewPaintRangeAndSelectedNodes&) = delete; + NewPaintRangeAndSelectedNodes& operator=( + const NewPaintRangeAndSelectedNodes&) = delete; + void AssertSanity() const { #if DCHECK_IS_ON() paint_range->AssertSanity(); @@ -214,9 +218,6 @@ SelectionPaintRange* paint_range; HeapHashSet<Member<const Node>> selected_objects; - - private: - DISALLOW_COPY_AND_ASSIGN(NewPaintRangeAndSelectedNodes); }; std::ostream& operator<<(std::ostream&, const NewPaintRangeAndSelectedNodes&);
diff --git a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker.h b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker.h index fdffb81..06c63806 100644 --- a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker.h +++ b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker.h
@@ -21,12 +21,11 @@ ui::mojom::ImeTextSpanUnderlineStyle underline_style, Color text_color, Color background_color); + ActiveSuggestionMarker(const ActiveSuggestionMarker&) = delete; + ActiveSuggestionMarker& operator=(const ActiveSuggestionMarker&) = delete; // DocumentMarker implementations MarkerType GetType() const final; - - private: - DISALLOW_COPY_AND_ASSIGN(ActiveSuggestionMarker); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl.h index d4e3665..438a636 100644 --- a/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/active_suggestion_marker_list_impl.h
@@ -19,6 +19,10 @@ : public DocumentMarkerList { public: ActiveSuggestionMarkerListImpl() = default; + ActiveSuggestionMarkerListImpl(const ActiveSuggestionMarkerListImpl&) = + delete; + ActiveSuggestionMarkerListImpl& operator=( + const ActiveSuggestionMarkerListImpl&) = delete; // DocumentMarkerList implementations DocumentMarker::MarkerType MarkerType() const final; @@ -46,8 +50,6 @@ private: HeapVector<Member<DocumentMarker>> markers_; - - DISALLOW_COPY_AND_ASSIGN(ActiveSuggestionMarkerListImpl); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/composition_marker.h b/third_party/blink/renderer/core/editing/markers/composition_marker.h index b3ff246a..de40c9a 100644 --- a/third_party/blink/renderer/core/editing/markers/composition_marker.h +++ b/third_party/blink/renderer/core/editing/markers/composition_marker.h
@@ -23,12 +23,11 @@ ui::mojom::ImeTextSpanUnderlineStyle, Color text_color, Color background_color); + CompositionMarker(const CompositionMarker&) = delete; + CompositionMarker& operator=(const CompositionMarker&) = delete; // DocumentMarker implementations MarkerType GetType() const final; - - private: - DISALLOW_COPY_AND_ASSIGN(CompositionMarker); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl.h index a47b6e05..155ee0e0 100644 --- a/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/composition_marker_list_impl.h
@@ -16,6 +16,9 @@ class CORE_EXPORT CompositionMarkerListImpl final : public DocumentMarkerList { public: CompositionMarkerListImpl() = default; + CompositionMarkerListImpl(const CompositionMarkerListImpl&) = delete; + CompositionMarkerListImpl& operator=(const CompositionMarkerListImpl&) = + delete; // DocumentMarkerList implementations DocumentMarker::MarkerType MarkerType() const final; @@ -43,8 +46,6 @@ private: HeapVector<Member<DocumentMarker>> markers_; - - DISALLOW_COPY_AND_ASSIGN(CompositionMarkerListImpl); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker.h b/third_party/blink/renderer/core/editing/markers/document_marker.h index 504e24cb..32ba807 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker.h +++ b/third_party/blink/renderer/core/editing/markers/document_marker.h
@@ -144,6 +144,8 @@ unsigned mask_; }; + DocumentMarker(const DocumentMarker&) = delete; + DocumentMarker& operator=(const DocumentMarker&) = delete; virtual ~DocumentMarker(); virtual MarkerType GetType() const = 0; @@ -174,8 +176,6 @@ private: unsigned start_offset_; unsigned end_offset_; - - DISALLOW_COPY_AND_ASSIGN(DocumentMarker); }; using DocumentMarkerVector = HeapVector<Member<DocumentMarker>>;
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h index 8f5d104..31bcca7 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h +++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
@@ -32,7 +32,6 @@ #include <utility> #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/synchronous_mutation_observer.h" #include "third_party/blink/renderer/core/editing/forward.h" @@ -56,6 +55,8 @@ public SynchronousMutationObserver { public: explicit DocumentMarkerController(Document&); + DocumentMarkerController(const DocumentMarkerController&) = delete; + DocumentMarkerController& operator=(const DocumentMarkerController&) = delete; void Clear(); void AddSpellingMarker(const EphemeralRange&, @@ -210,8 +211,6 @@ // without going through the map. DocumentMarker::MarkerTypes possibly_existing_marker_types_; const Member<Document> document_; - - DISALLOW_COPY_AND_ASSIGN(DocumentMarkerController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_list.h b/third_party/blink/renderer/core/editing/markers/document_marker_list.h index 3ca83a28..81da5a7 100644 --- a/third_party/blink/renderer/core/editing/markers/document_marker_list.h +++ b/third_party/blink/renderer/core/editing/markers/document_marker_list.h
@@ -21,6 +21,8 @@ class CORE_EXPORT DocumentMarkerList : public GarbageCollected<DocumentMarkerList> { public: + DocumentMarkerList(const DocumentMarkerList&) = delete; + DocumentMarkerList& operator=(const DocumentMarkerList&) = delete; virtual ~DocumentMarkerList(); // Returns the single marker type supported by the list implementation. @@ -65,9 +67,6 @@ protected: DocumentMarkerList(); - - private: - DISALLOW_COPY_AND_ASSIGN(DocumentMarkerList); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/grammar_marker.h b/third_party/blink/renderer/core/editing/markers/grammar_marker.h index a195077..77d4e13 100644 --- a/third_party/blink/renderer/core/editing/markers/grammar_marker.h +++ b/third_party/blink/renderer/core/editing/markers/grammar_marker.h
@@ -18,12 +18,12 @@ GrammarMarker(unsigned start_offset, unsigned end_offset, const String& description); + GrammarMarker(const GrammarMarker&) = delete; + GrammarMarker& operator=(const GrammarMarker&) = delete; private: // DocumentMarker implementations MarkerType GetType() const final; - - DISALLOW_COPY_AND_ASSIGN(GrammarMarker); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/grammar_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/grammar_marker_list_impl.h index 26e7ef8..82714ba2 100644 --- a/third_party/blink/renderer/core/editing/markers/grammar_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/grammar_marker_list_impl.h
@@ -14,11 +14,10 @@ : public SpellCheckMarkerListImpl { public: GrammarMarkerListImpl() = default; + GrammarMarkerListImpl(const GrammarMarkerListImpl&) = delete; + GrammarMarkerListImpl& operator=(const GrammarMarkerListImpl&) = delete; DocumentMarker::MarkerType MarkerType() const final; - - private: - DISALLOW_COPY_AND_ASSIGN(GrammarMarkerListImpl); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/spell_check_marker.h b/third_party/blink/renderer/core/editing/markers/spell_check_marker.h index 09bdfc43..7aff420 100644 --- a/third_party/blink/renderer/core/editing/markers/spell_check_marker.h +++ b/third_party/blink/renderer/core/editing/markers/spell_check_marker.h
@@ -19,13 +19,13 @@ SpellCheckMarker(unsigned start_offset, unsigned end_offset, const String& description); + SpellCheckMarker(const SpellCheckMarker&) = delete; + SpellCheckMarker& operator=(const SpellCheckMarker&) = delete; const String& Description() const { return description_; } private: const String description_; - - DISALLOW_COPY_AND_ASSIGN(SpellCheckMarker); }; bool CORE_EXPORT IsSpellCheckMarker(const DocumentMarker&);
diff --git a/third_party/blink/renderer/core/editing/markers/spell_check_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/spell_check_marker_list_impl.h index e795b9c..eb31ae9 100644 --- a/third_party/blink/renderer/core/editing/markers/spell_check_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/spell_check_marker_list_impl.h
@@ -17,6 +17,9 @@ // to do this efficiently. class CORE_EXPORT SpellCheckMarkerListImpl : public DocumentMarkerList { public: + SpellCheckMarkerListImpl(const SpellCheckMarkerListImpl&) = delete; + SpellCheckMarkerListImpl& operator=(const SpellCheckMarkerListImpl&) = delete; + // DocumentMarkerList implementations bool IsEmpty() const final; @@ -49,8 +52,6 @@ private: HeapVector<Member<DocumentMarker>> markers_; - - DISALLOW_COPY_AND_ASSIGN(SpellCheckMarkerListImpl); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/spelling_marker.h b/third_party/blink/renderer/core/editing/markers/spelling_marker.h index efe0bfa..e59f09d 100644 --- a/third_party/blink/renderer/core/editing/markers/spelling_marker.h +++ b/third_party/blink/renderer/core/editing/markers/spelling_marker.h
@@ -18,12 +18,12 @@ SpellingMarker(unsigned start_offset, unsigned end_offset, const String& description); + SpellingMarker(const SpellingMarker&) = delete; + SpellingMarker& operator=(const SpellingMarker&) = delete; private: // DocumentMarker implementations MarkerType GetType() const final; - - DISALLOW_COPY_AND_ASSIGN(SpellingMarker); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/spelling_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/spelling_marker_list_impl.h index 3462d86d..4a5ffda 100644 --- a/third_party/blink/renderer/core/editing/markers/spelling_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/spelling_marker_list_impl.h
@@ -14,11 +14,10 @@ : public SpellCheckMarkerListImpl { public: SpellingMarkerListImpl() = default; + SpellingMarkerListImpl(const SpellingMarkerListImpl&) = delete; + SpellingMarkerListImpl& operator=(const SpellingMarkerListImpl&) = delete; DocumentMarker::MarkerType MarkerType() const final; - - private: - DISALLOW_COPY_AND_ASSIGN(SpellingMarkerListImpl); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/styleable_marker.h b/third_party/blink/renderer/core/editing/markers/styleable_marker.h index 19184e0..d860da2 100644 --- a/third_party/blink/renderer/core/editing/markers/styleable_marker.h +++ b/third_party/blink/renderer/core/editing/markers/styleable_marker.h
@@ -23,6 +23,8 @@ ui::mojom::ImeTextSpanUnderlineStyle, Color text_color, Color background_color); + StyleableMarker(const StyleableMarker&) = delete; + StyleableMarker& operator=(const StyleableMarker&) = delete; // StyleableMarker-specific Color UnderlineColor() const; @@ -40,8 +42,6 @@ const ui::mojom::ImeTextSpanThickness thickness_; const ui::mojom::ImeTextSpanUnderlineStyle underline_style_; const Color text_color_; - - DISALLOW_COPY_AND_ASSIGN(StyleableMarker); }; bool CORE_EXPORT IsStyleableMarker(const DocumentMarker&);
diff --git a/third_party/blink/renderer/core/editing/markers/suggestion_marker.h b/third_party/blink/renderer/core/editing/markers/suggestion_marker.h index 87fe667..cfbde3410 100644 --- a/third_party/blink/renderer/core/editing/markers/suggestion_marker.h +++ b/third_party/blink/renderer/core/editing/markers/suggestion_marker.h
@@ -32,6 +32,8 @@ SuggestionMarker(unsigned start_offset, unsigned end_offset, const SuggestionMarkerProperties&); + SuggestionMarker(const SuggestionMarker&) = delete; + SuggestionMarker& operator=(const SuggestionMarker&) = delete; // DocumentMarker implementations MarkerType GetType() const final; @@ -59,8 +61,6 @@ const SuggestionType suggestion_type_; const RemoveOnFinishComposing remove_on_finish_composing_; const Color suggestion_highlight_color_; - - DISALLOW_COPY_AND_ASSIGN(SuggestionMarker); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.h index 8b1931e..f08badf 100644 --- a/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.h
@@ -19,6 +19,8 @@ class CORE_EXPORT SuggestionMarkerListImpl final : public DocumentMarkerList { public: SuggestionMarkerListImpl() = default; + SuggestionMarkerListImpl(const SuggestionMarkerListImpl&) = delete; + SuggestionMarkerListImpl& operator=(const SuggestionMarkerListImpl&) = delete; // DocumentMarkerList implementations DocumentMarker::MarkerType MarkerType() const final; @@ -58,8 +60,6 @@ unsigned new_length); HeapVector<Member<DocumentMarker>> markers_; - - DISALLOW_COPY_AND_ASSIGN(SuggestionMarkerListImpl); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/suggestion_marker_properties.h b/third_party/blink/renderer/core/editing/markers/suggestion_marker_properties.h index e6d9d22..85597cb 100644 --- a/third_party/blink/renderer/core/editing/markers/suggestion_marker_properties.h +++ b/third_party/blink/renderer/core/editing/markers/suggestion_marker_properties.h
@@ -59,6 +59,8 @@ public: explicit Builder(const SuggestionMarkerProperties&); Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; SuggestionMarkerProperties Build() const; @@ -74,8 +76,6 @@ private: SuggestionMarkerProperties data_; - - DISALLOW_COPY_AND_ASSIGN(Builder); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/suggestion_marker_replacement_scope.h b/third_party/blink/renderer/core/editing/markers/suggestion_marker_replacement_scope.h index 3eb3b711..f629fc7 100644 --- a/third_party/blink/renderer/core/editing/markers/suggestion_marker_replacement_scope.h +++ b/third_party/blink/renderer/core/editing/markers/suggestion_marker_replacement_scope.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_MARKERS_SUGGESTION_MARKER_REPLACEMENT_SCOPE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_MARKERS_SUGGESTION_MARKER_REPLACEMENT_SCOPE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -16,14 +15,16 @@ public: SuggestionMarkerReplacementScope(); + SuggestionMarkerReplacementScope(const SuggestionMarkerReplacementScope&) = + delete; + SuggestionMarkerReplacementScope& operator=( + const SuggestionMarkerReplacementScope&) = delete; ~SuggestionMarkerReplacementScope(); static bool CurrentlyInScope(); private: static bool currently_in_scope_; - - DISALLOW_COPY_AND_ASSIGN(SuggestionMarkerReplacementScope); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/markers/text_fragment_marker.h b/third_party/blink/renderer/core/editing/markers/text_fragment_marker.h index 0e4e363..4934f50 100644 --- a/third_party/blink/renderer/core/editing/markers/text_fragment_marker.h +++ b/third_party/blink/renderer/core/editing/markers/text_fragment_marker.h
@@ -15,15 +15,14 @@ class CORE_EXPORT TextFragmentMarker final : public TextMarkerBase { public: TextFragmentMarker(unsigned start_offset, unsigned end_offset); + TextFragmentMarker(const TextFragmentMarker&) = delete; + TextFragmentMarker& operator=(const TextFragmentMarker&) = delete; // DocumentMarker implementations MarkerType GetType() const final; // TextMarkerBase implementations bool IsActiveMatch() const final; - - private: - DISALLOW_COPY_AND_ASSIGN(TextFragmentMarker); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/text_fragment_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/text_fragment_marker_list_impl.h index 33f8058c..26936a8c 100644 --- a/third_party/blink/renderer/core/editing/markers/text_fragment_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/text_fragment_marker_list_impl.h
@@ -15,12 +15,12 @@ : public TextMarkerBaseListImpl { public: TextFragmentMarkerListImpl() = default; + TextFragmentMarkerListImpl(const TextFragmentMarkerListImpl&) = delete; + TextFragmentMarkerListImpl& operator=(const TextFragmentMarkerListImpl&) = + delete; // DocumentMarkerList implementations DocumentMarker::MarkerType MarkerType() const final; - - private: - DISALLOW_COPY_AND_ASSIGN(TextFragmentMarkerListImpl); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/text_marker_base.h b/third_party/blink/renderer/core/editing/markers/text_marker_base.h index 4e0b355..c6f9b590 100644 --- a/third_party/blink/renderer/core/editing/markers/text_marker_base.h +++ b/third_party/blink/renderer/core/editing/markers/text_marker_base.h
@@ -15,11 +15,10 @@ class CORE_EXPORT TextMarkerBase : public DocumentMarker { public: TextMarkerBase(unsigned start_offset, unsigned end_offset); + TextMarkerBase(const TextMarkerBase&) = delete; + TextMarkerBase& operator=(const TextMarkerBase&) = delete; virtual bool IsActiveMatch() const = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(TextMarkerBase); }; bool CORE_EXPORT IsTextMarker(const DocumentMarker&);
diff --git a/third_party/blink/renderer/core/editing/markers/text_marker_base_list_impl.h b/third_party/blink/renderer/core/editing/markers/text_marker_base_list_impl.h index 4665853..6e3a4d4b 100644 --- a/third_party/blink/renderer/core/editing/markers/text_marker_base_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/text_marker_base_list_impl.h
@@ -15,6 +15,9 @@ // TextFragmentMarkerListImpl to implement the MarkerType() method). class CORE_EXPORT TextMarkerBaseListImpl : public DocumentMarkerList { public: + TextMarkerBaseListImpl(const TextMarkerBaseListImpl&) = delete; + TextMarkerBaseListImpl& operator=(const TextMarkerBaseListImpl&) = delete; + // DocumentMarkerList implementations bool IsEmpty() const final; @@ -40,9 +43,6 @@ protected: TextMarkerBaseListImpl() = default; HeapVector<Member<DocumentMarker>> markers_; - - private: - DISALLOW_COPY_AND_ASSIGN(TextMarkerBaseListImpl); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/text_match_marker.h b/third_party/blink/renderer/core/editing/markers/text_match_marker.h index 519f995..0577ab9 100644 --- a/third_party/blink/renderer/core/editing/markers/text_match_marker.h +++ b/third_party/blink/renderer/core/editing/markers/text_match_marker.h
@@ -46,6 +46,8 @@ enum class MatchStatus { kInactive, kActive }; TextMatchMarker(unsigned start_offset, unsigned end_offset, MatchStatus); + TextMatchMarker(const TextMatchMarker&) = delete; + TextMatchMarker& operator=(const TextMatchMarker&) = delete; // DocumentMarker implementations MarkerType GetType() const final; @@ -69,8 +71,6 @@ MatchStatus match_status_; LayoutStatus layout_status_ = LayoutStatus::kInvalid; PhysicalRect rect_; - - DISALLOW_COPY_AND_ASSIGN(TextMatchMarker); }; template <>
diff --git a/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.h b/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.h index df8e2ed..6a1b6d9 100644 --- a/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.h +++ b/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.h
@@ -20,6 +20,8 @@ : public TextMarkerBaseListImpl { public: TextMatchMarkerListImpl() = default; + TextMatchMarkerListImpl(const TextMatchMarkerListImpl&) = delete; + TextMatchMarkerListImpl& operator=(const TextMatchMarkerListImpl&) = delete; // DocumentMarkerList implementations DocumentMarker::MarkerType MarkerType() const final; @@ -31,9 +33,6 @@ bool SetTextMatchMarkersActive(unsigned start_offset, unsigned end_offset, bool); - - private: - DISALLOW_COPY_AND_ASSIGN(TextMatchMarkerListImpl); }; template <>
diff --git a/third_party/blink/renderer/core/editing/reveal_selection_scope.h b/third_party/blink/renderer/core/editing/reveal_selection_scope.h index 3222126..cc8f9bc 100644 --- a/third_party/blink/renderer/core/editing/reveal_selection_scope.h +++ b/third_party/blink/renderer/core/editing/reveal_selection_scope.h
@@ -30,7 +30,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_REVEAL_SELECTION_SCOPE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_REVEAL_SELECTION_SCOPE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/platform/heap/handle.h" namespace blink { @@ -43,6 +42,8 @@ public: explicit RevealSelectionScope(LocalFrame&); + RevealSelectionScope(const RevealSelectionScope&) = delete; + RevealSelectionScope& operator=(const RevealSelectionScope&) = delete; ~RevealSelectionScope(); void Trace(Visitor*) const; @@ -51,8 +52,6 @@ Editor& GetEditor(); Member<LocalFrame> frame_; - - DISALLOW_COPY_AND_ASSIGN(RevealSelectionScope); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/selection_controller.h b/third_party/blink/renderer/core/editing/selection_controller.h index 2f68d8f6..f4ae79b1 100644 --- a/third_party/blink/renderer/core/editing/selection_controller.h +++ b/third_party/blink/renderer/core/editing/selection_controller.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_CONTROLLER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_CONTROLLER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/editing/frame_selection.h" @@ -47,6 +46,8 @@ public ExecutionContextLifecycleObserver { public: explicit SelectionController(LocalFrame&); + SelectionController(const SelectionController&) = delete; + SelectionController& operator=(const SelectionController&) = delete; ~SelectionController() override; void Trace(Visitor*) const override; @@ -146,8 +147,6 @@ kExtendedSelection }; SelectionState selection_state_; - - DISALLOW_COPY_AND_ASSIGN(SelectionController); }; bool IsSelectionOverLink(const MouseEventWithHitTestResults&);
diff --git a/third_party/blink/renderer/core/editing/selection_controller_test.cc b/third_party/blink/renderer/core/editing/selection_controller_test.cc index 55e2f92..3dbab1d 100644 --- a/third_party/blink/renderer/core/editing/selection_controller_test.cc +++ b/third_party/blink/renderer/core/editing/selection_controller_test.cc
@@ -19,6 +19,10 @@ namespace blink { class SelectionControllerTest : public EditingTestBase { + public: + SelectionControllerTest(const SelectionControllerTest&) = delete; + SelectionControllerTest& operator=(const SelectionControllerTest&) = delete; + protected: using AppendTrailingWhitespace = SelectionController::AppendTrailingWhitespace; @@ -59,9 +63,6 @@ void SetCaretAtHitTestResult(const HitTestResult&); void SetNonDirectionalSelectionIfNeeded(const SelectionInFlatTree&, TextGranularity); - - private: - DISALLOW_COPY_AND_ASSIGN(SelectionControllerTest); }; bool SelectionControllerTest::SelectClosestWordFromHitTestResult(
diff --git a/third_party/blink/renderer/core/editing/selection_editor.h b/third_party/blink/renderer/core/editing/selection_editor.h index 0e63030..a1d0ec9 100644 --- a/third_party/blink/renderer/core/editing/selection_editor.h +++ b/third_party/blink/renderer/core/editing/selection_editor.h
@@ -28,7 +28,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_EDITOR_H_ #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/dom/events/event_dispatch_result.h" #include "third_party/blink/renderer/core/dom/synchronous_mutation_observer.h" #include "third_party/blink/renderer/core/editing/frame_selection.h" @@ -44,6 +43,8 @@ public SynchronousMutationObserver { public: explicit SelectionEditor(LocalFrame&); + SelectionEditor(const SelectionEditor&) = delete; + SelectionEditor& operator=(const SelectionEditor&) = delete; virtual ~SelectionEditor(); void Dispose(); @@ -126,8 +127,6 @@ mutable uint64_t style_version_for_absolute_bounds_ = static_cast<uint64_t>(-1); #endif - - DISALLOW_COPY_AND_ASSIGN(SelectionEditor); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/selection_modifier.h b/third_party/blink/renderer/core/editing/selection_modifier.h index 31e6560..9f028887 100644 --- a/third_party/blink/renderer/core/editing/selection_modifier.h +++ b/third_party/blink/renderer/core/editing/selection_modifier.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_MODIFIER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SELECTION_MODIFIER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/selection_template.h" #include "third_party/blink/renderer/core/editing/visible_selection.h" @@ -51,6 +50,8 @@ const SelectionInDOMTree&, LayoutUnit); SelectionModifier(const LocalFrame&, const SelectionInDOMTree&); + SelectionModifier(const SelectionModifier&) = delete; + SelectionModifier& operator=(const SelectionModifier&) = delete; LayoutUnit XPosForVerticalArrowNavigation() const { return x_pos_for_vertical_arrow_navigation_; @@ -130,8 +131,6 @@ SelectionInFlatTree current_selection_; LayoutUnit x_pos_for_vertical_arrow_navigation_; bool selection_is_directional_ = false; - - DISALLOW_COPY_AND_ASSIGN(SelectionModifier); }; LayoutUnit NoXPosForVerticalArrowNavigation();
diff --git a/third_party/blink/renderer/core/editing/selection_template.h b/third_party/blink/renderer/core/editing/selection_template.h index f319f18..c2175d80 100644 --- a/third_party/blink/renderer/core/editing/selection_template.h +++ b/third_party/blink/renderer/core/editing/selection_template.h
@@ -8,7 +8,6 @@ #include <iosfwd> #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/forward.h" #include "third_party/blink/renderer/core/editing/position.h" @@ -34,6 +33,8 @@ public: explicit Builder(const SelectionTemplate&); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; Builder(); SelectionTemplate Build() const; @@ -72,8 +73,6 @@ private: SelectionTemplate selection_; - - DISALLOW_COPY_AND_ASSIGN(Builder); }; // Resets selection at end of life time of the object when base and extent @@ -83,6 +82,9 @@ public: explicit InvalidSelectionResetter(const SelectionTemplate&); + InvalidSelectionResetter(const InvalidSelectionResetter&) = delete; + InvalidSelectionResetter& operator=(const InvalidSelectionResetter&) = + delete; ~InvalidSelectionResetter(); void Trace(Visitor*) const; @@ -90,8 +92,6 @@ private: const Member<const Document> document_; SelectionTemplate& selection_; - - DISALLOW_COPY_AND_ASSIGN(InvalidSelectionResetter); }; SelectionTemplate(const SelectionTemplate& other);
diff --git a/third_party/blink/renderer/core/editing/serializers/markup_accumulator.h b/third_party/blink/renderer/core/editing/serializers/markup_accumulator.h index b464cec..7ad28a4 100644 --- a/third_party/blink/renderer/core/editing/serializers/markup_accumulator.h +++ b/third_party/blink/renderer/core/editing/serializers/markup_accumulator.h
@@ -29,7 +29,6 @@ #include <utility> -#include "base/macros.h" #include "third_party/blink/renderer/core/editing/editing_strategy.h" #include "third_party/blink/renderer/core/editing/serializers/markup_formatter.h" #include "third_party/blink/renderer/core/editing/serializers/serialization.h" @@ -50,6 +49,8 @@ SerializationType, IncludeShadowRoots, ClosedRootsSet = ClosedRootsSet()); + MarkupAccumulator(const MarkupAccumulator&) = delete; + MarkupAccumulator& operator=(const MarkupAccumulator&) = delete; virtual ~MarkupAccumulator(); template <typename Strategy> @@ -123,8 +124,6 @@ // https://w3c.github.io/DOM-Parsing/#dfn-generated-namespace-prefix-index uint32_t prefix_index_; - - DISALLOW_COPY_AND_ASSIGN(MarkupAccumulator); }; extern template String MarkupAccumulator::SerializeNodes<EditingStrategy>(
diff --git a/third_party/blink/renderer/core/editing/serializers/markup_formatter.h b/third_party/blink/renderer/core/editing/serializers/markup_formatter.h index bebcba43..c3dd275 100644 --- a/third_party/blink/renderer/core/editing/serializers/markup_formatter.h +++ b/third_party/blink/renderer/core/editing/serializers/markup_formatter.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SERIALIZERS_MARKUP_FORMATTER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SERIALIZERS_MARKUP_FORMATTER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/editing/editing_strategy.h" #include "third_party/blink/renderer/core/editing/serializers/serialization.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -93,6 +92,8 @@ static void AppendXMLDeclaration(StringBuilder&, const Document&); MarkupFormatter(AbsoluteURLs, SerializationType); + MarkupFormatter(const MarkupFormatter&) = delete; + MarkupFormatter& operator=(const MarkupFormatter&) = delete; void AppendStartMarkup(StringBuilder&, const Node&); void AppendEndMarkup(StringBuilder&, const Element&); @@ -119,8 +120,6 @@ private: const AbsoluteURLs resolve_urls_method_; SerializationType serialization_type_; - - DISALLOW_COPY_AND_ASSIGN(MarkupFormatter); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/serializers/styled_markup_accumulator.h b/third_party/blink/renderer/core/editing/serializers/styled_markup_accumulator.h index bb1f1d8..66f9699 100644 --- a/third_party/blink/renderer/core/editing/serializers/styled_markup_accumulator.h +++ b/third_party/blink/renderer/core/editing/serializers/styled_markup_accumulator.h
@@ -30,7 +30,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SERIALIZERS_STYLED_MARKUP_ACCUMULATOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SERIALIZERS_STYLED_MARKUP_ACCUMULATOR_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/editing/editing_style.h" #include "third_party/blink/renderer/core/editing/serializers/create_markup_options.h" #include "third_party/blink/renderer/core/editing/serializers/markup_formatter.h" @@ -51,6 +50,8 @@ const TextOffset& end, Document*, const CreateMarkupOptions& options); + StyledMarkupAccumulator(const StyledMarkupAccumulator&) = delete; + StyledMarkupAccumulator& operator=(const StyledMarkupAccumulator&) = delete; void AppendEndTag(const Element&); void AppendInterchangeNewline(); @@ -96,8 +97,6 @@ const CreateMarkupOptions options_; StringBuilder result_; Vector<String> reversed_preceding_markup_; - - DISALLOW_COPY_AND_ASSIGN(StyledMarkupAccumulator); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc b/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc index cebb9e1..5103518 100644 --- a/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc +++ b/third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.cc
@@ -29,7 +29,6 @@ #include "third_party/blink/renderer/core/editing/serializers/styled_markup_serializer.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_property_value_set.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" @@ -87,6 +86,8 @@ public: StyledMarkupTraverser(); StyledMarkupTraverser(StyledMarkupAccumulator*, Node*); + StyledMarkupTraverser(const StyledMarkupTraverser&) = delete; + StyledMarkupTraverser& operator=(const StyledMarkupTraverser&) = delete; Node* Traverse(Node*, Node*); void WrapWithNode(ContainerNode&, EditingStyle*); @@ -107,7 +108,6 @@ StyledMarkupAccumulator* accumulator_; Node* last_closed_; EditingStyle* wrapping_style_; - DISALLOW_COPY_AND_ASSIGN(StyledMarkupTraverser); }; template <typename Strategy>
diff --git a/third_party/blink/renderer/core/editing/set_selection_options.h b/third_party/blink/renderer/core/editing/set_selection_options.h index 4d1ec50..7b2d270 100644 --- a/third_party/blink/renderer/core/editing/set_selection_options.h +++ b/third_party/blink/renderer/core/editing/set_selection_options.h
@@ -58,6 +58,8 @@ public: explicit Builder(const SetSelectionOptions&); Builder(); + Builder(const Builder&) = delete; + Builder& operator=(const Builder&) = delete; SetSelectionOptions Build() const; @@ -74,8 +76,6 @@ private: SetSelectionOptions data_; - - DISALLOW_COPY_AND_ASSIGN(Builder); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h b/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h index 4729715..4a92300 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h +++ b/third_party/blink/renderer/core/editing/spellcheck/cold_mode_spell_check_requester.h
@@ -25,6 +25,9 @@ : public GarbageCollected<ColdModeSpellCheckRequester> { public: explicit ColdModeSpellCheckRequester(LocalDOMWindow&); + ColdModeSpellCheckRequester(const ColdModeSpellCheckRequester&) = delete; + ColdModeSpellCheckRequester& operator=(const ColdModeSpellCheckRequester&) = + delete; void SetNeedsMoreInvocationForTesting() { needs_more_invocation_for_testing_ = true; @@ -60,8 +63,6 @@ // A test-only flag for forcing lifecycle advancing. mutable bool needs_more_invocation_for_testing_; - - DISALLOW_COPY_AND_ASSIGN(ColdModeSpellCheckRequester); }; }
diff --git a/third_party/blink/renderer/core/editing/spellcheck/hot_mode_spell_check_requester.h b/third_party/blink/renderer/core/editing/spellcheck/hot_mode_spell_check_requester.h index 8e5966f..323a150 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/hot_mode_spell_check_requester.h +++ b/third_party/blink/renderer/core/editing/spellcheck/hot_mode_spell_check_requester.h
@@ -21,13 +21,14 @@ public: explicit HotModeSpellCheckRequester(SpellCheckRequester&); + HotModeSpellCheckRequester(const HotModeSpellCheckRequester&) = delete; + HotModeSpellCheckRequester& operator=(const HotModeSpellCheckRequester&) = + delete; void CheckSpellingAt(const Position&); private: HeapVector<Member<const Element>> processed_root_editables_; SpellCheckRequester* requester_; - - DISALLOW_COPY_AND_ASSIGN(HotModeSpellCheckRequester); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc index 9ee7d189..abc0625 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc +++ b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.cc
@@ -45,6 +45,8 @@ public: explicit IdleCallback(IdleSpellCheckController* controller) : controller_(controller) {} + IdleCallback(const IdleCallback&) = delete; + IdleCallback& operator=(const IdleCallback&) = delete; void Trace(Visitor* visitor) const final { visitor->Trace(controller_); @@ -55,8 +57,6 @@ void invoke(IdleDeadline* deadline) final { controller_->Invoke(deadline); } const Member<IdleSpellCheckController> controller_; - - DISALLOW_COPY_AND_ASSIGN(IdleCallback); }; IdleSpellCheckController::~IdleSpellCheckController() = default;
diff --git a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h index 2593305..b3966cd1 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h +++ b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_controller.h
@@ -30,10 +30,10 @@ class CORE_EXPORT IdleSpellCheckController final : public GarbageCollected<IdleSpellCheckController>, public ExecutionContextLifecycleObserver { - DISALLOW_COPY_AND_ASSIGN(IdleSpellCheckController); - public: explicit IdleSpellCheckController(LocalDOMWindow&, SpellCheckRequester&); + IdleSpellCheckController(const IdleSpellCheckController&) = delete; + IdleSpellCheckController& operator=(const IdleSpellCheckController&) = delete; ~IdleSpellCheckController() override; enum class State {
diff --git a/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.h b/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.h index 71904582c..cd4c6139 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.h +++ b/third_party/blink/renderer/core/editing/spellcheck/spell_check_requester.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SPELLCHECK_SPELL_CHECK_REQUESTER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SPELLCHECK_SPELL_CHECK_REQUESTER_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/range.h" @@ -83,6 +82,8 @@ : public GarbageCollected<SpellCheckRequester> { public: explicit SpellCheckRequester(LocalDOMWindow&); + SpellCheckRequester(const SpellCheckRequester&) = delete; + SpellCheckRequester& operator=(const SpellCheckRequester&) = delete; ~SpellCheckRequester(); void Trace(Visitor*) const; @@ -124,8 +125,6 @@ typedef HeapDeque<Member<SpellCheckRequest>> RequestQueue; RequestQueue request_queue_; - - DISALLOW_COPY_AND_ASSIGN(SpellCheckRequester); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/spellcheck/spell_checker.cc b/third_party/blink/renderer/core/editing/spellcheck/spell_checker.cc index 5c6bbb2..a3ec05f 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/spell_checker.cc +++ b/third_party/blink/renderer/core/editing/spellcheck/spell_checker.cc
@@ -522,6 +522,10 @@ if (current_document != GetFrame().GetDocument()) return; + // No DOM mutation if EditContext is active. + if (GetFrame().GetInputMethodController().GetActiveEditContext()) + return; + // TODO(editing-dev): The use of UpdateStyleAndLayout // needs to be audited. See http://crbug.com/590369 for more details. GetFrame().GetDocument()->UpdateStyleAndLayout(
diff --git a/third_party/blink/renderer/core/editing/spellcheck/spell_checker.h b/third_party/blink/renderer/core/editing/spellcheck/spell_checker.h index 96cf311..8c07281a 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/spell_checker.h +++ b/third_party/blink/renderer/core/editing/spellcheck/spell_checker.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SPELLCHECK_SPELL_CHECKER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_SPELLCHECK_SPELL_CHECKER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/forward.h" #include "third_party/blink/renderer/core/editing/markers/document_marker.h" @@ -51,6 +50,8 @@ class CORE_EXPORT SpellChecker final : public GarbageCollected<SpellChecker> { public: explicit SpellChecker(LocalDOMWindow&); + SpellChecker(const SpellChecker&) = delete; + SpellChecker& operator=(const SpellChecker&) = delete; void Trace(Visitor*) const; @@ -103,8 +104,6 @@ const Member<SpellCheckRequester> spell_check_requester_; const Member<IdleSpellCheckController> idle_spell_check_controller_; - - DISALLOW_COPY_AND_ASSIGN(SpellChecker); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/state_machines/backspace_state_machine.h b/third_party/blink/renderer/core/editing/state_machines/backspace_state_machine.h index f07f5bc..3cda747 100644 --- a/third_party/blink/renderer/core/editing/state_machines/backspace_state_machine.h +++ b/third_party/blink/renderer/core/editing/state_machines/backspace_state_machine.h
@@ -7,7 +7,6 @@ #include <iosfwd> -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/state_machines/text_segmentation_machine_state.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -20,6 +19,8 @@ public: BackspaceStateMachine(); + BackspaceStateMachine(const BackspaceStateMachine&) = delete; + BackspaceStateMachine& operator=(const BackspaceStateMachine&) = delete; // Prepares by feeding preceding text. // This method must not be called after feedFollowingCodeUnit(). @@ -63,8 +64,6 @@ // The internal state. BackspaceState state_; - - DISALLOW_COPY_AND_ASSIGN(BackspaceStateMachine); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/state_machines/backward_code_point_state_machine.h b/third_party/blink/renderer/core/editing/state_machines/backward_code_point_state_machine.h index 6342023..278467f4 100644 --- a/third_party/blink/renderer/core/editing/state_machines/backward_code_point_state_machine.h +++ b/third_party/blink/renderer/core/editing/state_machines/backward_code_point_state_machine.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_STATE_MACHINES_BACKWARD_CODE_POINT_STATE_MACHINE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_STATE_MACHINES_BACKWARD_CODE_POINT_STATE_MACHINE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/state_machines/text_segmentation_machine_state.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -18,6 +17,9 @@ public: BackwardCodePointStateMachine(); + BackwardCodePointStateMachine(const BackwardCodePointStateMachine&) = delete; + BackwardCodePointStateMachine& operator=( + const BackwardCodePointStateMachine&) = delete; ~BackwardCodePointStateMachine() = default; // Prepares by feeding preceding text. @@ -44,8 +46,6 @@ // The internal state. BackwardCodePointState state_; - - DISALLOW_COPY_AND_ASSIGN(BackwardCodePointStateMachine); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine.h b/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine.h index fb40c94b..1ef01101 100644 --- a/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine.h +++ b/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine.h
@@ -7,7 +7,6 @@ #include <iosfwd> -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/state_machines/text_segmentation_machine_state.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -20,6 +19,10 @@ public: BackwardGraphemeBoundaryStateMachine(); + BackwardGraphemeBoundaryStateMachine( + const BackwardGraphemeBoundaryStateMachine&) = delete; + BackwardGraphemeBoundaryStateMachine& operator=( + const BackwardGraphemeBoundaryStateMachine&) = delete; // Find boundary offset by feeding preceding text. // This method must not be called after feedFollowingCodeUnit(). @@ -66,8 +69,6 @@ // The internal state. InternalState internal_state_; - - DISALLOW_COPY_AND_ASSIGN(BackwardGraphemeBoundaryStateMachine); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine_test.cc b/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine_test.cc index ca89508..fa08bc73 100644 --- a/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine_test.cc +++ b/third_party/blink/renderer/core/editing/state_machines/backward_grapheme_boundary_state_machine_test.cc
@@ -39,12 +39,15 @@ class BackwardGraphemeBoundaryStatemachineTest : public GraphemeStateMachineTestBase { + public: + BackwardGraphemeBoundaryStatemachineTest( + const BackwardGraphemeBoundaryStatemachineTest&) = delete; + BackwardGraphemeBoundaryStatemachineTest& operator=( + const BackwardGraphemeBoundaryStatemachineTest&) = delete; + protected: BackwardGraphemeBoundaryStatemachineTest() = default; ~BackwardGraphemeBoundaryStatemachineTest() override = default; - - private: - DISALLOW_COPY_AND_ASSIGN(BackwardGraphemeBoundaryStatemachineTest); }; TEST_F(BackwardGraphemeBoundaryStatemachineTest, DoNothingCase) {
diff --git a/third_party/blink/renderer/core/editing/state_machines/forward_code_point_state_machine.h b/third_party/blink/renderer/core/editing/state_machines/forward_code_point_state_machine.h index 966256cd..88dbdc6 100644 --- a/third_party/blink/renderer/core/editing/state_machines/forward_code_point_state_machine.h +++ b/third_party/blink/renderer/core/editing/state_machines/forward_code_point_state_machine.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_STATE_MACHINES_FORWARD_CODE_POINT_STATE_MACHINE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_STATE_MACHINES_FORWARD_CODE_POINT_STATE_MACHINE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/state_machines/text_segmentation_machine_state.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -18,6 +17,9 @@ public: ForwardCodePointStateMachine(); + ForwardCodePointStateMachine(const ForwardCodePointStateMachine&) = delete; + ForwardCodePointStateMachine& operator=(const ForwardCodePointStateMachine&) = + delete; ~ForwardCodePointStateMachine() = default; // Prepares by feeding preceding text. @@ -44,8 +46,6 @@ // The internal state. ForwardCodePointState state_; - - DISALLOW_COPY_AND_ASSIGN(ForwardCodePointStateMachine); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine.h b/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine.h index 1cd3860..8b311ffb 100644 --- a/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine.h +++ b/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine.h
@@ -7,7 +7,6 @@ #include <iosfwd> -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/state_machines/text_segmentation_machine_state.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -20,6 +19,10 @@ public: ForwardGraphemeBoundaryStateMachine(); + ForwardGraphemeBoundaryStateMachine( + const ForwardGraphemeBoundaryStateMachine&) = delete; + ForwardGraphemeBoundaryStateMachine& operator=( + const ForwardGraphemeBoundaryStateMachine&) = delete; // Find boundary offset by feeding preceding text. // This method must not be called after feedFollowingCodeUnit(). @@ -69,8 +72,6 @@ // The internal state. InternalState internal_state_; - - DISALLOW_COPY_AND_ASSIGN(ForwardGraphemeBoundaryStateMachine); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine_test.cc b/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine_test.cc index f12b603f..bcdb89aa 100644 --- a/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine_test.cc +++ b/third_party/blink/renderer/core/editing/state_machines/forward_grapheme_boundary_state_machine_test.cc
@@ -42,12 +42,15 @@ class ForwardGraphemeBoundaryStatemachineTest : public GraphemeStateMachineTestBase { + public: + ForwardGraphemeBoundaryStatemachineTest( + const ForwardGraphemeBoundaryStatemachineTest&) = delete; + ForwardGraphemeBoundaryStatemachineTest& operator=( + const ForwardGraphemeBoundaryStatemachineTest&) = delete; + protected: ForwardGraphemeBoundaryStatemachineTest() = default; ~ForwardGraphemeBoundaryStatemachineTest() override = default; - - private: - DISALLOW_COPY_AND_ASSIGN(ForwardGraphemeBoundaryStatemachineTest); }; TEST_F(ForwardGraphemeBoundaryStatemachineTest, DoNothingCase) {
diff --git a/third_party/blink/renderer/core/editing/state_machines/state_machine_test_util.h b/third_party/blink/renderer/core/editing/state_machines/state_machine_test_util.h index 5da4514..4da0f63 100644 --- a/third_party/blink/renderer/core/editing/state_machines/state_machine_test_util.h +++ b/third_party/blink/renderer/core/editing/state_machines/state_machine_test_util.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_STATE_MACHINES_STATE_MACHINE_TEST_UTIL_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_STATE_MACHINES_STATE_MACHINE_TEST_UTIL_H_ -#include "base/macros.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/platform/wtf/text/unicode.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -17,6 +16,11 @@ class ForwardGraphemeBoundaryStateMachine; class GraphemeStateMachineTestBase : public testing::Test { + public: + GraphemeStateMachineTestBase(const GraphemeStateMachineTestBase&) = delete; + GraphemeStateMachineTestBase& operator=(const GraphemeStateMachineTestBase&) = + delete; + protected: GraphemeStateMachineTestBase() = default; ~GraphemeStateMachineTestBase() override = default; @@ -49,9 +53,6 @@ String ProcessSequenceForward(ForwardGraphemeBoundaryStateMachine*, const Vector<UChar32>& preceding, const Vector<UChar32>& following); - - private: - DISALLOW_COPY_AND_ASSIGN(GraphemeStateMachineTestBase); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.h b/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.h index 4fedba4..a3217f8 100644 --- a/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.h +++ b/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.h
@@ -31,6 +31,8 @@ : public GarbageCollected<TextSuggestionController> { public: explicit TextSuggestionController(LocalDOMWindow&); + TextSuggestionController(const TextSuggestionController&) = delete; + TextSuggestionController& operator=(const TextSuggestionController&) = delete; bool IsMenuOpen() const; @@ -73,8 +75,6 @@ bool is_suggestion_menu_open_; const Member<LocalDOMWindow> window_; HeapMojoRemote<mojom::blink::TextSuggestionHost> text_suggestion_host_; - - DISALLOW_COPY_AND_ASSIGN(TextSuggestionController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/text_offset_mapping.h b/third_party/blink/renderer/core/editing/text_offset_mapping.h index e3aca5b..406c988 100644 --- a/third_party/blink/renderer/core/editing/text_offset_mapping.h +++ b/third_party/blink/renderer/core/editing/text_offset_mapping.h
@@ -7,7 +7,6 @@ #include <iosfwd> #include <iterator> -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/ephemeral_range.h" #include "third_party/blink/renderer/core/editing/forward.h" @@ -155,6 +154,8 @@ // Constructor |TextOffsetMapping| for the |inline_contents|. explicit TextOffsetMapping(const InlineContents& inline_contents); + TextOffsetMapping(const TextOffsetMapping&) = delete; + TextOffsetMapping& operator=(const TextOffsetMapping&) = delete; ~TextOffsetMapping() = default; @@ -210,8 +211,6 @@ const TextIteratorBehavior behavior_; const EphemeralRangeInFlatTree range_; const String text16_; - - DISALLOW_COPY_AND_ASSIGN(TextOffsetMapping); }; CORE_EXPORT std::ostream& operator<<(std::ostream&,
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h index bfce3c7..c31c727 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.h +++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -30,7 +30,6 @@ #include <memory> -#include "base/macros.h" #include "services/metrics/public/cpp/ukm_source_id.h" #include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h" #include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h index a33d82a..a8a01e1 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.h +++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -29,7 +29,6 @@ #include <memory> -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "services/network/public/mojom/web_sandbox_flags.mojom-blink-forward.h" #include "third_party/blink/public/mojom/permissions_policy/document_policy_feature.mojom-blink-forward.h"
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 81c8878..3edb236c 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -464,14 +464,16 @@ CrossVariantMojoAssociatedReceiver<mojom::PageBroadcastInterfaceBase> page_handle, scheduler::WebAgentGroupScheduler& agent_group_scheduler, - const SessionStorageNamespaceId& session_storage_namespace_id) { + const SessionStorageNamespaceId& session_storage_namespace_id, + absl::optional<SkColor> page_base_background_color) { return WebViewImpl::Create( client, is_hidden ? mojom::blink::PageVisibilityState::kHidden : mojom::blink::PageVisibilityState::kVisible, is_inside_portal, compositing_enabled, widgets_never_composited, static_cast<WebViewImpl*>(opener), std::move(page_handle), - agent_group_scheduler, session_storage_namespace_id); + agent_group_scheduler, session_storage_namespace_id, + std::move(page_base_background_color)); } WebViewImpl* WebViewImpl::Create( @@ -483,13 +485,15 @@ WebViewImpl* opener, mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle, blink::scheduler::WebAgentGroupScheduler& agent_group_scheduler, - const SessionStorageNamespaceId& session_storage_namespace_id) { + const SessionStorageNamespaceId& session_storage_namespace_id, + absl::optional<SkColor> page_base_background_color) { // Take a self-reference for WebViewImpl that is released by calling Close(), // then return a raw pointer to the caller. auto web_view = base::AdoptRef( new WebViewImpl(client, visibility, is_inside_portal, compositing_enabled, widgets_never_composited, opener, std::move(page_handle), - agent_group_scheduler, session_storage_namespace_id)); + agent_group_scheduler, session_storage_namespace_id, + std::move(page_base_background_color))); web_view->AddRef(); return web_view.get(); } @@ -553,7 +557,8 @@ WebViewImpl* opener, mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle, blink::scheduler::WebAgentGroupScheduler& agent_group_scheduler, - const SessionStorageNamespaceId& session_storage_namespace_id) + const SessionStorageNamespaceId& session_storage_namespace_id, + absl::optional<SkColor> page_base_background_color) : widgets_never_composited_(widgets_never_composited), web_view_client_(client), chrome_client_(MakeGarbageCollected<ChromeClientImpl>(this)), @@ -561,6 +566,8 @@ maximum_zoom_level_(PageZoomFactorToZoomLevel(kMaximumPageZoomFactor)), does_composite_(does_composite), fullscreen_controller_(std::make_unique<FullscreenController>(this)), + page_base_background_color_( + page_base_background_color.value_or(SK_ColorWHITE)), receiver_(this, std::move(page_handle), agent_group_scheduler.DefaultTaskRunner()), @@ -3042,14 +3049,17 @@ return SK_ColorTRANSPARENT; if (base_background_color_override_for_inspector_) return base_background_color_override_for_inspector_.value(); - return base_background_color_; + // Use the page background color if this is the WebView of the main frame. + if (MainFrameImpl()) + return page_base_background_color_; + return Color::kWhite; } -void WebViewImpl::SetBaseBackgroundColor(SkColor color) { - if (base_background_color_ == color) +void WebViewImpl::SetPageBaseBackgroundColor(absl::optional<SkColor> color) { + SkColor new_color = color.value_or(SK_ColorWHITE); + if (page_base_background_color_ == new_color) return; - - base_background_color_ = color; + page_base_background_color_ = new_color; UpdateBaseBackgroundColor(); }
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index 10d9aaae..2dfdc17 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -120,7 +120,8 @@ WebViewImpl* opener, mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle, scheduler::WebAgentGroupScheduler& agent_group_scheduler, - const SessionStorageNamespaceId& session_storage_namespace_id); + const SessionStorageNamespaceId& session_storage_namespace_id, + absl::optional<SkColor> page_base_background_color); // All calls to Create() should be balanced with a call to Close(). This // synchronously destroys the WebViewImpl. @@ -198,7 +199,6 @@ WebPagePopupImpl* GetPagePopup() const override { return page_popup_.get(); } void SetPageFrozen(bool frozen) override; WebFrameWidget* MainFrameWidget() override; - void SetBaseBackgroundColor(SkColor) override; void SetDeviceColorSpaceForTesting( const gfx::ColorSpace& color_space) override; void PaintContent(cc::PaintCanvas*, const gfx::Rect&) override; @@ -284,6 +284,7 @@ const RendererPreferences& preferences) override; void SetHistoryOffsetAndLength(int32_t history_offset, int32_t history_length) override; + void SetPageBaseBackgroundColor(absl::optional<SkColor> color) override; void DispatchPageshow(base::TimeTicks navigation_start); void DispatchPagehide(mojom::blink::PagehideDispatch pagehide_dispatch); @@ -637,7 +638,8 @@ WebViewImpl* opener, mojo::PendingAssociatedReceiver<mojom::blink::PageBroadcast> page_handle, scheduler::WebAgentGroupScheduler& agent_group_scheduler, - const SessionStorageNamespaceId& session_storage_namespace_id); + const SessionStorageNamespaceId& session_storage_namespace_id, + absl::optional<SkColor> page_base_background_color); ~WebViewImpl() override; void ConfigureAutoResizeMode(); @@ -825,7 +827,7 @@ absl::optional<SkColor> background_color_override_for_fullscreen_controller_; bool override_base_background_color_to_transparent_ = false; absl::optional<SkColor> base_background_color_override_for_inspector_; - SkColor base_background_color_ = Color::kWhite; + SkColor page_base_background_color_; // Only applies to main frame. float zoom_factor_override_ = 0.f;
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 ef2aec1..620f759 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -433,7 +433,7 @@ WebViewImpl* web_view = web_view_helper_.Initialize(); EXPECT_EQ(SK_ColorWHITE, web_view->BackgroundColor()); - web_view->SetBaseBackgroundColor(SK_ColorBLUE); + web_view->SetPageBaseBackgroundColor(SK_ColorBLUE); EXPECT_EQ(SK_ColorBLUE, web_view->BackgroundColor()); WebURL base_url = url_test_helpers::ToKURL("http://example.com/"); @@ -453,11 +453,11 @@ // Expected: red (50% alpha) blended atop base of SK_ColorBLUE. EXPECT_EQ(0xFF80007F, web_view->BackgroundColor()); - web_view->SetBaseBackgroundColor(kTranslucentPutty); + web_view->SetPageBaseBackgroundColor(kTranslucentPutty); // Expected: red (50% alpha) blended atop kTranslucentPutty. Note the alpha. EXPECT_EQ(0xBFE93A31, web_view->BackgroundColor()); - web_view->SetBaseBackgroundColor(SK_ColorTRANSPARENT); + web_view->SetPageBaseBackgroundColor(SK_ColorTRANSPARENT); frame_test_helpers::LoadHTMLString(web_view->MainFrameImpl(), "<html><head><style>body " "{background-color:transparent}</style></" @@ -494,13 +494,15 @@ /*widgets_never_composited=*/false, /*opener=*/nullptr, mojo::NullAssociatedReceiver(), web_view_helper_.GetAgentGroupScheduler(), - /*session_storage_namespace_id=*/base::EmptyString())); + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt)); EXPECT_NE(SK_ColorBLUE, web_view->BackgroundColor()); - // WebView does not have a frame yet, but we should still be able to set the - // background color. - web_view->SetBaseBackgroundColor(SK_ColorBLUE); - EXPECT_EQ(SK_ColorBLUE, web_view->BackgroundColor()); + // WebView does not have a frame yet; while it's possible to set the page + // background color, it won't have any effect until a local main frame is + // attached. + web_view->SetPageBaseBackgroundColor(SK_ColorBLUE); + EXPECT_NE(SK_ColorBLUE, web_view->BackgroundColor()); frame_test_helpers::TestWebFrameClient web_frame_client; WebLocalFrame* frame = WebLocalFrame::CreateMainFrame( @@ -528,7 +530,7 @@ WebViewImpl* web_view = web_view_helper_.Initialize(); // Set WebView background to green with alpha. - web_view->SetBaseBackgroundColor(kAlphaGreen); + web_view->SetPageBaseBackgroundColor(kAlphaGreen); web_view->GetSettings()->SetShouldClearDocumentBackground(false); web_view->MainFrameViewWidget()->Resize(gfx::Size(kWidth, kHeight)); UpdateAllLifecyclePhases(); @@ -569,7 +571,7 @@ ColorSchemeHelper color_scheme_helper(*(web_view->GetPage())); color_scheme_helper.SetPreferredColorScheme( mojom::blink::PreferredColorScheme::kLight); - web_view->SetBaseBackgroundColor(SK_ColorBLUE); + web_view->SetPageBaseBackgroundColor(SK_ColorBLUE); WebURL base_url = url_test_helpers::ToKURL("http://example.com/"); frame_test_helpers::LoadHTMLString( @@ -586,9 +588,9 @@ EXPECT_EQ(Color(0x12, 0x12, 0x12), frame_view->BaseBackgroundColor()); // Don't let dark color-scheme override a transparent background. - web_view->SetBaseBackgroundColor(SK_ColorTRANSPARENT); + web_view->SetPageBaseBackgroundColor(SK_ColorTRANSPARENT); EXPECT_EQ(Color::kTransparent, frame_view->BaseBackgroundColor()); - web_view->SetBaseBackgroundColor(SK_ColorBLUE); + web_view->SetPageBaseBackgroundColor(SK_ColorBLUE); EXPECT_EQ(Color(0x12, 0x12, 0x12), frame_view->BaseBackgroundColor()); color_scheme_helper.SetForcedColors(*(web_view->GetPage()), @@ -2740,7 +2742,8 @@ /*widgets_never_composited=*/false, /*opener=*/nullptr, mojo::NullAssociatedReceiver(), web_view_helper_.GetAgentGroupScheduler(), - /*session_storage_namespace_id=*/base::EmptyString())); + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt)); frame_test_helpers::TestWebFrameClient web_frame_client; WebLocalFrame* local_frame = WebLocalFrame::CreateMainFrame( web_view, &web_frame_client, nullptr, LocalFrameToken(), nullptr);
diff --git a/third_party/blink/renderer/core/fetch/body.cc b/third_party/blink/renderer/core/fetch/body.cc index aadd3d4..b7d6129 100644 --- a/third_party/blink/renderer/core/fetch/body.cc +++ b/third_party/blink/renderer/core/fetch/body.cc
@@ -40,6 +40,9 @@ : resolver_(resolver), task_runner_(ExecutionContext::From(resolver_->GetScriptState()) ->GetTaskRunner(TaskType::kNetworking)) {} + BodyConsumerBase(const BodyConsumerBase&) = delete; + BodyConsumerBase& operator=(const BodyConsumerBase&) = delete; + ScriptPromiseResolver* Resolver() { return resolver_; } void DidFetchDataLoadFailed() override { ScriptState::Scope scope(Resolver()->GetScriptState()); @@ -75,37 +78,40 @@ const Member<ScriptPromiseResolver> resolver_; const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - DISALLOW_COPY_AND_ASSIGN(BodyConsumerBase); }; class BodyBlobConsumer final : public BodyConsumerBase { public: explicit BodyBlobConsumer(ScriptPromiseResolver* resolver) : BodyConsumerBase(resolver) {} + BodyBlobConsumer(const BodyBlobConsumer&) = delete; + BodyBlobConsumer& operator=(const BodyBlobConsumer&) = delete; void DidFetchDataLoadedBlobHandle( scoped_refptr<BlobDataHandle> blob_data_handle) override { ResolveLater(WrapPersistent( MakeGarbageCollected<Blob>(std::move(blob_data_handle)))); } - DISALLOW_COPY_AND_ASSIGN(BodyBlobConsumer); }; class BodyArrayBufferConsumer final : public BodyConsumerBase { public: explicit BodyArrayBufferConsumer(ScriptPromiseResolver* resolver) : BodyConsumerBase(resolver) {} + BodyArrayBufferConsumer(const BodyArrayBufferConsumer&) = delete; + BodyArrayBufferConsumer& operator=(const BodyArrayBufferConsumer&) = delete; void DidFetchDataLoadedArrayBuffer(DOMArrayBuffer* array_buffer) override { ResolveLater(WrapPersistent(array_buffer)); } - DISALLOW_COPY_AND_ASSIGN(BodyArrayBufferConsumer); }; class BodyFormDataConsumer final : public BodyConsumerBase { public: explicit BodyFormDataConsumer(ScriptPromiseResolver* resolver) : BodyConsumerBase(resolver) {} + BodyFormDataConsumer(const BodyFormDataConsumer&) = delete; + BodyFormDataConsumer& operator=(const BodyFormDataConsumer&) = delete; void DidFetchDataLoadedFormData(FormData* formData) override { ResolveLater(WrapPersistent(formData)); @@ -117,24 +123,26 @@ formData->append(pair.first, pair.second); DidFetchDataLoadedFormData(formData); } - DISALLOW_COPY_AND_ASSIGN(BodyFormDataConsumer); }; class BodyTextConsumer final : public BodyConsumerBase { public: explicit BodyTextConsumer(ScriptPromiseResolver* resolver) : BodyConsumerBase(resolver) {} + BodyTextConsumer(const BodyTextConsumer&) = delete; + BodyTextConsumer& operator=(const BodyTextConsumer&) = delete; void DidFetchDataLoadedString(const String& string) override { ResolveLater(string); } - DISALLOW_COPY_AND_ASSIGN(BodyTextConsumer); }; class BodyJsonConsumer final : public BodyConsumerBase { public: explicit BodyJsonConsumer(ScriptPromiseResolver* resolver) : BodyConsumerBase(resolver) {} + BodyJsonConsumer(const BodyJsonConsumer&) = delete; + BodyJsonConsumer& operator=(const BodyJsonConsumer&) = delete; void DidFetchDataLoadedString(const String& string) override { if (!Resolver()->GetExecutionContext() || @@ -153,7 +161,6 @@ } else Resolver()->Reject(trycatch.Exception()); } - DISALLOW_COPY_AND_ASSIGN(BodyJsonConsumer); }; } // namespace
diff --git a/third_party/blink/renderer/core/fetch/body.h b/third_party/blink/renderer/core/fetch/body.h index 3db2c70..93d4442 100644 --- a/third_party/blink/renderer/core/fetch/body.h +++ b/third_party/blink/renderer/core/fetch/body.h
@@ -32,6 +32,8 @@ class CORE_EXPORT Body : public ExecutionContextClient { public: explicit Body(ExecutionContext*); + Body(const Body&) = delete; + Body& operator=(const Body&) = delete; ScriptPromise arrayBuffer(ScriptState*, ExceptionState&); ScriptPromise blob(ScriptState*, ExceptionState&); @@ -65,7 +67,6 @@ // an exception if consumption cannot proceed. The caller must check // |exception_state| on return. void RejectInvalidConsumption(ExceptionState& exception_state) const; - DISALLOW_COPY_AND_ASSIGN(Body); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc index a9d0073..f53700a7 100644 --- a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc +++ b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
@@ -39,6 +39,8 @@ : ExecutionContextLifecycleObserver(execution_context), buffer_(buffer), client_(client) {} + LoaderClient(const LoaderClient&) = delete; + LoaderClient& operator=(const LoaderClient&) = delete; void DidFetchDataLoadedBlobHandle( scoped_refptr<BlobDataHandle> blob_data_handle) override { @@ -95,7 +97,6 @@ Member<BodyStreamBuffer> buffer_; Member<FetchDataLoader::Client> client_; - DISALLOW_COPY_AND_ASSIGN(LoaderClient); }; // Use a Create() method to split construction from initialisation.
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer.h b/third_party/blink/renderer/core/fetch/body_stream_buffer.h index 763d83eb..5dc22d93 100644 --- a/third_party/blink/renderer/core/fetch/body_stream_buffer.h +++ b/third_party/blink/renderer/core/fetch/body_stream_buffer.h
@@ -58,6 +58,9 @@ ScriptCachedMetadataHandler* cached_metadata_handler, scoped_refptr<BlobDataHandle> side_data_blob = nullptr); + BodyStreamBuffer(const BodyStreamBuffer&) = delete; + BodyStreamBuffer& operator=(const BodyStreamBuffer&) = delete; + ReadableStream* Stream() { return stream_; } // Callable only when neither locked nor disturbed. @@ -155,8 +158,6 @@ // TODO(ricea): Remove remaining uses of |stream_broken_|. bool stream_broken_ = false; - - DISALLOW_COPY_AND_ASSIGN(BodyStreamBuffer); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/fetch_request_data.h b/third_party/blink/renderer/core/fetch/fetch_request_data.h index b4c0fe0..02b6909 100644 --- a/third_party/blink/renderer/core/fetch/fetch_request_data.h +++ b/third_party/blink/renderer/core/fetch/fetch_request_data.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_FETCH_REQUEST_DATA_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_FETCH_REQUEST_DATA_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/unguessable_token.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -46,6 +45,8 @@ FetchRequestData* Pass(ScriptState*); explicit FetchRequestData(ExecutionContext* execution_context); + FetchRequestData(const FetchRequestData&) = delete; + FetchRequestData& operator=(const FetchRequestData&) = delete; ~FetchRequestData(); void SetMethod(AtomicString method) { method_ = method; } @@ -183,8 +184,6 @@ base::UnguessableToken window_id_; Member<ExecutionContext> execution_context_; bool allow_http1_for_streaming_upload_ = false; - - DISALLOW_COPY_AND_ASSIGN(FetchRequestData); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/fetch_response_data.h b/third_party/blink/renderer/core/fetch/fetch_response_data.h index cf94881..ba8b03c 100644 --- a/third_party/blink/renderer/core/fetch/fetch_response_data.h +++ b/third_party/blink/renderer/core/fetch/fetch_response_data.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "net/http/http_response_info.h" #include "services/network/public/mojom/fetch_api.mojom-blink-forward.h" @@ -48,6 +47,8 @@ network::mojom::FetchResponseSource, uint16_t, AtomicString); + FetchResponseData(const FetchResponseData&) = delete; + FetchResponseData& operator=(const FetchResponseData&) = delete; FetchResponseData* CreateBasicFilteredResponse() const; FetchResponseData* CreateCorsFilteredResponse( @@ -178,8 +179,6 @@ // algorithm. // See: https://fetch.spec.whatwg.org/#concept-http-network-fetch bool request_include_credentials_ = true; - - DISALLOW_COPY_AND_ASSIGN(FetchResponseData); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc index 807de87b..946e1107 100644 --- a/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc +++ b/third_party/blink/renderer/core/fetch/form_data_bytes_consumer_test.cc
@@ -48,6 +48,8 @@ &SimpleDataPipeGetter::OnMojoDisconnect, WTF::Unretained(this))); receivers_.Add(this, std::move(receiver)); } + SimpleDataPipeGetter(const SimpleDataPipeGetter&) = delete; + SimpleDataPipeGetter& operator=(const SimpleDataPipeGetter&) = delete; ~SimpleDataPipeGetter() override = default; // network::mojom::DataPipeGetter implementation: @@ -70,8 +72,6 @@ private: String str_; mojo::ReceiverSet<network::mojom::blink::DataPipeGetter> receivers_; - - DISALLOW_COPY_AND_ASSIGN(SimpleDataPipeGetter); }; scoped_refptr<EncodedFormData> ComplexFormData() {
diff --git a/third_party/blink/renderer/core/fetch/headers.cc b/third_party/blink/renderer/core/fetch/headers.cc index e894f49..f76661c 100644 --- a/third_party/blink/renderer/core/fetch/headers.cc +++ b/third_party/blink/renderer/core/fetch/headers.cc
@@ -275,8 +275,7 @@ NOTREACHED(); } -// TODO(crbug.com/1181288): Remove the old IDL union version. -// Old IDL dictionaries still use old IDL unions. +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Headers::FillWith(const HeadersInit& init, ExceptionState& exception_state) { DCHECK_EQ(header_list_->size(), 0U); @@ -288,6 +287,7 @@ NOTREACHED(); } } +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Headers::FillWith(const Vector<Vector<String>>& object, ExceptionState& exception_state) {
diff --git a/third_party/blink/renderer/core/fetch/headers.h b/third_party/blink/renderer/core/fetch/headers.h index da62763..386686cc 100644 --- a/third_party/blink/renderer/core/fetch/headers.h +++ b/third_party/blink/renderer/core/fetch/headers.h
@@ -60,9 +60,9 @@ // These methods should only be called when size() would return 0. void FillWith(const Headers*, ExceptionState&); void FillWith(const V8HeadersInit* init, ExceptionState& exception_state); - // TODO(crbug.com/1181288): Remove the old IDL union version. - // Old IDL dictionaries still use old IDL unions. +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void FillWith(const HeadersInit&, ExceptionState&); +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // https://fetch.spec.whatwg.org/#concept-headers-remove-privileged-no-cors-request-headers void RemovePrivilegedNoCorsRequestHeaders();
diff --git a/third_party/blink/renderer/core/fetch/multipart_parser.h b/third_party/blink/renderer/core/fetch/multipart_parser.h index 259f76b..76d4e57 100644 --- a/third_party/blink/renderer/core/fetch/multipart_parser.h +++ b/third_party/blink/renderer/core/fetch/multipart_parser.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_MULTIPART_PARSER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_FETCH_MULTIPART_PARSER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/network/http_header_map.h" @@ -43,6 +42,8 @@ }; MultipartParser(Vector<char> boundary, Client*); + MultipartParser(const MultipartParser&) = delete; + MultipartParser& operator=(const MultipartParser&) = delete; bool AppendData(const char* bytes, size_t); void Cancel(); bool Finish(); @@ -107,8 +108,6 @@ kCancelled, kFinished } state_; - - DISALLOW_COPY_AND_ASSIGN(MultipartParser); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.h b/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.h index 5d948cae..9382ee3 100644 --- a/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.h +++ b/third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.h
@@ -25,6 +25,9 @@ class CORE_EXPORT ReadableStreamBytesConsumer final : public BytesConsumer { public: ReadableStreamBytesConsumer(ScriptState*, ReadableStream*); + ReadableStreamBytesConsumer(const ReadableStreamBytesConsumer&) = delete; + ReadableStreamBytesConsumer& operator=(const ReadableStreamBytesConsumer&) = + delete; ~ReadableStreamBytesConsumer() override; Result BeginRead(const char** buffer, size_t* available) override; @@ -56,7 +59,6 @@ size_t pending_offset_ = 0; PublicState state_ = PublicState::kReadableOrWaiting; bool is_reading_ = false; - DISALLOW_COPY_AND_ASSIGN(ReadableStreamBytesConsumer); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/request.h b/third_party/blink/renderer/core/fetch/request.h index b2f536e..2d583b97 100644 --- a/third_party/blink/renderer/core/fetch/request.h +++ b/third_party/blink/renderer/core/fetch/request.h
@@ -61,6 +61,8 @@ Request(ScriptState*, FetchRequestData*, Headers*, AbortSignal*); Request(ScriptState*, FetchRequestData*); + Request(const Request&) = delete; + Request& operator=(const Request&) = delete; static absl::optional<network::mojom::CredentialsMode> ParseCredentialsMode( const String& credentials_mode); @@ -116,7 +118,6 @@ const Member<FetchRequestData> request_; const Member<Headers> headers_; const Member<AbortSignal> signal_; - DISALLOW_COPY_AND_ASSIGN(Request); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fetch/response.h b/third_party/blink/renderer/core/fetch/response.h index d984c40..bf2ff85 100644 --- a/third_party/blink/renderer/core/fetch/response.h +++ b/third_party/blink/renderer/core/fetch/response.h
@@ -69,6 +69,8 @@ explicit Response(ExecutionContext*); Response(ExecutionContext*, FetchResponseData*); Response(ExecutionContext*, FetchResponseData*, Headers*); + Response(const Response&) = delete; + Response& operator=(const Response&) = delete; const FetchResponseData* GetResponse() const { return response_; } @@ -128,7 +130,6 @@ private: const Member<FetchResponseData> response_; const Member<Headers> headers_; - DISALLOW_COPY_AND_ASSIGN(Response); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index 575dfea..8f905ade 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -620,7 +620,8 @@ /*widgets_never_composited=*/false, /*opener=*/opener, mojo::NullAssociatedReceiver(), *agent_group_scheduler_, - /*session_storage_namespace_id=*/base::EmptyString())); + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt)); // This property must be set at initialization time, it is not supported to be // changed afterward, and does nothing. web_view_->GetSettings()->SetViewportEnabled(viewport_enabled_);
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc index a49d4f5..8331d31 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc +++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.cc
@@ -59,12 +59,7 @@ } void CanvasRenderingContext::DidDraw(const SkIRect& dirty_rect) { - Host()->DidDraw(SkRect::Make(dirty_rect)); - DidDrawCommon(); -} - -void CanvasRenderingContext::DidDraw() { - Host()->DidDraw(); + Host()->DidDraw(dirty_rect); DidDrawCommon(); }
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h index e329201..77427f0e 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h +++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
@@ -153,8 +153,11 @@ return nullptr; } virtual bool IsPaintable() const = 0; - virtual void DidDraw(const SkIRect& dirty_rect); - virtual void DidDraw(); + void DidDraw(const SkIRect& dirty_rect); + void DidDraw() { + return DidDraw(Host() ? SkIRect::MakeWH(Host()->width(), Host()->height()) + : SkIRect::MakeEmpty()); + } // Return true if the content is updated. virtual bool PaintRenderingResultsToCanvas(SourceDrawingBuffer) {
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h index ff5faff7..52f23db 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h +++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h
@@ -46,8 +46,8 @@ virtual void DetachContext() = 0; - virtual void DidDraw(const FloatRect& rect) = 0; - virtual void DidDraw() = 0; + virtual void DidDraw(const SkIRect& rect) = 0; + void DidDraw() { DidDraw(SkIRect::MakeWH(width(), height())); } virtual void PreFinalizeFrame() = 0; virtual void PostFinalizeFrame() = 0;
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index 80fc682..fae49ea7 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -452,8 +452,8 @@ return blocked; } -void HTMLCanvasElement::DidDraw(const FloatRect& rect) { - if (rect.IsEmpty()) +void HTMLCanvasElement::DidDraw(const SkIRect& rect) { + if (rect.isEmpty()) return; if (GetLayoutObject() && GetLayoutObject()->PreviousVisibilityVisible() && GetDocument().GetPage()) @@ -463,18 +463,12 @@ GetLayoutObject()->SetShouldCheckForPaintInvalidation(); if (IsRenderingContext2D() && context_->ShouldAntialias() && GetPage() && GetPage()->DeviceScaleFactorDeprecated() > 1.0f) { - FloatRect inflated_rect = rect; - inflated_rect.Inflate(1); - dirty_rect_.Unite(inflated_rect); + dirty_rect_.join(rect.makeOutset(1, 1)); } else { - dirty_rect_.Unite(rect); + dirty_rect_.join(rect); } if (IsRenderingContext2D() && canvas2d_bridge_) - canvas2d_bridge_->DidDraw(rect); -} - -void HTMLCanvasElement::DidDraw() { - DidDraw(FloatRect(0, 0, Size().Width(), Size().Height())); + canvas2d_bridge_->DidDraw(); } void HTMLCanvasElement::PreFinalizeFrame() { @@ -488,7 +482,7 @@ // Low-latency 2d canvases produce their frames after the resource gets single // buffered. - if (LowLatencyEnabled() && !dirty_rect_.IsEmpty() && + if (LowLatencyEnabled() && !dirty_rect_.isEmpty() && GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU)) { // TryEnableSingleBuffering() the first time we FinalizeFrame(). This is // a nop if already single buffered or if single buffering is unsupported. @@ -497,21 +491,19 @@ } void HTMLCanvasElement::PostFinalizeFrame() { - if (LowLatencyEnabled() && !dirty_rect_.IsEmpty() && + if (LowLatencyEnabled() && !dirty_rect_.isEmpty() && GetOrCreateCanvasResourceProvider(RasterModeHint::kPreferGPU)) { const base::TimeTicks start_time = base::TimeTicks::Now(); const scoped_refptr<CanvasResource> canvas_resource = ResourceProvider()->ProduceCanvasResource(); - const FloatRect src_rect(0, 0, Size().Width(), Size().Height()); - dirty_rect_.Intersect(src_rect); - const IntRect int_dirty = EnclosingIntRect(dirty_rect_); - const SkIRect damage_rect = SkIRect::MakeXYWH( - int_dirty.X(), int_dirty.Y(), int_dirty.Width(), int_dirty.Height()); + SkIRect damage_rect = SkIRect::MakeWH(Size().Width(), Size().Height()); + damage_rect.intersect(dirty_rect_); + const bool needs_vertical_flip = !RenderingContext()->IsOriginTopLeft(); frame_dispatcher_->DispatchFrame(std::move(canvas_resource), start_time, damage_rect, needs_vertical_flip, IsOpaque()); - dirty_rect_ = FloatRect(); + dirty_rect_.setEmpty(); } // If the canvas is visible, notifying listeners is taken care of in @@ -549,42 +541,36 @@ } void HTMLCanvasElement::DoDeferredPaintInvalidation() { - DCHECK(!dirty_rect_.IsEmpty()); + DCHECK(!dirty_rect_.isEmpty()); if (LowLatencyEnabled()) { // Low latency canvas handles dirty propagation in FinalizeFrame(); return; } LayoutBox* layout_box = GetLayoutBox(); - FloatRect content_rect; - if (layout_box) { - if (auto* replaced = DynamicTo<LayoutReplaced>(layout_box)) - content_rect = FloatRect(replaced->ReplacedContentRect()); - else - content_rect = FloatRect(layout_box->PhysicalContentBoxRect()); - } - if (IsRenderingContext2D()) { - FloatRect src_rect(0, 0, Size().Width(), Size().Height()); - dirty_rect_.Intersect(src_rect); - - FloatRect invalidation_rect; + if (dirty_rect_.isEmpty()) // TODO(junov): Do we still need this? + return; + IntRect src_rect(0, 0, Size().Width(), Size().Height()); + IntRect invalidation_rect(dirty_rect_); + invalidation_rect.Intersect(src_rect); if (layout_box) { - FloatRect mapped_dirty_rect = - MapRect(dirty_rect_, src_rect, content_rect); + FloatRect content_rect; + if (auto* replaced = DynamicTo<LayoutReplaced>(layout_box)) + content_rect = FloatRect(replaced->ReplacedContentRect()); + else + content_rect = FloatRect(layout_box->PhysicalContentBoxRect()); + + FloatRect mapped_invalidation_rect = MapRect( + FloatRect(invalidation_rect), FloatRect(src_rect), content_rect); if (context_->IsComposited()) { // Composited 2D canvases need the dirty rect to be expressed relative // to the content box, as opposed to the layout box. - mapped_dirty_rect.MoveBy(-content_rect.Location()); + mapped_invalidation_rect.MoveBy(-content_rect.Location()); } - invalidation_rect = mapped_dirty_rect; - } else { - invalidation_rect = dirty_rect_; + invalidation_rect = EnclosingIntRect(mapped_invalidation_rect); } - if (dirty_rect_.IsEmpty()) - return; - if (canvas2d_bridge_) canvas2d_bridge_->DoPaintInvalidation(invalidation_rect); } @@ -601,14 +587,14 @@ layout_box->SetShouldDoFullPaintInvalidation(); } - dirty_rect_ = FloatRect(); + dirty_rect_.setEmpty(); } void HTMLCanvasElement::Reset() { if (ignore_reset_) return; - dirty_rect_ = FloatRect(); + dirty_rect_.setEmpty(); bool had_resource_provider = HasResourceProvider(); @@ -1236,7 +1222,7 @@ void HTMLCanvasElement::DiscardResourceProvider() { canvas2d_bridge_.reset(); CanvasResourceHost::DiscardResourceProvider(); - dirty_rect_ = FloatRect(); + dirty_rect_.setEmpty(); } void HTMLCanvasElement::PageVisibilityChanged() {
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h index be19441..4e4876d 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -152,9 +152,9 @@ // Derived from OffscreenCanvasPlaceholder. bool HasCanvasCapture() const final { return !listeners_.IsEmpty(); } - // Used for rendering - void DidDraw(const FloatRect&) override; - void DidDraw() override; + // Used for rendering. + void DidDraw(const SkIRect&) override; + using CanvasRenderingContextHost::DidDraw; void Paint(GraphicsContext&, const PhysicalRect&, @@ -182,7 +182,7 @@ InsertionNotificationRequest InsertedInto(ContainerNode&) override; - bool IsDirty() { return !dirty_rect_.IsEmpty(); } + bool IsDirty() { return !dirty_rect_.isEmpty(); } void DoDeferredPaintInvalidation(); @@ -392,7 +392,7 @@ bool canvas_is_clear_ = true; bool ignore_reset_; - FloatRect dirty_rect_; + SkIRect dirty_rect_; bool origin_clean_; bool needs_unbuffered_input_ = false;
diff --git a/third_party/blink/renderer/core/html/forms/external_popup_menu.cc b/third_party/blink/renderer/core/html/forms/external_popup_menu.cc index 2ef6356..aa973de 100644 --- a/third_party/blink/renderer/core/html/forms/external_popup_menu.cc +++ b/third_party/blink/renderer/core/html/forms/external_popup_menu.cc
@@ -34,6 +34,7 @@ #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/input/web_coalesced_input_event.h" #include "third_party/blink/public/common/input/web_mouse_event.h" +#include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/events/current_input_event.h" @@ -54,6 +55,22 @@ namespace blink { +namespace { + +float GetDprForSizeAdjustment(const Element& owner_element) { + float dpr = 1.0f; + // Android doesn't need these adjustments and it makes tests fail. +#ifndef OS_ANDROID + if (Platform::Current()->IsUseZoomForDSFEnabled() && + owner_element.GetDocument().GetFrame()) { + dpr = owner_element.GetDocument().GetFrame()->DevicePixelRatio(); + } +#endif + return dpr; +} + +} // namespace + ExternalPopupMenu::ExternalPopupMenu(LocalFrame& frame, HTMLSelectElement& owner_element) : owner_element_(owner_element), @@ -106,6 +123,11 @@ ->LocalRootFrameWidget() ->GetEmulatorScale(); + // rect_in_viewport needs to be in CSS pixels. + float dpr = GetDprForSizeAdjustment(*owner_element_); + if (dpr != 1.0) + rect_in_viewport.Scale(1 / dpr); + gfx::Rect bounds = gfx::Rect(rect_in_viewport.X() * scale_for_emulation, rect_in_viewport.Y() * scale_for_emulation, @@ -278,9 +300,11 @@ : *owner_element.EnsureComputedStyle(); const SimpleFontData* font_data = menu_style.GetFont().PrimaryFont(); DCHECK(font_data); - *item_height = font_data ? font_data->GetFontMetrics().Height() : 0; + // These coordinates need to be in CSS pixels. + float dpr = GetDprForSizeAdjustment(owner_element); + *item_height = font_data ? font_data->GetFontMetrics().Height() / dpr : 0; *font_size = static_cast<int>( - menu_style.GetFont().GetFontDescription().ComputedSize()); + menu_style.GetFont().GetFontDescription().SpecifiedSize()); *selected_item = ToExternalPopupMenuItemIndex( owner_element.SelectedListIndex(), owner_element);
diff --git a/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc b/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc index e382fdf..7fc18a3 100644 --- a/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc +++ b/third_party/blink/renderer/core/html/forms/external_popup_menu_test.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "content/test/test_blink_web_unit_test_support.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/choosers/popup_menu.mojom-blink.h" @@ -219,6 +220,39 @@ EXPECT_EQ(expected_y, ShownBounds().y()); } +// Android doesn't use this position data and we don't adjust it for DPR there.. +#ifdef OS_ANDROID +#define MAYBE_PopupAccountsForDeviceScaleFactor \ + DISABLED_PopupAccountsForDeviceScaleFactor +#else +#define MAYBE_PopupAccountsForDeviceScaleFactor \ + PopupAccountsForDeviceScaleFactor +#endif + +TEST_F(ExternalPopupMenuTest, MAYBE_PopupAccountsForDeviceScaleFactor) { + content::TestBlinkWebUnitTestSupport::SetUseZoomForDsfEnabled(true); + + RegisterMockedURLLoad("select_mid_screen.html"); + LoadFrame("select_mid_screen.html"); + + constexpr int kScaleFactor = 2; + WebView()->SetZoomFactorForDeviceScaleFactor(kScaleFactor); + WebView()->MainFrameWidget()->UpdateAllLifecyclePhases( + DocumentUpdateReason::kTest); + + auto* select = To<HTMLSelectElement>( + MainFrame()->GetFrame()->GetDocument()->getElementById("select")); + auto* layout_object = select->GetLayoutObject(); + ASSERT_TRUE(layout_object); + + select->ShowPopup(); + WaitUntilShowedPopup(); + + // The test file has no body margins but 50px of padding. + EXPECT_EQ(50, ShownBounds().x()); + EXPECT_EQ(50, ShownBounds().y()); +} + TEST_F(ExternalPopupMenuTest, DidAcceptIndex) { RegisterMockedURLLoad("select.html"); LoadFrame("select.html");
diff --git a/third_party/blink/renderer/core/html/forms/form_data_event.cc b/third_party/blink/renderer/core/html/forms/form_data_event.cc index 6f5fac0..b9e46fc 100644 --- a/third_party/blink/renderer/core/html/forms/form_data_event.cc +++ b/third_party/blink/renderer/core/html/forms/form_data_event.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_form_data_event_init.h" #include "third_party/blink/renderer/core/event_interface_names.h" +#include "third_party/blink/renderer/core/event_type_names.h" #include "third_party/blink/renderer/core/html/forms/form_data.h" namespace blink {
diff --git a/third_party/blink/renderer/core/html/forms/time_input_type.cc b/third_party/blink/renderer/core/html/forms/time_input_type.cc index 729b22c..3e5cd6d 100644 --- a/third_party/blink/renderer/core/html/forms/time_input_type.cc +++ b/third_party/blink/renderer/core/html/forms/time_input_type.cc
@@ -124,8 +124,7 @@ if (!date_time_fields_state.HasHour() || !date_time_fields_state.HasMinute() || !date_time_fields_state.HasAMPM()) return g_empty_string; - if (date_time_fields_state.HasMillisecond() && - date_time_fields_state.Millisecond()) { + if (date_time_fields_state.HasMillisecond()) { return String::Format( "%02u:%02u:%02u.%03u", date_time_fields_state.Hour23(), date_time_fields_state.Minute(), @@ -133,7 +132,7 @@ : 0, date_time_fields_state.Millisecond()); } - if (date_time_fields_state.HasSecond() && date_time_fields_state.Second()) { + if (date_time_fields_state.HasSecond()) { return String::Format("%02u:%02u:%02u", date_time_fields_state.Hour23(), date_time_fields_state.Minute(), date_time_fields_state.Second());
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc index 2e78100..82a99c1 100644 --- a/third_party/blink/renderer/core/html/html_dialog_element.cc +++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -25,6 +25,7 @@ #include "third_party/blink/renderer/core/html/html_dialog_element.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_focus_options.h" #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" @@ -33,7 +34,6 @@ #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/fullscreen/fullscreen.h" -#include "third_party/blink/renderer/core/html/focus_options.h" #include "third_party/blink/renderer/core/html/forms/html_form_control_element.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -137,11 +137,11 @@ // modify this element. if (RuntimeEnabledFeatures::DialogFocusNewSpecBehaviorEnabled() && previously_focused_element_) { - FocusOptions focus_options; - focus_options.setPreventScroll(true); + FocusOptions* focus_options = FocusOptions::Create(); + focus_options->setPreventScroll(true); Element* previously_focused_element = previously_focused_element_; previously_focused_element_ = nullptr; - previously_focused_element->focus(&focus_options); + previously_focused_element->focus(focus_options); } }
diff --git a/third_party/blink/renderer/core/html/html_marquee_element.cc b/third_party/blink/renderer/core/html/html_marquee_element.cc index 6cbe378..bc15149 100644 --- a/third_party/blink/renderer/core/html/html_marquee_element.cc +++ b/third_party/blink/renderer/core/html/html_marquee_element.cc
@@ -292,8 +292,13 @@ Timing timing; OptionalEffectTiming* effect_timing = OptionalEffectTiming::Create(); effect_timing->setFill("forwards"); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + effect_timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>(duration)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) effect_timing->setDuration( UnrestrictedDoubleOrString::FromUnrestrictedDouble(duration)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) TimingInput::Update(timing, effect_timing, nullptr, ASSERT_NO_EXCEPTION); auto* keyframe_effect =
diff --git a/third_party/blink/renderer/core/html/track/track_event.cc b/third_party/blink/renderer/core/html/track/track_event.cc index 3fb853e..cd4b8df0 100644 --- a/third_party/blink/renderer/core/html/track/track_event.cc +++ b/third_party/blink/renderer/core/html/track/track_event.cc
@@ -43,6 +43,20 @@ if (!initializer->hasTrack()) return; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const V8UnionAudioTrackOrTextTrackOrVideoTrack* track = initializer->track(); + switch (track->GetContentType()) { + case V8UnionAudioTrackOrTextTrackOrVideoTrack::ContentType::kAudioTrack: + track_ = track->GetAsAudioTrack(); + break; + case V8UnionAudioTrackOrTextTrackOrVideoTrack::ContentType::kTextTrack: + track_ = track->GetAsTextTrack(); + break; + case V8UnionAudioTrackOrTextTrackOrVideoTrack::ContentType::kVideoTrack: + track_ = track->GetAsVideoTrack(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const VideoTrackOrAudioTrackOrTextTrack& track = initializer->track(); if (track.IsVideoTrack()) track_ = track.GetAsVideoTrack(); @@ -52,6 +66,7 @@ track_ = track.GetAsTextTrack(); else NOTREACHED(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } TrackEvent::~TrackEvent() = default;
diff --git a/third_party/blink/renderer/core/html/track/vtt/buffered_line_reader.h b/third_party/blink/renderer/core/html/track/vtt/buffered_line_reader.h index 6827e3c..faee892d 100644 --- a/third_party/blink/renderer/core/html/track/vtt/buffered_line_reader.h +++ b/third_party/blink/renderer/core/html/track/vtt/buffered_line_reader.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_TRACK_VTT_BUFFERED_LINE_READER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_TRACK_VTT_BUFFERED_LINE_READER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/text/segmented_string.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -50,6 +49,8 @@ public: BufferedLineReader() : end_of_stream_(false), maybe_skip_lf_(false) {} + BufferedLineReader(const BufferedLineReader&) = delete; + BufferedLineReader& operator=(const BufferedLineReader&) = delete; // Append data to the internal buffer. void Append(const String& data) { @@ -81,8 +82,6 @@ StringBuilder line_buffer_; bool end_of_stream_; bool maybe_skip_lf_; - - DISALLOW_COPY_AND_ASSIGN(BufferedLineReader); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_scanner.h b/third_party/blink/renderer/core/html/track/vtt/vtt_scanner.h index 1a548ca..c0b4a8e 100644 --- a/third_party/blink/renderer/core/html/track/vtt/vtt_scanner.h +++ b/third_party/blink/renderer/core/html/track/vtt/vtt_scanner.h
@@ -30,7 +30,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_TRACK_VTT_VTT_SCANNER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_TRACK_VTT_VTT_SCANNER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/text/parsing_utilities.h" @@ -54,6 +53,8 @@ public: explicit VTTScanner(const String& line); + VTTScanner(const VTTScanner&) = delete; + VTTScanner& operator=(const VTTScanner&) = delete; typedef const LChar* Position; @@ -162,8 +163,6 @@ const UChar* characters16; } end_; bool is_8bit_; - - DISALLOW_COPY_AND_ASSIGN(VTTScanner); }; inline wtf_size_t VTTScanner::Run::length() const {
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_tokenizer.h b/third_party/blink/renderer/core/html/track/vtt/vtt_tokenizer.h index e10ae687..0b12beb 100644 --- a/third_party/blink/renderer/core/html/track/vtt/vtt_tokenizer.h +++ b/third_party/blink/renderer/core/html/track/vtt/vtt_tokenizer.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_TRACK_VTT_VTT_TOKENIZER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_TRACK_VTT_VTT_TOKENIZER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/html/parser/input_stream_preprocessor.h" #include "third_party/blink/renderer/core/html/track/vtt/vtt_token.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -43,6 +42,8 @@ public: explicit VTTTokenizer(const String& input); + VTTTokenizer(const VTTTokenizer&) = delete; + VTTTokenizer& operator=(const VTTTokenizer&) = delete; bool NextToken(VTTToken&); @@ -53,8 +54,6 @@ // ://www.whatwg.org/specs/web-apps/current-work/#preprocessing-the-input-stream InputStreamPreprocessor<VTTTokenizer> input_stream_preprocessor_; - - DISALLOW_COPY_AND_ASSIGN(VTTTokenizer); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/console_message_storage.h b/third_party/blink/renderer/core/inspector/console_message_storage.h index 1ea2efe..e011f65 100644 --- a/third_party/blink/renderer/core/inspector/console_message_storage.h +++ b/third_party/blink/renderer/core/inspector/console_message_storage.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_CONSOLE_MESSAGE_STORAGE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_CONSOLE_MESSAGE_STORAGE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -19,6 +18,8 @@ : public GarbageCollected<ConsoleMessageStorage> { public: ConsoleMessageStorage(); + ConsoleMessageStorage(const ConsoleMessageStorage&) = delete; + ConsoleMessageStorage& operator=(const ConsoleMessageStorage&) = delete; // If |discard_duplicates| is set, the message will only be added if no // console message with the same text has exists in |messages_|. Returns @@ -36,8 +37,6 @@ private: int expired_count_; HeapDeque<Member<ConsoleMessage>> messages_; - - DISALLOW_COPY_AND_ASSIGN(ConsoleMessageStorage); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/devtools_agent.cc b/third_party/blink/renderer/core/inspector/devtools_agent.cc index 1cd6ee12..2b6fdfaf 100644 --- a/third_party/blink/renderer/core/inspector/devtools_agent.cc +++ b/third_party/blink/renderer/core/inspector/devtools_agent.cc
@@ -86,6 +86,9 @@ CrossThreadUnretained(this), std::move(receiver))); } + IOAgent(const IOAgent&) = delete; + IOAgent& operator=(const IOAgent&) = delete; + void BindInterface( mojo::PendingReceiver<mojom::blink::DevToolsAgent> receiver) { DCHECK(io_task_runner_->RunsTasksInCurrentSequence()); @@ -154,8 +157,6 @@ scoped_refptr<InspectorTaskRunner> inspector_task_runner_; CrossThreadWeakPersistent<::blink::DevToolsAgent> agent_; mojo::Receiver<mojom::blink::DevToolsAgent> receiver_{this}; - - DISALLOW_COPY_AND_ASSIGN(IOAgent); }; DevToolsAgent::DevToolsAgent(
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.cc b/third_party/blink/renderer/core/inspector/devtools_session.cc index 242653b..881b5a6 100644 --- a/third_party/blink/renderer/core/inspector/devtools_session.cc +++ b/third_party/blink/renderer/core/inspector/devtools_session.cc
@@ -64,6 +64,9 @@ CrossThreadUnretained(this), std::move(receiver))); } + IOSession(const IOSession&) = delete; + IOSession& operator=(const IOSession&) = delete; + ~IOSession() override = default; void BindInterface( @@ -104,8 +107,6 @@ scoped_refptr<InspectorTaskRunner> inspector_task_runner_; CrossThreadWeakPersistent<::blink::DevToolsSession> session_; mojo::Receiver<mojom::blink::DevToolsSession> receiver_{this}; - - DISALLOW_COPY_AND_ASSIGN(IOSession); }; DevToolsSession::DevToolsSession(
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.h b/third_party/blink/renderer/core/inspector/devtools_session.h index 1fb9aa9e..6410f3a 100644 --- a/third_party/blink/renderer/core/inspector/devtools_session.h +++ b/third_party/blink/renderer/core/inspector/devtools_session.h
@@ -7,7 +7,6 @@ #include <memory> #include "base/callback.h" -#include "base/macros.h" #include "mojo/public/cpp/bindings/pending_associated_receiver.h" #include "mojo/public/cpp/bindings/pending_associated_remote.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -48,6 +47,8 @@ bool client_expects_binary_responses, const String& session_id, scoped_refptr<base::SequencedTaskRunner> mojo_task_runner); + DevToolsSession(const DevToolsSession&) = delete; + DevToolsSession& operator=(const DevToolsSession&) = delete; ~DevToolsSession() override; void ConnectToV8(v8_inspector::V8Inspector*, int context_group_id); @@ -123,8 +124,6 @@ InspectorAgentState v8_session_state_; InspectorAgentState::Bytes v8_session_state_cbor_; const String session_id_; - - DISALLOW_COPY_AND_ASSIGN(DevToolsSession); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/dom_editor.cc b/third_party/blink/renderer/core/inspector/dom_editor.cc index c75fe54..de08ccc 100644 --- a/third_party/blink/renderer/core/inspector/dom_editor.cc +++ b/third_party/blink/renderer/core/inspector/dom_editor.cc
@@ -30,7 +30,6 @@ #include "third_party/blink/renderer/core/inspector/dom_editor.h" -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" @@ -53,6 +52,8 @@ : InspectorHistory::Action("RemoveChild"), parent_node_(parent_node), node_(node) {} + RemoveChildAction(const RemoveChildAction&) = delete; + RemoveChildAction& operator=(const RemoveChildAction&) = delete; bool Perform(ExceptionState& exception_state) override { anchor_node_ = node_->nextSibling(); @@ -81,7 +82,6 @@ Member<ContainerNode> parent_node_; Member<Node> node_; Member<Node> anchor_node_; - DISALLOW_COPY_AND_ASSIGN(RemoveChildAction); }; class DOMEditor::InsertBeforeAction final : public InspectorHistory::Action { @@ -91,6 +91,8 @@ parent_node_(parent_node), node_(node), anchor_node_(anchor_node) {} + InsertBeforeAction(const InsertBeforeAction&) = delete; + InsertBeforeAction& operator=(const InsertBeforeAction&) = delete; bool Perform(ExceptionState& exception_state) override { if (node_->parentNode()) { @@ -134,7 +136,6 @@ Member<Node> node_; Member<Node> anchor_node_; Member<RemoveChildAction> remove_child_action_; - DISALLOW_COPY_AND_ASSIGN(InsertBeforeAction); }; class DOMEditor::RemoveAttributeAction final : public InspectorHistory::Action { @@ -143,6 +144,8 @@ : InspectorHistory::Action("RemoveAttribute"), element_(element), name_(name) {} + RemoveAttributeAction(const RemoveAttributeAction&) = delete; + RemoveAttributeAction& operator=(const RemoveAttributeAction&) = delete; bool Perform(ExceptionState& exception_state) override { value_ = element_->getAttribute(name_); @@ -168,7 +171,6 @@ Member<Element> element_; AtomicString name_; AtomicString value_; - DISALLOW_COPY_AND_ASSIGN(RemoveAttributeAction); }; class DOMEditor::SetAttributeAction final : public InspectorHistory::Action { @@ -181,6 +183,8 @@ name_(name), value_(value), had_attribute_(false) {} + SetAttributeAction(const SetAttributeAction&) = delete; + SetAttributeAction& operator=(const SetAttributeAction&) = delete; bool Perform(ExceptionState& exception_state) override { const AtomicString& value = element_->getAttribute(name_); @@ -214,7 +218,6 @@ AtomicString value_; bool had_attribute_; AtomicString old_value_; - DISALLOW_COPY_AND_ASSIGN(SetAttributeAction); }; class DOMEditor::SetOuterHTMLAction final : public InspectorHistory::Action { @@ -227,6 +230,8 @@ new_node_(nullptr), history_(MakeGarbageCollected<InspectorHistory>()), dom_editor_(MakeGarbageCollected<DOMEditor>(history_.Get())) {} + SetOuterHTMLAction(const SetOuterHTMLAction&) = delete; + SetOuterHTMLAction& operator=(const SetOuterHTMLAction&) = delete; bool Perform(ExceptionState& exception_state) override { old_html_ = CreateMarkup(node_.Get()); @@ -268,7 +273,6 @@ Member<Node> new_node_; Member<InspectorHistory> history_; Member<DOMEditor> dom_editor_; - DISALLOW_COPY_AND_ASSIGN(SetOuterHTMLAction); }; class DOMEditor::ReplaceWholeTextAction final @@ -278,6 +282,8 @@ : InspectorHistory::Action("ReplaceWholeText"), text_node_(text_node), text_(text) {} + ReplaceWholeTextAction(const ReplaceWholeTextAction&) = delete; + ReplaceWholeTextAction& operator=(const ReplaceWholeTextAction&) = delete; bool Perform(ExceptionState& exception_state) override { old_text_ = text_node_->wholeText(); @@ -303,7 +309,6 @@ Member<Text> text_node_; String text_; String old_text_; - DISALLOW_COPY_AND_ASSIGN(ReplaceWholeTextAction); }; class DOMEditor::ReplaceChildNodeAction final @@ -316,6 +321,8 @@ parent_node_(parent_node), new_node_(new_node), old_node_(old_node) {} + ReplaceChildNodeAction(const ReplaceChildNodeAction&) = delete; + ReplaceChildNodeAction& operator=(const ReplaceChildNodeAction&) = delete; bool Perform(ExceptionState& exception_state) override { return Redo(exception_state); @@ -342,13 +349,14 @@ Member<ContainerNode> parent_node_; Member<Node> new_node_; Member<Node> old_node_; - DISALLOW_COPY_AND_ASSIGN(ReplaceChildNodeAction); }; class DOMEditor::SetNodeValueAction final : public InspectorHistory::Action { public: SetNodeValueAction(Node* node, const String& value) : InspectorHistory::Action("SetNodeValue"), node_(node), value_(value) {} + SetNodeValueAction(const SetNodeValueAction&) = delete; + SetNodeValueAction& operator=(const SetNodeValueAction&) = delete; bool Perform(ExceptionState&) override { old_value_ = node_->nodeValue(); @@ -374,7 +382,6 @@ Member<Node> node_; String value_; String old_value_; - DISALLOW_COPY_AND_ASSIGN(SetNodeValueAction); }; DOMEditor::DOMEditor(InspectorHistory* history) : history_(history) {}
diff --git a/third_party/blink/renderer/core/inspector/dom_editor.h b/third_party/blink/renderer/core/inspector/dom_editor.h index 76de15b..43ba5e4b 100644 --- a/third_party/blink/renderer/core/inspector/dom_editor.h +++ b/third_party/blink/renderer/core/inspector/dom_editor.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_DOM_EDITOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_DOM_EDITOR_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/inspector/protocol/Forward.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -48,6 +47,8 @@ class DOMEditor final : public GarbageCollected<DOMEditor> { public: explicit DOMEditor(InspectorHistory*); + DOMEditor(const DOMEditor&) = delete; + DOMEditor& operator=(const DOMEditor&) = delete; void Trace(Visitor*) const; @@ -95,8 +96,6 @@ class SetNodeValueAction; Member<InspectorHistory> history_; - - DISALLOW_COPY_AND_ASSIGN(DOMEditor); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/dom_patch_support.h b/third_party/blink/renderer/core/inspector/dom_patch_support.h index 5160f97..3c5f6c74 100644 --- a/third_party/blink/renderer/core/inspector/dom_patch_support.h +++ b/third_party/blink/renderer/core/inspector/dom_patch_support.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_DOM_PATCH_SUPPORT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_DOM_PATCH_SUPPORT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -50,6 +49,8 @@ public: DOMPatchSupport(DOMEditor*, Document&); + DOMPatchSupport(const DOMPatchSupport&) = delete; + DOMPatchSupport& operator=(const DOMPatchSupport&) = delete; void PatchDocument(const String& markup); Node* PatchNode(Node*, const String& markup, ExceptionState&); @@ -90,8 +91,6 @@ Document* document_; UnusedNodesMap unused_nodes_map_; - - DISALLOW_COPY_AND_ASSIGN(DOMPatchSupport); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.h b/third_party/blink/renderer/core/inspector/inspect_tools.h index dbe9c78e..066a2a3 100644 --- a/third_party/blink/renderer/core/inspector/inspect_tools.h +++ b/third_party/blink/renderer/core/inspector/inspect_tools.h
@@ -8,7 +8,6 @@ #include <vector> #include <v8-inspector.h> -#include "base/macros.h" #include "third_party/blink/renderer/core/inspector/inspector_overlay_agent.h" #include "third_party/blink/renderer/core/inspector/node_content_visibility_state.h" @@ -26,6 +25,8 @@ InspectorDOMAgent* dom_agent, bool ua_shadow, const std::vector<uint8_t>& highlight_config); + SearchingForNodeTool(const SearchingForNodeTool&) = delete; + SearchingForNodeTool& operator=(const SearchingForNodeTool&) = delete; void Trace(Visitor* visitor) const override; @@ -54,7 +55,6 @@ std::unique_ptr<InspectorHighlightConfig> highlight_config_; InspectorHighlightContrastInfo contrast_info_; bool omit_tooltip_ = false; - DISALLOW_COPY_AND_ASSIGN(SearchingForNodeTool); }; // ----------------------------------------------------------------------------- @@ -66,6 +66,8 @@ std::unique_ptr<FloatQuad> quad, Color color, Color outline_color); + QuadHighlightTool(const QuadHighlightTool&) = delete; + QuadHighlightTool& operator=(const QuadHighlightTool&) = delete; private: bool ForwardEventsToOverlay() override; @@ -75,7 +77,6 @@ std::unique_ptr<FloatQuad> quad_; Color color_; Color outline_color_; - DISALLOW_COPY_AND_ASSIGN(QuadHighlightTool); }; // ----------------------------------------------------------------------------- @@ -87,6 +88,8 @@ Member<Node> node, String selector_list, std::unique_ptr<InspectorHighlightConfig> highlight_config); + NodeHighlightTool(const NodeHighlightTool&) = delete; + NodeHighlightTool& operator=(const NodeHighlightTool&) = delete; std::unique_ptr<protocol::DictionaryValue> GetNodeInspectorHighlightAsJson( bool append_element_info, @@ -110,7 +113,6 @@ String selector_list_; std::unique_ptr<InspectorHighlightConfig> highlight_config_; InspectorHighlightContrastInfo contrast_info_; - DISALLOW_COPY_AND_ASSIGN(NodeHighlightTool); }; // ----------------------------------------------------------------------------- @@ -122,6 +124,8 @@ OverlayFrontend* frontend, Node* node, std::unique_ptr<InspectorSourceOrderConfig> source_order_config); + SourceOrderTool(const SourceOrderTool&) = delete; + SourceOrderTool& operator=(const SourceOrderTool&) = delete; std::unique_ptr<protocol::DictionaryValue> GetNodeInspectorSourceOrderHighlightAsJson() const; @@ -137,7 +141,6 @@ Member<Node> node_; std::unique_ptr<InspectorSourceOrderConfig> source_order_config_; - DISALLOW_COPY_AND_ASSIGN(SourceOrderTool); }; // ----------------------------------------------------------------------------- @@ -155,6 +158,9 @@ using InspectTool::InspectTool; public: + PersistentTool(const PersistentTool&) = delete; + PersistentTool& operator=(const PersistentTool&) = delete; + void Draw(float scale) override; bool IsEmpty(); void SetGridConfigs(GridConfigs); @@ -173,13 +179,14 @@ GridConfigs grid_node_highlights_; FlexContainerConfigs flex_container_configs_; ScrollSnapConfigs scroll_snap_configs_; - DISALLOW_COPY_AND_ASSIGN(PersistentTool); }; // ----------------------------------------------------------------------------- class NearbyDistanceTool : public InspectTool { public: + NearbyDistanceTool(const NearbyDistanceTool&) = delete; + NearbyDistanceTool& operator=(const NearbyDistanceTool&) = delete; void Trace(Visitor* visitor) const override; private: @@ -193,7 +200,6 @@ String GetOverlayName() override; Member<Node> hovered_node_; - DISALLOW_COPY_AND_ASSIGN(NearbyDistanceTool); }; // ----------------------------------------------------------------------------- @@ -201,11 +207,14 @@ class ShowViewSizeTool : public InspectTool { using InspectTool::InspectTool; + public: + ShowViewSizeTool(const ShowViewSizeTool&) = delete; + ShowViewSizeTool& operator=(const ShowViewSizeTool&) = delete; + private: bool ForwardEventsToOverlay() override; void Draw(float scale) override; String GetOverlayName() override; - DISALLOW_COPY_AND_ASSIGN(ShowViewSizeTool); }; // ----------------------------------------------------------------------------- @@ -213,12 +222,12 @@ class ScreenshotTool : public InspectTool { public: ScreenshotTool(InspectorOverlayAgent* overlay, OverlayFrontend* frontend); + ScreenshotTool(const ScreenshotTool&) = delete; + ScreenshotTool& operator=(const ScreenshotTool&) = delete; private: void Dispatch(const String& message) override; String GetOverlayName() override; - - DISALLOW_COPY_AND_ASSIGN(ScreenshotTool); }; // ----------------------------------------------------------------------------- @@ -232,6 +241,8 @@ : InspectTool(overlay, frontend), v8_session_(v8_session), message_(message) {} + PausedInDebuggerTool(const PausedInDebuggerTool&) = delete; + PausedInDebuggerTool& operator=(const PausedInDebuggerTool&) = delete; private: void Draw(float scale) override; @@ -239,7 +250,6 @@ String GetOverlayName() override; v8_inspector::V8InspectorSession* v8_session_; String message_; - DISALLOW_COPY_AND_ASSIGN(PausedInDebuggerTool); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspected_frames.h b/third_party/blink/renderer/core/inspector/inspected_frames.h index 763bc91..71c2e61 100644 --- a/third_party/blink/renderer/core/inspector/inspected_frames.h +++ b/third_party/blink/renderer/core/inspector/inspected_frames.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTED_FRAMES_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTED_FRAMES_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -37,6 +36,8 @@ }; explicit InspectedFrames(LocalFrame*); + InspectedFrames(const InspectedFrames&) = delete; + InspectedFrames& operator=(const InspectedFrames&) = delete; LocalFrame* Root() { return root_; } bool Contains(LocalFrame*) const; @@ -48,7 +49,6 @@ private: Member<LocalFrame> root_; - DISALLOW_COPY_AND_ASSIGN(InspectedFrames); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc index aa36959..b7449cc 100644 --- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
@@ -103,7 +103,11 @@ BuildObjectForAnimationEffect(KeyframeEffect* effect) { ComputedEffectTiming* computed_timing = effect->getComputedTiming(); double delay = computed_timing->delay(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + double duration = computed_timing->duration()->GetAsUnrestrictedDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) double duration = computed_timing->duration().GetAsUnrestrictedDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) String easing = effect->SpecifiedTiming().timing_function->ToString(); std::unique_ptr<protocol::Animation::AnimationEffect> animation_object = @@ -385,9 +389,14 @@ NonThrowableExceptionState exception_state; OptionalEffectTiming* timing = OptionalEffectTiming::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + timing->setDuration( + MakeGarbageCollected<V8UnionStringOrUnrestrictedDouble>(duration)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnrestrictedDoubleOrString unrestricted_duration; unrestricted_duration.SetUnrestrictedDouble(duration); timing->setDuration(unrestricted_duration); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) timing->setDelay(delay); animation->effect()->updateTiming(timing, exception_state); return Response::Success();
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.h b/third_party/blink/renderer/core/inspector/inspector_animation_agent.h index 4cf66c2..ede0395b 100644 --- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_ANIMATION_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_ANIMATION_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/animation/animation.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_keyframes_rule.h" @@ -26,6 +25,8 @@ InspectorAnimationAgent(InspectedFrames*, InspectorCSSAgent*, v8_inspector::V8InspectorSession*); + InspectorAnimationAgent(const InspectorAnimationAgent&) = delete; + InspectorAnimationAgent& operator=(const InspectorAnimationAgent&) = delete; // Base agent methods. void Restore() override; @@ -91,7 +92,6 @@ HashSet<String> cleared_animations_; InspectorAgentState::Boolean enabled_; InspectorAgentState::Double playback_rate_; - DISALLOW_COPY_AND_ASSIGN(InspectorAnimationAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h index 73e63e2d..799dd6aa 100644 --- a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_APPLICATION_CACHE_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_APPLICATION_CACHE_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" #include "third_party/blink/renderer/core/inspector/protocol/ApplicationCache.h" @@ -41,6 +40,10 @@ : public InspectorBaseAgent<protocol::ApplicationCache::Metainfo> { public: explicit InspectorApplicationCacheAgent(InspectedFrames*); + InspectorApplicationCacheAgent(const InspectorApplicationCacheAgent&) = + delete; + InspectorApplicationCacheAgent& operator=( + const InspectorApplicationCacheAgent&) = delete; ~InspectorApplicationCacheAgent() override = default; void Trace(Visitor*) const override; @@ -86,7 +89,6 @@ Member<InspectedFrames> inspected_frames_; InspectorAgentState::Boolean enabled_; - DISALLOW_COPY_AND_ASSIGN(InspectorApplicationCacheAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_agent.h b/third_party/blink/renderer/core/inspector/inspector_audits_agent.h index 5c5f4e8..ed8b220 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_audits_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_AUDITS_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_AUDITS_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/inspector/inspected_frames.h" @@ -24,6 +23,8 @@ explicit InspectorAuditsAgent(InspectorNetworkAgent*, InspectorIssueStorage*, InspectedFrames*); + InspectorAuditsAgent(const InspectorAuditsAgent&) = delete; + InspectorAuditsAgent& operator=(const InspectorAuditsAgent&) = delete; ~InspectorAuditsAgent() override; void Trace(Visitor*) const override; @@ -54,8 +55,6 @@ InspectorAgentState::Boolean enabled_; Member<InspectorNetworkAgent> network_agent_; Member<InspectedFrames> inspected_frames_; - - DISALLOW_COPY_AND_ASSIGN(InspectorAuditsAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index 05c9c63..a84bdfc3 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -27,7 +27,6 @@ #include <utility> -#include "base/macros.h" #include "third_party/blink/renderer/core/animation/css/css_animation_data.h" #include "third_party/blink/renderer/core/css/css_color.h" #include "third_party/blink/renderer/core/css/css_computed_style_declaration.h" @@ -231,13 +230,12 @@ class InspectorCSSAgent::StyleSheetAction : public InspectorHistory::Action { public: StyleSheetAction(const String& name) : InspectorHistory::Action(name) {} + StyleSheetAction(const StyleSheetAction&) = delete; + StyleSheetAction& operator=(const StyleSheetAction&) = delete; virtual std::unique_ptr<protocol::CSS::CSSStyle> TakeSerializedStyle() { return nullptr; } - - private: - DISALLOW_COPY_AND_ASSIGN(StyleSheetAction); }; class InspectorCSSAgent::SetStyleSheetTextAction final @@ -248,6 +246,8 @@ : InspectorCSSAgent::StyleSheetAction("SetStyleSheetText"), style_sheet_(style_sheet), text_(text) {} + SetStyleSheetTextAction(const SetStyleSheetTextAction&) = delete; + SetStyleSheetTextAction& operator=(const SetStyleSheetTextAction&) = delete; bool Perform(ExceptionState& exception_state) override { if (!style_sheet_->GetText(&old_text_)) @@ -285,7 +285,6 @@ Member<InspectorStyleSheetBase> style_sheet_; String text_; String old_text_; - DISALLOW_COPY_AND_ASSIGN(SetStyleSheetTextAction); }; class InspectorCSSAgent::ModifyRuleAction final @@ -309,6 +308,8 @@ new_text_(text), old_range_(range), css_rule_(nullptr) {} + ModifyRuleAction(const ModifyRuleAction&) = delete; + ModifyRuleAction& operator=(const ModifyRuleAction&) = delete; bool Perform(ExceptionState& exception_state) override { return Redo(exception_state); @@ -411,7 +412,6 @@ SourceRange old_range_; SourceRange new_range_; Member<CSSRule> css_rule_; - DISALLOW_COPY_AND_ASSIGN(ModifyRuleAction); }; class InspectorCSSAgent::SetElementStyleAction final @@ -422,6 +422,8 @@ : InspectorCSSAgent::StyleSheetAction("SetElementStyleAction"), style_sheet_(style_sheet), text_(text) {} + SetElementStyleAction(const SetElementStyleAction&) = delete; + SetElementStyleAction& operator=(const SetElementStyleAction&) = delete; bool Perform(ExceptionState& exception_state) override { return Redo(exception_state); @@ -462,7 +464,6 @@ Member<InspectorStyleSheetForInlineStyle> style_sheet_; String text_; String old_text_; - DISALLOW_COPY_AND_ASSIGN(SetElementStyleAction); }; class InspectorCSSAgent::AddRuleAction final @@ -475,6 +476,8 @@ style_sheet_(style_sheet), rule_text_(rule_text), location_(location) {} + AddRuleAction(const AddRuleAction&) = delete; + AddRuleAction& operator=(const AddRuleAction&) = delete; bool Perform(ExceptionState& exception_state) override { return Redo(exception_state); @@ -513,7 +516,6 @@ String old_text_; SourceRange location_; SourceRange added_range_; - DISALLOW_COPY_AND_ASSIGN(AddRuleAction); }; // static
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.h b/third_party/blink/renderer/core/inspector/inspector_css_agent.h index 949677f..43dc2320 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_CSS_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_CSS_AGENT_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_rule_list.h" @@ -114,6 +113,8 @@ InspectorNetworkAgent*, InspectorResourceContentLoader*, InspectorResourceContainer*); + InspectorCSSAgent(const InspectorCSSAgent&) = delete; + InspectorCSSAgent& operator=(const InspectorCSSAgent&) = delete; ~InspectorCSSAgent() override; void Trace(Visitor*) const override; @@ -391,7 +392,6 @@ friend class InspectorResourceContentLoaderCallback; friend class StyleSheetBinder; - DISALLOW_COPY_AND_ASSIGN(InspectorCSSAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.h b/third_party/blink/renderer/core/inspector/inspector_dom_agent.h index 826fa8b..cf90695 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
@@ -32,7 +32,6 @@ #include <memory> #include "base/callback.h" -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/core/core_export.h" @@ -102,6 +101,8 @@ InspectorDOMAgent(v8::Isolate*, InspectedFrames*, v8_inspector::V8InspectorSession*); + InspectorDOMAgent(const InspectorDOMAgent&) = delete; + InspectorDOMAgent& operator=(const InspectorDOMAgent&) = delete; ~InspectorDOMAgent() override; void Trace(Visitor*) const override; @@ -397,7 +398,6 @@ bool suppress_attribute_modified_event_; InspectorAgentState::Boolean enabled_; InspectorAgentState::Boolean capture_node_stack_traces_; - DISALLOW_COPY_AND_ASSIGN(InspectorDOMAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.h b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.h index c8228069..4496c0a 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_DOM_DEBUGGER_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_DOM_DEBUGGER_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/bindings/core/v8/v8_event_listener_info.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" @@ -67,6 +66,9 @@ InspectorDOMDebuggerAgent(v8::Isolate*, InspectorDOMAgent*, v8_inspector::V8InspectorSession*); + InspectorDOMDebuggerAgent(const InspectorDOMDebuggerAgent&) = delete; + InspectorDOMDebuggerAgent& operator=(const InspectorDOMDebuggerAgent&) = + delete; ~InspectorDOMDebuggerAgent() override; void Trace(Visitor*) const override; @@ -183,7 +185,6 @@ InspectorAgentState::BooleanMap xhr_breakpoints_; InspectorAgentState::BooleanMap event_listener_breakpoints_; InspectorAgentState::BooleanMap csp_violation_breakpoints_; - DISALLOW_COPY_AND_ASSIGN(InspectorDOMDebuggerAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h index 6bc2083..258ed89 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_DOM_SNAPSHOT_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_DOM_SNAPSHOT_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -29,6 +28,9 @@ : public InspectorBaseAgent<protocol::DOMSnapshot::Metainfo> { public: InspectorDOMSnapshotAgent(InspectedFrames*, InspectorDOMDebuggerAgent*); + InspectorDOMSnapshotAgent(const InspectorDOMSnapshotAgent&) = delete; + InspectorDOMSnapshotAgent& operator=(const InspectorDOMSnapshotAgent&) = + delete; ~InspectorDOMSnapshotAgent() override; void Trace(Visitor*) const override; @@ -135,8 +137,6 @@ Member<InspectedFrames> inspected_frames_; Member<InspectorDOMDebuggerAgent> dom_debugger_agent_; InspectorAgentState::Boolean enabled_; - - DISALLOW_COPY_AND_ASSIGN(InspectorDOMSnapshotAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h index 6faa428b..c2cd8f28 100644 --- a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_EMULATION_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_EMULATION_AGENT_H_ -#include "base/macros.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "third_party/blink/renderer/core/core_export.h" @@ -34,6 +33,8 @@ : public InspectorBaseAgent<protocol::Emulation::Metainfo> { public: explicit InspectorEmulationAgent(WebLocalFrameImpl*); + InspectorEmulationAgent(const InspectorEmulationAgent&) = delete; + InspectorEmulationAgent& operator=(const InspectorEmulationAgent&) = delete; ~InspectorEmulationAgent() override; // protocol::Dispatcher::EmulationCommandHandler implementation. @@ -159,7 +160,6 @@ InspectorAgentState::Boolean emulate_focus_; InspectorAgentState::String timezone_id_override_; InspectorAgentState::BooleanMap disabled_image_types_; - DISALLOW_COPY_AND_ASSIGN(InspectorEmulationAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc index 1d9b2d9a..f665010 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc +++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_color.h" #include "third_party/blink/renderer/core/css/css_computed_style_declaration.h" #include "third_party/blink/renderer/core/css/css_grid_auto_repeat_value.h" @@ -57,6 +56,8 @@ public: PathBuilder() : path_(protocol::ListValue::create()) {} + PathBuilder(const PathBuilder&) = delete; + PathBuilder& operator=(const PathBuilder&) = delete; virtual ~PathBuilder() = default; std::unique_ptr<protocol::ListValue> Release() { return std::move(path_); } @@ -82,7 +83,6 @@ size_t length); std::unique_ptr<protocol::ListValue> path_; - DISALLOW_COPY_AND_ASSIGN(PathBuilder); }; void PathBuilder::AppendPathCommandAndPoints(const char* command,
diff --git a/third_party/blink/renderer/core/inspector/inspector_history.h b/third_party/blink/renderer/core/inspector/inspector_history.h index 05ae27c..11dcb08 100644 --- a/third_party/blink/renderer/core/inspector/inspector_history.h +++ b/third_party/blink/renderer/core/inspector/inspector_history.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_HISTORY_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_HISTORY_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -69,6 +68,8 @@ }; InspectorHistory(); + InspectorHistory(const InspectorHistory&) = delete; + InspectorHistory& operator=(const InspectorHistory&) = delete; void Trace(Visitor*) const; bool Perform(Action*, ExceptionState&); @@ -82,8 +83,6 @@ private: HeapVector<Member<Action>> history_; wtf_size_t after_last_action_index_; - - DISALLOW_COPY_AND_ASSIGN(InspectorHistory); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_io_agent.h b/third_party/blink/renderer/core/inspector/inspector_io_agent.h index 61a5a961..f0613edb 100644 --- a/third_party/blink/renderer/core/inspector/inspector_io_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_io_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_IO_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_IO_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" #include "third_party/blink/renderer/core/inspector/protocol/IO.h" @@ -25,6 +24,8 @@ : public InspectorBaseAgent<protocol::IO::Metainfo> { public: InspectorIOAgent(v8::Isolate*, v8_inspector::V8InspectorSession*); + InspectorIOAgent(const InspectorIOAgent&) = delete; + InspectorIOAgent& operator=(const InspectorIOAgent&) = delete; ~InspectorIOAgent() override; private: @@ -36,7 +37,6 @@ v8::Isolate* isolate_; v8_inspector::V8InspectorSession* v8_session_; - DISALLOW_COPY_AND_ASSIGN(InspectorIOAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_issue_storage.h b/third_party/blink/renderer/core/inspector/inspector_issue_storage.h index c8ea667e..1db2c3b0 100644 --- a/third_party/blink/renderer/core/inspector/inspector_issue_storage.h +++ b/third_party/blink/renderer/core/inspector/inspector_issue_storage.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_ISSUE_STORAGE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_ISSUE_STORAGE_H_ -#include "base/macros.h" #include "third_party/blink/public/mojom/devtools/inspector_issue.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -27,6 +26,8 @@ class CORE_EXPORT InspectorIssueStorage { public: InspectorIssueStorage(); + InspectorIssueStorage(const InspectorIssueStorage&) = delete; + InspectorIssueStorage& operator=(const InspectorIssueStorage&) = delete; void AddInspectorIssue(CoreProbeSink*, InspectorIssue*); void AddInspectorIssue(CoreProbeSink*, mojom::blink::InspectorIssueInfoPtr); @@ -45,8 +46,6 @@ void AddInspectorIssue(CoreProbeSink*, std::unique_ptr<protocol::Audits::InspectorIssue>); Deque<std::unique_ptr<protocol::Audits::InspectorIssue>> issues_; - - DISALLOW_COPY_AND_ASSIGN(InspectorIssueStorage); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h index 6dd56908..93681c33 100644 --- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h
@@ -30,7 +30,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_LAYER_TREE_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_LAYER_TREE_AGENT_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -58,6 +57,8 @@ }; InspectorLayerTreeAgent(InspectedFrames*, Client*); + InspectorLayerTreeAgent(const InspectorLayerTreeAgent&) = delete; + InspectorLayerTreeAgent& operator=(const InspectorLayerTreeAgent&) = delete; ~InspectorLayerTreeAgent() override; void Trace(Visitor*) const override; @@ -121,7 +122,6 @@ typedef HashMap<String, scoped_refptr<PictureSnapshot>> SnapshotById; SnapshotById snapshot_by_id_; bool suppress_layer_paint_events_; - DISALLOW_COPY_AND_ASSIGN(InspectorLayerTreeAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.h b/third_party/blink/renderer/core/inspector/inspector_log_agent.h index 70f4b344..6e0f99d3 100644 --- a/third_party/blink/renderer/core/inspector/inspector_log_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_LOG_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_LOG_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/performance_monitor.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -27,6 +26,8 @@ InspectorLogAgent(ConsoleMessageStorage*, PerformanceMonitor*, v8_inspector::V8InspectorSession*); + InspectorLogAgent(const InspectorLogAgent&) = delete; + InspectorLogAgent& operator=(const InspectorLogAgent&) = delete; ~InspectorLogAgent() override; void Trace(Visitor*) const override; @@ -58,7 +59,6 @@ v8_inspector::V8InspectorSession* v8_session_; InspectorAgentState::Boolean enabled_; InspectorAgentState::DoubleMap violation_thresholds_; - DISALLOW_COPY_AND_ASSIGN(InspectorLogAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_media_agent.h b/third_party/blink/renderer/core/inspector/inspector_media_agent.h index bf10943..5d4c59d6 100644 --- a/third_party/blink/renderer/core/inspector/inspector_media_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_media_agent.h
@@ -20,6 +20,8 @@ : public InspectorBaseAgent<protocol::Media::Metainfo> { public: explicit InspectorMediaAgent(InspectedFrames*, WorkerGlobalScope*); + InspectorMediaAgent(const InspectorMediaAgent&) = delete; + InspectorMediaAgent& operator=(const InspectorMediaAgent&) = delete; ~InspectorMediaAgent() override; ExecutionContext* GetTargetExecutionContext() const; @@ -53,7 +55,6 @@ Member<WorkerGlobalScope> worker_global_scope_; InspectorAgentState::Boolean enabled_; - DISALLOW_COPY_AND_ASSIGN(InspectorMediaAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.h b/third_party/blink/renderer/core/inspector/inspector_memory_agent.h index 451a5cf7..00a2803 100644 --- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_MEMORY_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_MEMORY_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" #include "third_party/blink/renderer/core/inspector/protocol/Memory.h" @@ -44,6 +43,8 @@ : public InspectorBaseAgent<protocol::Memory::Metainfo> { public: explicit InspectorMemoryAgent(InspectedFrames*); + InspectorMemoryAgent(const InspectorMemoryAgent&) = delete; + InspectorMemoryAgent& operator=(const InspectorMemoryAgent&) = delete; ~InspectorMemoryAgent() override; void Trace(Visitor*) const override; @@ -75,7 +76,6 @@ HashMap<void*, String> symbols_cache_; InspectorAgentState::Integer sampling_profile_interval_; - DISALLOW_COPY_AND_ASSIGN(InspectorMemoryAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc index 76695faa..6f0acd88 100644 --- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -34,7 +34,6 @@ #include <utility> #include "base/containers/span.h" -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "build/build_config.h" #include "net/base/ip_address.h" @@ -190,6 +189,11 @@ FileReaderLoader::kReadByClient, this, std::move(task_runner)); } + InspectorFileReaderLoaderClient(const InspectorFileReaderLoaderClient&) = + delete; + InspectorFileReaderLoaderClient& operator=( + const InspectorFileReaderLoaderClient&) = delete; + ~InspectorFileReaderLoaderClient() override = default; void Start() { @@ -222,7 +226,6 @@ base::OnceCallback<void(scoped_refptr<SharedBuffer>)> callback_; std::unique_ptr<FileReaderLoader> loader_; scoped_refptr<SharedBuffer> raw_data_; - DISALLOW_COPY_AND_ASSIGN(InspectorFileReaderLoaderClient); }; static void ResponseBodyFileReaderLoaderDone( @@ -254,6 +257,9 @@ task_runner_(std::move(task_runner)), error_(false) {} + InspectorPostBodyParser(const InspectorPostBodyParser&) = delete; + InspectorPostBodyParser& operator=(const InspectorPostBodyParser&) = delete; + void Parse(EncodedFormData* request_body) { if (!request_body || request_body->IsEmpty()) return; @@ -314,7 +320,6 @@ const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; bool error_; Vector<String> parts_; - DISALLOW_COPY_AND_ASSIGN(InspectorPostBodyParser); }; KURL UrlWithoutFragment(const KURL& url) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h index 8bc6701..356589c 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
@@ -31,7 +31,6 @@ #include <v8-inspector.h> #include <memory> -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/platform/web_input_event_result.h" @@ -127,6 +126,8 @@ Color color, Color outline_color, InspectorOverlayAgent* overlay); + Hinge(const Hinge&) = delete; + Hinge& operator=(const Hinge&) = delete; ~Hinge() = default; String GetOverlayName(); void Draw(float scale); @@ -137,7 +138,6 @@ Color content_color_; Color outline_color_; Member<InspectorOverlayAgent> overlay_; - DISALLOW_COPY_AND_ASSIGN(Hinge); }; class CORE_EXPORT InspectorOverlayAgent final @@ -162,6 +162,8 @@ InspectedFrames*, v8_inspector::V8InspectorSession*, InspectorDOMAgent*); + InspectorOverlayAgent(const InspectorOverlayAgent&) = delete; + InspectorOverlayAgent& operator=(const InspectorOverlayAgent&) = delete; ~InspectorOverlayAgent() override; void Trace(Visitor*) const override; @@ -332,8 +334,6 @@ InspectorAgentState::String paused_in_debugger_message_; InspectorAgentState::String inspect_mode_; InspectorAgentState::Bytes inspect_mode_protocol_config_; - - DISALLOW_COPY_AND_ASSIGN(InspectorOverlayAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.h b/third_party/blink/renderer/core/inspector/inspector_page_agent.h index 271ac08..6332f7f8 100644 --- a/third_party/blink/renderer/core/inspector/inspector_page_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_PAGE_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_PAGE_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/public/mojom/v8_cache_options.mojom-blink.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -105,6 +104,8 @@ Client*, InspectorResourceContentLoader*, v8_inspector::V8InspectorSession*); + InspectorPageAgent(const InspectorPageAgent&) = delete; + InspectorPageAgent& operator=(const InspectorPageAgent&) = delete; // Page API for frontend protocol::Response enable() override; @@ -294,7 +295,6 @@ InspectorAgentState::Integer standard_font_size_; InspectorAgentState::Integer fixed_font_size_; InspectorAgentState::Boolean produce_compilation_cache_; - DISALLOW_COPY_AND_ASSIGN(InspectorPageAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_performance_agent.h b/third_party/blink/renderer/core/inspector/inspector_performance_agent.h index 0fa45182..37abe1f 100644 --- a/third_party/blink/renderer/core/inspector/inspector_performance_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_performance_agent.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/macros.h" #include "base/task/sequence_manager/task_time_observer.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -34,6 +33,9 @@ void Trace(Visitor*) const override; explicit InspectorPerformanceAgent(InspectedFrames*); + InspectorPerformanceAgent(const InspectorPerformanceAgent&) = delete; + InspectorPerformanceAgent& operator=(const InspectorPerformanceAgent&) = + delete; ~InspectorPerformanceAgent() override; void Restore() override; @@ -95,7 +97,6 @@ int layout_depth_ = 0; InspectorAgentState::Boolean enabled_; InspectorAgentState::Boolean use_thread_ticks_; - DISALLOW_COPY_AND_ASSIGN(InspectorPerformanceAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_performance_timeline_agent.h b/third_party/blink/renderer/core/inspector/inspector_performance_timeline_agent.h index 94c106d2..9f480ea 100644 --- a/third_party/blink/renderer/core/inspector/inspector_performance_timeline_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_performance_timeline_agent.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/macros.h" #include "base/task/sequence_manager/task_time_observer.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -24,6 +23,10 @@ : public InspectorBaseAgent<protocol::PerformanceTimeline::Metainfo> { public: explicit InspectorPerformanceTimelineAgent(InspectedFrames*); + InspectorPerformanceTimelineAgent(const InspectorPerformanceTimelineAgent&) = + delete; + InspectorPerformanceTimelineAgent& operator=( + const InspectorPerformanceTimelineAgent&) = delete; ~InspectorPerformanceTimelineAgent() override; // PerformanceTimeline probes implementation. @@ -47,7 +50,6 @@ Member<InspectedFrames> inspected_frames_; InspectorAgentState::Integer enabled_types_; - DISALLOW_COPY_AND_ASSIGN(InspectorPerformanceTimelineAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_resource_container.h b/third_party/blink/renderer/core/inspector/inspector_resource_container.h index 235bd6a..450fac7 100644 --- a/third_party/blink/renderer/core/inspector/inspector_resource_container.h +++ b/third_party/blink/renderer/core/inspector/inspector_resource_container.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_RESOURCE_CONTAINER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_RESOURCE_CONTAINER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -23,6 +22,9 @@ : public GarbageCollected<InspectorResourceContainer> { public: explicit InspectorResourceContainer(InspectedFrames*); + InspectorResourceContainer(const InspectorResourceContainer&) = delete; + InspectorResourceContainer& operator=(const InspectorResourceContainer&) = + delete; ~InspectorResourceContainer(); void Trace(Visitor*) const; @@ -40,7 +42,6 @@ Member<InspectedFrames> inspected_frames_; HashMap<String, String> style_sheet_contents_; HashMap<DOMNodeId, String> style_element_contents_; - DISALLOW_COPY_AND_ASSIGN(InspectorResourceContainer); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h index eee476b..d5a0ced 100644 --- a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h +++ b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_RESOURCE_CONTENT_LOADER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_RESOURCE_CONTENT_LOADER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/loader/fetch/resource.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -23,6 +22,10 @@ : public GarbageCollected<InspectorResourceContentLoader> { public: explicit InspectorResourceContentLoader(LocalFrame*); + InspectorResourceContentLoader(const InspectorResourceContentLoader&) = + delete; + InspectorResourceContentLoader& operator=( + const InspectorResourceContentLoader&) = delete; ~InspectorResourceContentLoader(); void Dispose(); void Trace(Visitor*) const; @@ -53,7 +56,6 @@ int last_client_id_; friend class ResourceClient; - DISALLOW_COPY_AND_ASSIGN(InspectorResourceContentLoader); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_task_runner.h b/third_party/blink/renderer/core/inspector/inspector_task_runner.h index 7fe3431..37ea524 100644 --- a/third_party/blink/renderer/core/inspector/inspector_task_runner.h +++ b/third_party/blink/renderer/core/inspector/inspector_task_runner.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_TASK_RUNNER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_TASK_RUNNER_H_ -#include "base/macros.h" #include "base/single_thread_task_runner.h" #include "base/thread_annotations.h" #include "third_party/blink/renderer/core/core_export.h" @@ -35,6 +34,9 @@ return base::AdoptRef(new InspectorTaskRunner(isolate_task_runner)); } + InspectorTaskRunner(const InspectorTaskRunner&) = delete; + InspectorTaskRunner& operator=(const InspectorTaskRunner&) = delete; + // Must be called on the isolate's thread. void InitIsolate(v8::Isolate*) LOCKS_EXCLUDED(mutex_); // Can be disposed from any thread. @@ -78,7 +80,6 @@ v8::Isolate* isolate_ GUARDED_BY(mutex_) = nullptr; Deque<Task> interrupting_task_queue_; bool disposed_ GUARDED_BY(mutex_) = false; - DISALLOW_COPY_AND_ASSIGN(InspectorTaskRunner); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.h b/third_party/blink/renderer/core/inspector/inspector_trace_events.h index 1976e6c..f397c84 100644 --- a/third_party/blink/renderer/core/inspector/inspector_trace_events.h +++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/macros.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/bindings/core/v8/script_streamer.h" #include "third_party/blink/renderer/core/animation/compositor_animations.h" @@ -86,6 +85,8 @@ : public GarbageCollected<InspectorTraceEvents> { public: InspectorTraceEvents() = default; + InspectorTraceEvents(const InspectorTraceEvents&) = delete; + InspectorTraceEvents& operator=(const InspectorTraceEvents&) = delete; void WillSendRequest(DocumentLoader*, const KURL& fetch_context_url, @@ -136,9 +137,6 @@ void FrameStartedLoading(LocalFrame*); void Trace(Visitor*) const {} - - private: - DISALLOW_COPY_AND_ASSIGN(InspectorTraceEvents); }; // Helper macros for emitting devtools.timeline events, taking the name of the
diff --git a/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.h b/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.h index 245b7845..f0f9475 100644 --- a/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.h +++ b/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_LEGACY_DOM_SNAPSHOT_AGENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_LEGACY_DOM_SNAPSHOT_AGENT_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" @@ -26,6 +25,8 @@ public: using OriginUrlMap = WTF::HashMap<DOMNodeId, String>; LegacyDOMSnapshotAgent(InspectorDOMDebuggerAgent*, OriginUrlMap*); + LegacyDOMSnapshotAgent(const LegacyDOMSnapshotAgent&) = delete; + LegacyDOMSnapshotAgent& operator=(const LegacyDOMSnapshotAgent&) = delete; ~LegacyDOMSnapshotAgent(); void Restore(); @@ -99,7 +100,6 @@ OriginUrlMap* origin_url_map_; using DocumentOrderMap = HeapHashMap<Member<Document>, int>; InspectorDOMDebuggerAgent* dom_debugger_agent_; - DISALLOW_COPY_AND_ASSIGN(LegacyDOMSnapshotAgent); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/locale_controller.h b/third_party/blink/renderer/core/inspector/locale_controller.h index a432c7f..5b5ecdf 100644 --- a/third_party/blink/renderer/core/inspector/locale_controller.h +++ b/third_party/blink/renderer/core/inspector/locale_controller.h
@@ -13,6 +13,9 @@ public: static LocaleController& instance(); + LocaleController(const LocaleController&) = delete; + LocaleController& operator=(const LocaleController&) = delete; + String SetLocaleOverride(const String& locale); bool has_locale_override() const; @@ -22,7 +25,6 @@ String embedder_locale_; String locale_override_; - DISALLOW_COPY_AND_ASSIGN(LocaleController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/main_thread_debugger.h b/third_party/blink/renderer/core/inspector/main_thread_debugger.h index 747c186..dd48c12f 100644 --- a/third_party/blink/renderer/core/inspector/main_thread_debugger.h +++ b/third_party/blink/renderer/core/inspector/main_thread_debugger.h
@@ -32,7 +32,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_MAIN_THREAD_DEBUGGER_H_ #include <memory> -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/document_lifecycle.h" #include "third_party/blink/renderer/core/inspector/thread_debugger.h" @@ -61,6 +60,8 @@ }; explicit MainThreadDebugger(v8::Isolate*); + MainThreadDebugger(const MainThreadDebugger&) = delete; + MainThreadDebugger& operator=(const MainThreadDebugger&) = delete; ~MainThreadDebugger() override; static MainThreadDebugger* Instance(); @@ -120,7 +121,6 @@ static MainThreadDebugger* instance_; std::unique_ptr<DocumentLifecycle::PostponeTransitionScope> postponed_transition_scope_; - DISALLOW_COPY_AND_ASSIGN(MainThreadDebugger); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/thread_debugger.cc b/third_party/blink/renderer/core/inspector/thread_debugger.cc index c49c52a..1e66794 100644 --- a/third_party/blink/renderer/core/inspector/thread_debugger.cc +++ b/third_party/blink/renderer/core/inspector/thread_debugger.cc
@@ -486,6 +486,8 @@ v8::Local<v8::Value> value = info[0]; Node* node = V8Node::ToImplWithTypeCheck(isolate, value); + if (node && !node->GetLayoutObject()) + return; if (auto* element = DynamicTo<Element>(node)) { V8SetReturnValueString(info, element->computedName(), isolate); } @@ -501,6 +503,8 @@ v8::Local<v8::Value> value = info[0]; Node* node = V8Node::ToImplWithTypeCheck(isolate, value); + if (node && !node->GetLayoutObject()) + return; if (auto* element = DynamicTo<Element>(node)) { V8SetReturnValueString(info, element->computedRole(), isolate); }
diff --git a/third_party/blink/renderer/core/inspector/thread_debugger.h b/third_party/blink/renderer/core/inspector/thread_debugger.h index b9014a6..e643c176 100644 --- a/third_party/blink/renderer/core/inspector/thread_debugger.h +++ b/third_party/blink/renderer/core/inspector/thread_debugger.h
@@ -6,7 +6,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_THREAD_DEBUGGER_H_ #include <memory> -#include "base/macros.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h" @@ -26,6 +25,8 @@ public V8PerIsolateData::Data { public: explicit ThreadDebugger(v8::Isolate*); + ThreadDebugger(const ThreadDebugger&) = delete; + ThreadDebugger& operator=(const ThreadDebugger&) = delete; ~ThreadDebugger() override; static ThreadDebugger* From(v8::Isolate*); @@ -120,7 +121,6 @@ Vector<std::unique_ptr<TaskRunnerTimer<ThreadDebugger>>> timers_; Vector<v8_inspector::V8InspectorClient::TimerCallback> timer_callbacks_; Vector<void*> timer_data_; - DISALLOW_COPY_AND_ASSIGN(ThreadDebugger); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h index 4473f86f..ce1ff5c 100644 --- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h +++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
@@ -32,7 +32,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_WORKER_INSPECTOR_CONTROLLER_H_ #include "base/callback.h" -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/unguessable_token.h" #include "third_party/blink/renderer/core/inspector/devtools_agent.h" @@ -69,6 +68,9 @@ WorkerThreadDebugger*, scoped_refptr<InspectorTaskRunner>, std::unique_ptr<WorkerDevToolsParams>); + WorkerInspectorController(const WorkerInspectorController&) = delete; + WorkerInspectorController& operator=(const WorkerInspectorController&) = + delete; ~WorkerInspectorController() override; void Trace(Visitor*) const; @@ -110,8 +112,6 @@ base::UnguessableToken parent_devtools_token_; KURL url_; const PlatformThreadId worker_thread_id_; - - DISALLOW_COPY_AND_ASSIGN(WorkerInspectorController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/worker_thread_debugger.h b/third_party/blink/renderer/core/inspector/worker_thread_debugger.h index 0730ec71..2a132e0 100644 --- a/third_party/blink/renderer/core/inspector/worker_thread_debugger.h +++ b/third_party/blink/renderer/core/inspector/worker_thread_debugger.h
@@ -31,7 +31,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_WORKER_THREAD_DEBUGGER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_WORKER_THREAD_DEBUGGER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/inspector/thread_debugger.h" @@ -45,6 +44,8 @@ class CORE_EXPORT WorkerThreadDebugger final : public ThreadDebugger { public: explicit WorkerThreadDebugger(v8::Isolate*); + WorkerThreadDebugger(const WorkerThreadDebugger&) = delete; + WorkerThreadDebugger& operator=(const WorkerThreadDebugger&) = delete; ~WorkerThreadDebugger() override; static WorkerThreadDebugger* From(v8::Isolate*); @@ -92,8 +93,6 @@ int paused_context_group_id_; WTF::HashMap<int, WorkerThread*> worker_threads_; - - DISALLOW_COPY_AND_ASSIGN(WorkerThreadDebugger); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc index 1622705..091bc39c 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
@@ -133,9 +133,26 @@ } } -void ParseThresholds(const DoubleOrDoubleSequence& threshold_parameter, - Vector<float>& thresholds, - ExceptionState& exception_state) { +void ParseThresholds( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const V8UnionDoubleOrDoubleSequence* threshold_parameter, +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const DoubleOrDoubleSequence& threshold_parameter, +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + Vector<float>& thresholds, + ExceptionState& exception_state) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (threshold_parameter->GetContentType()) { + case V8UnionDoubleOrDoubleSequence::ContentType::kDouble: + thresholds.push_back( + base::MakeClampedNum<float>(threshold_parameter->GetAsDouble())); + break; + case V8UnionDoubleOrDoubleSequence::ContentType::kDoubleSequence: + for (auto threshold_value : threshold_parameter->GetAsDoubleSequence()) + thresholds.push_back(base::MakeClampedNum<float>(threshold_value)); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (threshold_parameter.IsDouble()) { thresholds.push_back( base::MakeClampedNum<float>(threshold_parameter.GetAsDouble())); @@ -143,6 +160,7 @@ for (auto threshold_value : threshold_parameter.GetAsDoubleSequence()) thresholds.push_back(base::MakeClampedNum<float>(threshold_value)); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (thresholds.IsEmpty()) thresholds.push_back(0.f); @@ -174,11 +192,24 @@ IntersectionObserverDelegate& delegate, ExceptionState& exception_state) { Node* root = nullptr; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (observer_init->root()) { + switch (observer_init->root()->GetContentType()) { + case V8UnionDocumentOrElement::ContentType::kDocument: + root = observer_init->root()->GetAsDocument(); + break; + case V8UnionDocumentOrElement::ContentType::kElement: + root = observer_init->root()->GetAsElement(); + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (observer_init->root().IsElement()) { root = observer_init->root().GetAsElement(); } else if (observer_init->root().IsDocument()) { root = observer_init->root().GetAsDocument(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DOMHighResTimeStamp delay = 0; bool track_visibility = false;
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc index ecced03..f4555398 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer_test.cc
@@ -87,7 +87,11 @@ Element* root = GetDocument().getElementById("root"); ASSERT_TRUE(root); IntersectionObserverInit* observer_init = IntersectionObserverInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + observer_init->setRoot(MakeGarbageCollected<V8UnionDocumentOrElement>(root)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) observer_init->setRoot(ElementOrDocument::FromElement(root)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; TestIntersectionObserverDelegate* observer_delegate = MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument()); @@ -133,7 +137,12 @@ ->GetFrame() ->GetDocument(); IntersectionObserverInit* observer_init = IntersectionObserverInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + observer_init->setRoot( + MakeGarbageCollected<V8UnionDocumentOrElement>(iframe_document)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) observer_init->setRoot(ElementOrDocument::FromDocument(iframe_document)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; TestIntersectionObserverDelegate* observer_delegate = MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument()); @@ -545,7 +554,11 @@ Persistent<Element> target = GetDocument().getElementById("target1"); Persistent<IntersectionObserverInit> observer_init = IntersectionObserverInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + observer_init->setRoot(MakeGarbageCollected<V8UnionDocumentOrElement>(root)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) observer_init->setRoot(ElementOrDocument::FromElement(root)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Persistent<TestIntersectionObserverDelegate> observer_delegate = MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument()); Persistent<IntersectionObserver> observer = @@ -707,7 +720,11 @@ Element* target2 = GetDocument().getElementById("target2"); IntersectionObserverInit* observer_init = IntersectionObserverInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + observer_init->setRoot(MakeGarbageCollected<V8UnionDocumentOrElement>(root)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) observer_init->setRoot(ElementOrDocument::FromElement(root)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; TestIntersectionObserverDelegate* observer_delegate = MakeGarbageCollected<TestIntersectionObserverDelegate>(GetDocument());
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index a5178e8..d635d56c 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -2317,7 +2317,7 @@ // If this box has an associated layout-result, rebuild the spine of the // fragment-tree to ensure consistency. LayoutBlock* cb = this; - while (NGBlockNode::CanUseNewLayout(*cb) && !cb->NeedsLayout()) { + while (cb->PhysicalFragmentCount() && !cb->NeedsLayout()) { // Create and set a new identical results. for (auto& layout_result : cb->layout_results_) { layout_result =
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc index 09fe372..2227735b 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -4497,7 +4497,7 @@ return; auto* flow_thread = LayoutMultiColumnFlowThread::CreateAnonymous( - GetDocument(), StyleRef(), !CanTraversePhysicalFragments()); + GetDocument(), StyleRef(), !IsLayoutNGObject()); AddChild(flow_thread); pagination_state_changed_ = true; if (IsLayoutNGObject()) {
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index ecbe8033..abbd2f6 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -441,7 +441,7 @@ PaintLayerType LayoutBox::LayerTypeRequired() const { NOT_DESTROYED(); if (IsStacked() || HasHiddenBackface() || - (StyleRef().SpecifiesColumns() && !CanTraversePhysicalFragments()) || + (StyleRef().SpecifiesColumns() && !IsLayoutNGObject()) || IsEffectiveRootScroller()) return kNormalPaintLayer;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index e7679c3..74b43fa 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -183,6 +183,33 @@ return nullptr; } +inline bool MightTraversePhysicalFragments(const LayoutObject& obj) { + if (!RuntimeEnabledFeatures::LayoutNGFragmentTraversalEnabled()) + return false; + if (!obj.IsLayoutNGObject()) { + // Non-NG objects should be painted, hit-tested, etc. by legacy. + if (obj.IsBox()) + return false; + // Non-LayoutBox objects (such as LayoutInline) don't necessarily create NG + // LayoutObjects. If they are laid out by an NG container, though, we may be + // allowed to traverse their fragments. We can't check that at this point + // (potentially before initial layout), though. Unless there are other + // reasons that prevent us from allowing fragment traversal, we'll + // optimistically return true now, and check later. + } + // The NG paint system currently doesn't support replaced content. + if (obj.IsLayoutReplaced()) + return false; + // The NG paint system currently doesn't support table-cells. + if (obj.IsTableCellLegacy()) + return false; + // Text controls have some logic in the layout objects that will be missed if + // we traverse the fragment tree when hit-testing. + if (obj.IsTextControlIncludingNG()) + return false; + return true; +} + } // namespace static int g_allow_destroying_layout_object_in_finalizer = 0; @@ -3684,6 +3711,9 @@ // FIXME: We should DCHECK(isRooted()) here but generated content makes some // out-of-order insertion. + bitfields_.SetMightTraversePhysicalFragments( + MightTraversePhysicalFragments(*this)); + // Keep our layer hierarchy updated. Optimize for the common case where we // don't have any children and don't have a layer attached to ourselves. PaintLayer* layer = nullptr;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index 684667b..c7bc7bc 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2016,11 +2016,19 @@ // object, when it comes to painting, hit-testing and other layout read // operations. If false is returned, we need to traverse the layout object // tree instead. - // - // It is not allowed to call this method on a non-LayoutBox object, unless its - // containing block is an NG object (e.g. not allowed to call it on a - // LayoutInline that's contained by a legacy LayoutBlockFlow). - inline bool CanTraversePhysicalFragments() const; + bool CanTraversePhysicalFragments() const { + NOT_DESTROYED(); + + if (!bitfields_.MightTraversePhysicalFragments()) + return false; + + // Non-LayoutBox objects (such as LayoutInline) don't necessarily create NG + // LayoutObjects. We'll allow traversing their fragments if they are laid + // out by an NG container. + if (!IsBox()) + return IsInLayoutNGInlineFormattingContext(); + return true; + } // Return true if |this| produces one or more inline fragments, including // whitespace-only text fragments. @@ -3863,6 +3871,7 @@ should_skip_next_layout_shift_tracking_(true), should_assume_paint_offset_translation_for_layout_shift_tracking_( false), + might_traverse_physical_fragments_(false), positioned_state_(kIsStaticallyPositioned), selection_state_(static_cast<unsigned>(SelectionState::kNone)), subtree_paint_property_update_reasons_( @@ -4192,6 +4201,11 @@ should_assume_paint_offset_translation_for_layout_shift_tracking_, ShouldAssumePaintOffsetTranslationForLayoutShiftTracking); + // True if there's a possibility that we can walk NG fragment children of + // this object. False if we definitely need to walk the LayoutObject tree. + ADD_BOOLEAN_BITFIELD(might_traverse_physical_fragments_, + MightTraversePhysicalFragments); + private: // This is the cached 'position' value of this object // (see ComputedStyle::position). @@ -4376,32 +4390,6 @@ return IsBeforeContent() || IsAfterContent(); } -inline bool LayoutObject::CanTraversePhysicalFragments() const { - if (LIKELY(!RuntimeEnabledFeatures::LayoutNGFragmentTraversalEnabled())) - return false; - // Non-NG objects should be painted by legacy. - if (!IsLayoutNGObject()) { - if (IsBox()) - return false; - // Non-LayoutBox objects (such as LayoutInline) don't necessarily create NG - // LayoutObjects. If they are laid out by an NG container, though, we may be - // allowed to traverse their fragments. Otherwise, bail now. - if (!IsInLayoutNGInlineFormattingContext()) - return false; - } - // The NG paint system currently doesn't support replaced content. - if (IsLayoutReplaced()) - return false; - // The NG paint system currently doesn't support table-cells. - if (IsTableCellLegacy()) - return false; - // Text controls have some logic in the layout objects that will be missed if - // we traverse the fragment tree when hit-testing. - if (IsTextControlIncludingNG()) - return false; - return true; -} - // setNeedsLayout() won't cause full paint invalidations as // setNeedsLayoutAndFullPaintInvalidation() does. Otherwise the two methods are // identical.
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index edc9f7d..36af097 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -64,6 +64,7 @@ #include "third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h" #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h" +#include "third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h" #include "third_party/blink/renderer/core/layout/text_autosizer.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/platform/fonts/character_range.h" @@ -2390,6 +2391,9 @@ const FrameSelection& frame_selection = GetFrame()->Selection(); if (IsInLayoutNGInlineFormattingContext()) { + float scaling_factor = 1.0f; + if (const auto* svg_inline_text = DynamicTo<LayoutSVGInlineText>(this)) + scaling_factor = svg_inline_text->ScalingFactor(); PhysicalRect rect; NGInlineCursor cursor(*ContainingNGBlockFlow()); for (cursor.MoveTo(*this); cursor; cursor.MoveToNextForSameLayoutObject()) { @@ -2400,6 +2404,12 @@ if (status.start == status.end) continue; PhysicalRect item_rect = cursor.CurrentLocalSelectionRectForText(status); + // TODO(tkent): Apply bounding box transform. + // See svg/text/text-selection-path-01-b.svg. + if (scaling_factor != 1.0f) { + item_rect.offset.Scale(1 / scaling_factor); + item_rect.size.Scale(1 / scaling_factor); + } item_rect.offset += cursor.Current().OffsetInContainerFragment(); rect.Unite(item_rect); }
diff --git a/third_party/blink/renderer/core/layout/line/abstract_inline_text_box.cc b/third_party/blink/renderer/core/layout/line/abstract_inline_text_box.cc index cbf40a2..d08aaba 100644 --- a/third_party/blink/renderer/core/layout/line/abstract_inline_text_box.cc +++ b/third_party/blink/renderer/core/layout/line/abstract_inline_text_box.cc
@@ -172,7 +172,7 @@ // return a more exact offset in our formatting context. Otherwise, we need to // approximate the offset using our associated layout object. if (node && node->IsTextNode()) { - const Position position(node, int{offset_in_parent}); + const Position position(node, static_cast<int>(offset_in_parent)); LayoutBlockFlow* formatting_context = NGOffsetMapping::GetInlineFormattingContextOf(position); // If "formatting_context" is not a Layout NG object, the offset mappings @@ -254,7 +254,8 @@ TextBreakIterator* it = WordBreakIterator(text, 0, text.length()); absl::optional<int> word_start; - for (int offset = 0; offset != kTextBreakDone && offset < int{text.length()}; + for (int offset = 0; + offset != kTextBreakDone && offset < static_cast<int>(text.length()); offset = it->following(offset)) { // Unlike in ICU's WordBreakIterator, a word boundary is valid only if it is // before, or immediately preceded by, an alphanumeric character, a series
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc index ddb79d4a..f30c6ed 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
@@ -853,6 +853,10 @@ DCHECK_EQ(1u, text.length()); if (!offset || UNLIKELY(IsRtl(Style().Direction()))) return LayoutUnit(); + if (Type() == kSvgText) { + return LayoutUnit(IsHorizontal() ? SvgFragmentData()->rect.Width() + : SvgFragmentData()->rect.Height()); + } return IsHorizontal() ? Size().width : Size().height; } @@ -885,22 +889,28 @@ PhysicalRect NGFragmentItem::LocalRect(StringView text, unsigned start_offset, unsigned end_offset) const { - if (start_offset == StartOffset() && end_offset == EndOffset()) - return LocalRect(); + LayoutUnit width = Size().width; + LayoutUnit height = Size().height; + if (Type() == kSvgText) { + width = LayoutUnit(SvgFragmentData()->rect.Size().Width()); + height = LayoutUnit(SvgFragmentData()->rect.Size().Height()); + } + if (start_offset == StartOffset() && end_offset == EndOffset()) { + return {LayoutUnit(), LayoutUnit(), width, height}; + } LayoutUnit start_position, end_position; std::tie(start_position, end_position) = LineLeftAndRightForOffsets(text, start_offset, end_offset); const LayoutUnit inline_size = end_position - start_position; switch (GetWritingMode()) { case WritingMode::kHorizontalTb: - return {start_position, LayoutUnit(), inline_size, Size().height}; + return {start_position, LayoutUnit(), inline_size, height}; case WritingMode::kVerticalRl: case WritingMode::kVerticalLr: case WritingMode::kSidewaysRl: - return {LayoutUnit(), start_position, Size().width, inline_size}; + return {LayoutUnit(), start_position, width, inline_size}; case WritingMode::kSidewaysLr: - return {LayoutUnit(), Size().height - end_position, Size().width, - inline_size}; + return {LayoutUnit(), height - end_position, width, inline_size}; } NOTREACHED(); return {};
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h index 881520a..05c5cb1 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
@@ -375,6 +375,7 @@ // Compute line-relative coordinates for given offsets, this is not // flow-relative: + // This returns scaled values for kSVGText type. // https://drafts.csswg.org/css-writing-modes-3/#line-directions std::pair<LayoutUnit, LayoutUnit> LineLeftAndRightForOffsets( StringView text, @@ -383,6 +384,7 @@ // The layout box of text in (start, end) range in local coordinate. // Start and end offsets must be between StartOffset() and EndOffset(). + // This returns a scaled PhysicalRect for kSVGText type. PhysicalRect LocalRect(StringView text, unsigned start_offset, unsigned end_offset) const;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc index 7e42c3f..e439edd 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -450,6 +450,8 @@ const PhysicalRect selection_rect = CurrentLocalRect(selection_status.start, selection_status.end); LogicalRect logical_rect = Current().ConvertChildToLogical(selection_rect); + if (Current()->Type() == NGFragmentItem::kSvgText) + return Current().ConvertChildToPhysical(logical_rect); // Let LocalRect for line break have a space width to paint line break // when it is only character in a line or only selected in a line. if (selection_status.start != selection_status.end &&
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc index 1151294..b5a2bb5 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc
@@ -295,8 +295,9 @@ // TODO(layout-dev): This could likely be optimized further. // TODO(layout-dev): Handle cases where the old items are not consecutive. const ComputedStyle& new_style = layout_text->StyleRef(); - bool collapse_spaces = new_style.CollapseWhiteSpace(); - bool preserve_newlines = new_style.PreserveNewline(); + const bool collapse_spaces = new_style.CollapseWhiteSpace(); + const bool preserve_newlines = + new_style.PreserveNewline() && LIKELY(!is_text_combine_); if (NGInlineItem* last_item = LastItemToCollapseWith(items_)) { if (collapse_spaces) { switch (last_item->EndCollapseType()) { @@ -465,6 +466,13 @@ if (UNLIKELY(layout_text->IsWordBreak())) { typename OffsetMappingBuilder::SourceNodeScope scope(&mapping_builder_, layout_text); + if (UNLIKELY(is_text_combine_)) { + // We don't break text runs in text-combine-upright:all. + // Note: Even if we have overflow-wrap:normal and word-break:keep-all, + // <wbr> causes line break. + Append(NGInlineItem::kText, kZeroWidthSpaceCharacter, layout_text); + return; + } AppendBreakOpportunity(layout_text); return; } @@ -502,7 +510,9 @@ const ComputedStyle& style = layout_object->StyleRef(); EWhiteSpace whitespace = style.WhiteSpace(); - bool is_svg_text = layout_object && layout_object->IsSVGInlineText(); + const bool should_not_preserve_newline = + (layout_object && layout_object->IsSVGInlineText()) || + UNLIKELY(is_text_combine_); RestoreTrailingCollapsibleSpaceIfRemoved(); @@ -510,7 +520,8 @@ return; if (!ComputedStyle::CollapseWhiteSpace(whitespace)) AppendPreserveWhitespace(string, &style, layout_object); - else if (ComputedStyle::PreserveNewline(whitespace) && !is_svg_text) + else if (ComputedStyle::PreserveNewline(whitespace) && + !should_not_preserve_newline) AppendPreserveNewline(string, &style, layout_object); else AppendCollapseWhitespace(string, &style, layout_object); @@ -579,7 +590,11 @@ // LayoutBR does not set preserve_newline, but should be preserved. if (UNLIKELY(space_run_has_newline && string.length() == 1 && layout_object && layout_object->IsBR())) { - AppendForcedBreakCollapseWhitespace(layout_object); + if (UNLIKELY(is_text_combine_)) { + AppendTextItem(" ", layout_object); + } else { + AppendForcedBreakCollapseWhitespace(layout_object); + } return; } @@ -751,6 +766,8 @@ const ComputedStyle& style, unsigned index) const { DCHECK_LE(index, string.length()); + if (UNLIKELY(is_text_combine_)) + return false; // Check if we are at a preserved space character and auto-wrap is enabled. if (style.CollapseWhiteSpace() || !style.AutoWrap() || !string.length() || index >= string.length() || string[index] != kSpaceCharacter) @@ -806,6 +823,11 @@ UChar c = string[start]; if (IsControlItemCharacter(c)) { if (c == kNewlineCharacter) { + if (UNLIKELY(is_text_combine_)) { + start++; + AppendTextItem(" ", layout_object); + continue; + } AppendForcedBreak(layout_object); start++; // A forced break is not a collapsible space, but following collapsible @@ -870,6 +892,9 @@ void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::AppendForcedBreak( LayoutObject* layout_object) { DCHECK(layout_object); + // Combined text should ignore force line break[1]. + // [1] https://drafts.csswg.org/css-writing-modes-3/#text-combine-layout + DCHECK(!is_text_combine_); // At the forced break, add bidi controls to pop all contexts. // https://drafts.csswg.org/css-writing-modes-3/#bidi-embedding-breaks if (!bidi_context_.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h index e0ce1a02..cbc0ad67 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_INLINE_NG_INLINE_ITEMS_BUILDER_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/layout_block_flow.h" #include "third_party/blink/renderer/core/layout/ng/inline/empty_offset_mapping_builder.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_offset_mapping_builder.h" @@ -51,7 +52,8 @@ const SvgTextChunkOffsets* chunk_offsets = nullptr) : block_flow_(block_flow), items_(items), - text_chunk_offsets_(chunk_offsets) {} + text_chunk_offsets_(chunk_offsets), + is_text_combine_(block_flow_->IsLayoutNGTextCombine()) {} ~NGInlineItemsBuilderTemplate(); LayoutBlockFlow* GetLayoutBlockFlow() const { return block_flow_; } @@ -185,6 +187,7 @@ const SvgTextChunkOffsets* text_chunk_offsets_; + const bool is_text_combine_; bool has_bidi_controls_ = false; bool has_ruby_ = false; bool is_empty_inline_ = true;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc index 4f2e9af0..33de3d2 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -1000,57 +1000,7 @@ if (block->IsNGSVGText()) { // SVG <text> doesn't support reusing the previous result now. previous_data = nullptr; - - // Build NGInlineItems and NGOffsetMapping first. They are used only by - // NGSVGTextLayoutAttributesBuilder, and are discarded because they might - // be different from final ones. - Vector<NGInlineItem> items; - items.ReserveCapacity(EstimateInlineItemsCount(*block)); - NGInlineItemsBuilderForOffsetMapping items_builder(block, &items); - NGOffsetMappingBuilder& mapping_builder = - items_builder.GetOffsetMappingBuilder(); - mapping_builder.ReserveCapacity(EstimateOffsetMappingItemsCount(*block)); - CollectInlinesInternal(&items_builder, nullptr); - String ifc_text_content = items_builder.ToString(); - - NGSvgTextLayoutAttributesBuilder svg_attr_builder(*this); - svg_attr_builder.Build(ifc_text_content, items); - - auto svg_data = std::make_unique<SvgInlineNodeData>(); - svg_data->character_data_list = svg_attr_builder.CharacterDataList(); - svg_data->text_length_range_list = svg_attr_builder.TextLengthRangeList(); - svg_data->text_path_range_list = svg_attr_builder.TextPathRangeList(); - data->svg_node_data_ = std::move(svg_data); - - // Compute DOM offsets of text chunks. - mapping_builder.SetDestinationString(ifc_text_content); - std::unique_ptr<NGOffsetMapping> mapping = mapping_builder.Build(); - // Index in a UTF-32 sequence - unsigned last_addressable = 0; - // Index in a UTF-16 sequence for last_addressable. - unsigned text_content_offset = 0; - for (const auto& char_data : data->svg_node_data_->character_data_list) { - if (!char_data.second.anchored_chunk) - continue; - unsigned addressable_offset = char_data.first; - if (addressable_offset == 0u) - continue; - while (last_addressable < addressable_offset) { - ++last_addressable; - ++text_content_offset; - if (text_content_offset < ifc_text_content.length() && - U16_IS_LEAD(ifc_text_content[text_content_offset - 1]) && - U16_IS_TRAIL(ifc_text_content[text_content_offset])) - ++text_content_offset; - } - const auto* unit = mapping->GetLastMappingUnit(text_content_offset); - auto result = data->svg_node_data_->chunk_offsets.insert( - To<LayoutText>(&unit->GetLayoutObject()), Vector<unsigned>()); - result.stored_value->value.push_back( - unit->ConvertTextContentToFirstDOMOffset(text_content_offset)); - } - if (data->svg_node_data_->chunk_offsets.size() > 0) - chunk_offsets = &data->svg_node_data_->chunk_offsets; + chunk_offsets = FindSvgTextChunks(*block, *data); } data->items.ReserveCapacity(EstimateInlineItemsCount(*block)); @@ -1062,6 +1012,62 @@ UseCounter::Count(GetDocument(), WebFeature::kUnicodeBidiPlainText); } +const SvgTextChunkOffsets* NGInlineNode::FindSvgTextChunks( + LayoutBlockFlow& block, + NGInlineNodeData& data) const { + // Build NGInlineItems and NGOffsetMapping first. They are used only by + // NGSVGTextLayoutAttributesBuilder, and are discarded because they might + // be different from final ones. + Vector<NGInlineItem> items; + items.ReserveCapacity(EstimateInlineItemsCount(block)); + NGInlineItemsBuilderForOffsetMapping items_builder(&block, &items); + NGOffsetMappingBuilder& mapping_builder = + items_builder.GetOffsetMappingBuilder(); + mapping_builder.ReserveCapacity(EstimateOffsetMappingItemsCount(block)); + CollectInlinesInternal(&items_builder, nullptr); + String ifc_text_content = items_builder.ToString(); + + NGSvgTextLayoutAttributesBuilder svg_attr_builder(*this); + svg_attr_builder.Build(ifc_text_content, items); + + auto svg_data = std::make_unique<SvgInlineNodeData>(); + svg_data->character_data_list = svg_attr_builder.CharacterDataList(); + svg_data->text_length_range_list = svg_attr_builder.TextLengthRangeList(); + svg_data->text_path_range_list = svg_attr_builder.TextPathRangeList(); + data.svg_node_data_ = std::move(svg_data); + + // Compute DOM offsets of text chunks. + mapping_builder.SetDestinationString(ifc_text_content); + std::unique_ptr<NGOffsetMapping> mapping = mapping_builder.Build(); + // Index in a UTF-32 sequence + unsigned last_addressable = 0; + // Index in a UTF-16 sequence for last_addressable. + unsigned text_content_offset = 0; + for (const auto& char_data : data.svg_node_data_->character_data_list) { + if (!char_data.second.anchored_chunk) + continue; + unsigned addressable_offset = char_data.first; + if (addressable_offset == 0u) + continue; + while (last_addressable < addressable_offset) { + ++last_addressable; + ++text_content_offset; + if (text_content_offset < ifc_text_content.length() && + U16_IS_LEAD(ifc_text_content[text_content_offset - 1]) && + U16_IS_TRAIL(ifc_text_content[text_content_offset])) + ++text_content_offset; + } + const auto* unit = mapping->GetLastMappingUnit(text_content_offset); + auto result = data.svg_node_data_->chunk_offsets.insert( + To<LayoutText>(&unit->GetLayoutObject()), Vector<unsigned>()); + result.stored_value->value.push_back( + unit->ConvertTextContentToFirstDOMOffset(text_content_offset)); + } + return data.svg_node_data_->chunk_offsets.size() > 0 + ? &data.svg_node_data_->chunk_offsets + : nullptr; +} + void NGInlineNode::SegmentText(NGInlineNodeData* data) const { SegmentBidiRuns(data); SegmentScriptRuns(data);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h index 3bc7840..6040a4f4 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
@@ -149,6 +149,8 @@ void CollectInlines(NGInlineNodeData*, NGInlineNodeData* previous_data = nullptr) const; + const SvgTextChunkOffsets* FindSvgTextChunks(LayoutBlockFlow& block, + NGInlineNodeData& data) const; void SegmentText(NGInlineNodeData*) const; void SegmentScriptRuns(NGInlineNodeData*) const; void SegmentFontOrientation(NGInlineNodeData*) const;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc index e0193942..6c1ac86 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -93,7 +93,10 @@ SetupHtml("t", "<div id=t style='font:10px Ahem'>test</div>"); } - NGInlineNodeForTest CreateInlineNode() { + NGInlineNodeForTest CreateInlineNode( + LayoutNGBlockFlow* layout_block_flow = nullptr) { + if (layout_block_flow) + layout_block_flow_ = layout_block_flow; if (!layout_block_flow_) SetupHtml("t", "<div id=t style='font:10px'>test</div>"); NGInlineNodeForTest node(layout_block_flow_); @@ -311,6 +314,54 @@ EXPECT_EQ(6u, items.size()); } +TEST_F(NGInlineNodeTest, CollectInlinesTextCombineBR) { + ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + InsertStyleElement( + "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); + SetupHtml("t", u"<div id=t>a<br>z</div>"); + NGInlineNodeForTest node = + CreateInlineNode(To<LayoutNGBlockFlow>(layout_object_)); + node.CollectInlines(); + EXPECT_EQ("a z", node.Text()); + Vector<NGInlineItem>& items = node.Items(); + ASSERT_EQ(3u, items.size()); + TEST_ITEM_TYPE_OFFSET(items[0], kText, 0u, 1u); + TEST_ITEM_TYPE_OFFSET(items[1], kText, 1u, 2u) << "<br> isn't control"; + TEST_ITEM_TYPE_OFFSET(items[2], kText, 2u, 3u); +} + +TEST_F(NGInlineNodeTest, CollectInlinesTextCombineNewline) { + ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + InsertStyleElement( + "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); + SetupHtml("t", u"<pre id=t>a\nz</pre>"); + NGInlineNodeForTest node = + CreateInlineNode(To<LayoutNGBlockFlow>(layout_object_)); + node.CollectInlines(); + EXPECT_EQ("a z", node.Text()); + Vector<NGInlineItem>& items = node.Items(); + ASSERT_EQ(3u, items.size()); + TEST_ITEM_TYPE_OFFSET(items[0], kText, 0u, 1u); + TEST_ITEM_TYPE_OFFSET(items[1], kText, 1u, 2u) << "newline isn't control"; + TEST_ITEM_TYPE_OFFSET(items[2], kText, 2u, 3u); +} + +TEST_F(NGInlineNodeTest, CollectInlinesTextCombineWBR) { + ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + InsertStyleElement( + "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); + SetupHtml("t", u"<div id=t>a<wbr>z</div>"); + NGInlineNodeForTest node = + CreateInlineNode(To<LayoutNGBlockFlow>(layout_object_)); + node.CollectInlines(); + EXPECT_EQ(u8"a\u200Bz", node.Text()); + Vector<NGInlineItem>& items = node.Items(); + ASSERT_EQ(3u, items.size()); + TEST_ITEM_TYPE_OFFSET(items[0], kText, 0u, 1u); + TEST_ITEM_TYPE_OFFSET(items[1], kText, 1u, 2u) << "<wbr> isn't control"; + TEST_ITEM_TYPE_OFFSET(items[2], kText, 2u, 3u); +} + TEST_F(NGInlineNodeTest, SegmentASCII) { NGInlineNodeForTest node = CreateInlineNode(); node.Append("Hello", layout_object_);
diff --git a/third_party/blink/renderer/core/layout/scrollbars_test.cc b/third_party/blink/renderer/core/layout/scrollbars_test.cc index 4581f076..e68020a 100644 --- a/third_party/blink/renderer/core/layout/scrollbars_test.cc +++ b/third_party/blink/renderer/core/layout/scrollbars_test.cc
@@ -449,7 +449,7 @@ ENABLE_OVERLAY_SCROLLBARS(true); WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600)); - WebView().SetBaseBackgroundColor(SK_ColorTRANSPARENT); + WebView().SetPageBaseBackgroundColor(SK_ColorTRANSPARENT); SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML(
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc index f63262b..0a91911 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -23,8 +23,6 @@ using mojom::blink::ViewportStatus; static constexpr int kSmallFontThreshold = 9; -const base::Feature kBadTapTargetsRatio{"BadTapTargetsRatio", - base::FEATURE_DISABLED_BY_DEFAULT}; static constexpr int kTimeBudgetExceeded = -2; // Finding bad tap targets may takes too time for big page and should abort if @@ -36,7 +34,6 @@ : frame_view_(&frame_view), font_size_check_enabled_(frame_view_->GetFrame().GetWidgetForLocalRoot()), tap_target_check_enabled_( - base::FeatureList::IsEnabled(kBadTapTargetsRatio) && frame_view_->GetFrame().GetWidgetForLocalRoot()), viewport_scalar_( font_size_check_enabled_
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h index ad8d7b7..4cd1af3 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h
@@ -9,14 +9,14 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/heap/member.h" -#include "third_party/blink/renderer/platform/heap/visitor.h" namespace blink { + class LocalFrameView; class LayoutObject; -struct ViewportDescription; +class Visitor; -CORE_EXPORT extern const base::Feature kBadTapTargetsRatio; +struct ViewportDescription; // Calculates the mobile usability of current page, especially friendliness on // smart phone devices are checked. The calculated value will be sent as a part
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc index 5ac03d34c..c3f538e 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker_test.cc
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" -#include "base/test/scoped_feature_list.h" #include "third_party/blink/public/common/mobile_metrics/mobile_friendliness.h" #include "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom-shared.h" #include "third_party/blink/public/web/web_settings.h" @@ -26,10 +25,6 @@ url_test_helpers::UnregisterAllURLsAndClearMemoryCache(); } - void SetUp() override { - scoped_feature_list_.InitWithFeatures({kBadTapTargetsRatio}, {}); - } - static void ConfigureAndroidSettings(WebSettings* settings) { settings->SetViewportEnabled(true); settings->SetViewportMetaEnabled(true); @@ -83,7 +78,6 @@ } private: - base::test::ScopedFeatureList scoped_feature_list_; ScopedTestingPlatformSupport<TestingPlatformSupport> platform_; };
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc index ae472fe..4eabee7 100644 --- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc +++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
@@ -467,12 +467,8 @@ return ResourceProvider(); } -void OffscreenCanvas::DidDraw() { - DidDraw(FloatRect(0, 0, Size().Width(), Size().Height())); -} - -void OffscreenCanvas::DidDraw(const FloatRect& rect) { - if (rect.IsEmpty()) +void OffscreenCanvas::DidDraw(const SkIRect& rect) { + if (rect.isEmpty()) return; if (HasPlaceholderCanvas()) {
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h index 7872b6e..9f54b3f8 100644 --- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h +++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
@@ -113,8 +113,8 @@ bool PushFrameIfNeeded(); bool PushFrame(scoped_refptr<CanvasResource> frame, const SkIRect& damage_rect) override; - void DidDraw(const FloatRect&) override; - void DidDraw() override; + void DidDraw(const SkIRect&) override; + using CanvasRenderingContextHost::DidDraw; void Commit(scoped_refptr<CanvasResource> bitmap_image, const SkIRect& damage_rect) override; bool ShouldAccelerate2dContext() const override;
diff --git a/third_party/blink/renderer/core/page/autoscroll_controller_test.cc b/third_party/blink/renderer/core/page/autoscroll_controller_test.cc index 187976f8..b1a7b0b9bd 100644 --- a/third_party/blink/renderer/core/page/autoscroll_controller_test.cc +++ b/third_party/blink/renderer/core/page/autoscroll_controller_test.cc
@@ -26,7 +26,7 @@ TEST_F(AutoscrollControllerTest, CrashWhenLayoutStopAnimationBeforeScheduleAnimation) { WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600)); - WebView().SetBaseBackgroundColor(SK_ColorTRANSPARENT); + WebView().SetPageBaseBackgroundColor(SK_ColorTRANSPARENT); SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML(
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h index ed7659e..650c9bd4 100644 --- a/third_party/blink/renderer/core/page/chrome_client.h +++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -118,9 +118,9 @@ using CompositorElementId = cc::ElementId; class CORE_EXPORT ChromeClient : public GarbageCollected<ChromeClient> { - DISALLOW_COPY_AND_ASSIGN(ChromeClient); - public: + ChromeClient(const ChromeClient&) = delete; + ChromeClient& operator=(const ChromeClient&) = delete; virtual ~ChromeClient() = default; virtual WebViewImpl* GetWebView() const = 0;
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.h b/third_party/blink/renderer/core/page/context_menu_controller.h index b12cdd5..008ded23 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.h +++ b/third_party/blink/renderer/core/page/context_menu_controller.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CONTEXT_MENU_CONTROLLER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_CONTEXT_MENU_CONTROLLER_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/common/input/web_menu_source_type.h" #include "third_party/blink/public/mojom/context_menu/context_menu.mojom-blink.h" @@ -49,6 +48,8 @@ public mojom::blink::ContextMenuClient { public: explicit ContextMenuController(Page*); + ContextMenuController(const ContextMenuController&) = delete; + ContextMenuController operator=(const ContextMenuController&) = delete; ~ContextMenuController() override; void Trace(Visitor*) const; @@ -138,8 +139,6 @@ Member<ContextMenuProvider> menu_provider_; HitTestResult hit_test_result_; Member<Node> image_selection_cached_result_; - - DISALLOW_COPY_AND_ASSIGN(ContextMenuController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/drag_controller.h b/third_party/blink/renderer/core/page/drag_controller.h index 498edf2..5b3df061 100644 --- a/third_party/blink/renderer/core/page/drag_controller.h +++ b/third_party/blink/renderer/core/page/drag_controller.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_DRAG_CONTROLLER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_DRAG_CONTROLLER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" @@ -57,6 +56,8 @@ public ExecutionContextLifecycleObserver { public: explicit DragController(Page*); + DragController(const DragController&) = delete; + DragController& operator=(const DragController&) = delete; ui::mojom::blink::DragOperation DragEnteredOrUpdated(DragData*, LocalFrame& local_root); @@ -139,7 +140,6 @@ DragDestinationAction drag_destination_action_; bool did_initiate_drag_; - DISALLOW_COPY_AND_ASSIGN(DragController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/drag_image.h b/third_party/blink/renderer/core/page/drag_image.h index 11d947d..a6b8cacf 100644 --- a/third_party/blink/renderer/core/page/drag_image.h +++ b/third_party/blink/renderer/core/page/drag_image.h
@@ -28,7 +28,6 @@ #include <memory> -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/geometry/float_size.h" #include "third_party/blink/renderer/platform/geometry/int_size.h" @@ -62,6 +61,9 @@ const String& label, const FontDescription& system_font, float device_scale_factor); + + DragImage(const DragImage&) = delete; + DragImage& operator=(const DragImage&) = delete; ~DragImage(); static FloatSize ClampedImageScale(const IntSize&, @@ -80,8 +82,6 @@ SkBitmap bitmap_; float resolution_scale_; InterpolationQuality interpolation_quality_; - - DISALLOW_COPY_AND_ASSIGN(DragImage); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/drag_state.h b/third_party/blink/renderer/core/page/drag_state.h index f9fc509..4ef9d75 100644 --- a/third_party/blink/renderer/core/page/drag_state.h +++ b/third_party/blink/renderer/core/page/drag_state.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_DRAG_STATE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_DRAG_STATE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/page/drag_actions.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -38,6 +37,8 @@ class DragState final : public GarbageCollected<DragState> { public: DragState() = default; + DragState(const DragState&) = delete; + DragState& operator=(const DragState&) = delete; // Element that may be a drag source, for the current mouse gesture. Member<Node> drag_src_; @@ -49,9 +50,6 @@ visitor->Trace(drag_src_); visitor->Trace(drag_data_transfer_); } - - private: - DISALLOW_COPY_AND_ASSIGN(DragState); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/focus_controller.h b/third_party/blink/renderer/core/page/focus_controller.h index 7f1e618..02cc440 100644 --- a/third_party/blink/renderer/core/page/focus_controller.h +++ b/third_party/blink/renderer/core/page/focus_controller.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_FOCUS_CONTROLLER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_FOCUS_CONTROLLER_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" @@ -54,6 +53,8 @@ using OwnerMap = HeapHashMap<Member<ContainerNode>, Member<Element>>; explicit FocusController(Page*); + FocusController(const FocusController&) = delete; + FocusController& operator=(const FocusController&) = delete; void SetFocusedFrame(Frame*, bool notify_embedder = true); void FocusDocumentView(Frame*, bool notify_embedder = true); @@ -129,7 +130,6 @@ bool is_changing_focused_frame_; bool is_emulating_focus_; HeapHashSet<WeakMember<FocusChangedObserver>> focus_changed_observers_; - DISALLOW_COPY_AND_ASSIGN(FocusController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/frame_tree.h b/third_party/blink/renderer/core/page/frame_tree.h index a99e25f..169d2568 100644 --- a/third_party/blink/renderer/core/page/frame_tree.h +++ b/third_party/blink/renderer/core/page/frame_tree.h
@@ -21,7 +21,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_FRAME_TREE_H_ #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" @@ -37,6 +36,8 @@ public: explicit FrameTree(Frame* this_frame); + FrameTree(const FrameTree&) = delete; + FrameTree& operator=(const FrameTree&) = delete; ~FrameTree(); const AtomicString& GetName() const; @@ -109,8 +110,6 @@ // TODO(shuuran): remove this once we have gathered the data bool cross_site_cross_browsing_context_group_set_nulled_name_; - - DISALLOW_COPY_AND_ASSIGN(FrameTree); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h index 9a219bef..0a22204ae 100644 --- a/third_party/blink/renderer/core/page/page.h +++ b/third_party/blink/renderer/core/page/page.h
@@ -26,7 +26,6 @@ #include <memory> #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "base/types/pass_key.h" #include "third_party/blink/public/mojom/devtools/inspector_issue.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/text_autosizer_page_info.mojom-blink.h" @@ -118,6 +117,8 @@ ChromeClient& chrome_client, scheduler::WebAgentGroupScheduler& agent_group_scheduler, bool is_ordinary); + Page(const Page&) = delete; + Page& operator=(const Page&) = delete; ~Page() override; void CloseSoon(); @@ -496,8 +497,6 @@ mojom::blink::TextAutosizerPageInfo web_text_autosizer_page_info_; WebScopedVirtualTimePauser history_navigation_virtual_time_pauser_; - - DISALLOW_COPY_AND_ASSIGN(Page); }; extern template class CORE_EXTERN_TEMPLATE_EXPORT Supplement<Page>;
diff --git a/third_party/blink/renderer/core/page/plugin_data.h b/third_party/blink/renderer/core/page/plugin_data.h index 8dc24f5..310319d4 100644 --- a/third_party/blink/renderer/core/page/plugin_data.h +++ b/third_party/blink/renderer/core/page/plugin_data.h
@@ -21,7 +21,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_DATA_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_DATA_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/graphics/color.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -93,6 +92,8 @@ void Trace(Visitor*) const; PluginData() = default; + PluginData(const PluginData&) = delete; + PluginData& operator=(const PluginData&) = delete; const HeapVector<Member<PluginInfo>>& Plugins() const { return plugins_; } const HeapVector<Member<MimeClassInfo>>& Mimes() const { return mimes_; } @@ -112,8 +113,6 @@ HeapVector<Member<PluginInfo>> plugins_; HeapVector<Member<MimeClassInfo>> mimes_; scoped_refptr<const SecurityOrigin> main_frame_origin_; - - DISALLOW_COPY_AND_ASSIGN(PluginData); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h b/third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h index 8ee2203..99b6cd6 100644 --- a/third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h +++ b/third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_SCRIPT_FORBIDDEN_SCOPE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_PLUGIN_SCRIPT_FORBIDDEN_SCOPE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -43,12 +42,12 @@ public: PluginScriptForbiddenScope(); + PluginScriptForbiddenScope(const PluginScriptForbiddenScope&) = delete; + PluginScriptForbiddenScope& operator=(const PluginScriptForbiddenScope&) = + delete; ~PluginScriptForbiddenScope(); static bool IsForbidden(); - - private: - DISALLOW_COPY_AND_ASSIGN(PluginScriptForbiddenScope); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/pointer_lock_controller.h b/third_party/blink/renderer/core/page/pointer_lock_controller.h index 35cb3aa1..f2caf84d 100644 --- a/third_party/blink/renderer/core/page/pointer_lock_controller.h +++ b/third_party/blink/renderer/core/page/pointer_lock_controller.h
@@ -26,7 +26,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_POINTER_LOCK_CONTROLLER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_POINTER_LOCK_CONTROLLER_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/public/mojom/input/pointer_lock_context.mojom-blink.h" #include "third_party/blink/public/mojom/input/pointer_lock_result.mojom-blink-forward.h" @@ -54,6 +53,8 @@ : public GarbageCollected<PointerLockController> { public: explicit PointerLockController(Page*); + PointerLockController(const PointerLockController&) = delete; + PointerLockController& operator=(const PointerLockController&) = delete; using ResultCallback = base::OnceCallback<void(mojom::blink::PointerLockResult)>; @@ -124,8 +125,6 @@ FloatPoint pointer_lock_screen_position_; bool current_unadjusted_movement_setting_ = false; - - DISALLOW_COPY_AND_ASSIGN(PointerLockController); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/print_context.h b/third_party/blink/renderer/core/page/print_context.h index dcb12b15..6922db6 100644 --- a/third_party/blink/renderer/core/page/print_context.h +++ b/third_party/blink/renderer/core/page/print_context.h
@@ -137,14 +137,14 @@ public: explicit ScopedPrintContext(LocalFrame*); + ScopedPrintContext(const ScopedPrintContext&) = delete; + ScopedPrintContext& operator=(const ScopedPrintContext&) = delete; ~ScopedPrintContext(); PrintContext* operator->() const { return context_; } private: PrintContext* context_; - - DISALLOW_COPY_AND_ASSIGN(ScopedPrintContext); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scoped_page_pauser.h b/third_party/blink/renderer/core/page/scoped_page_pauser.h index 5e34428f..9be24a4d 100644 --- a/third_party/blink/renderer/core/page/scoped_page_pauser.h +++ b/third_party/blink/renderer/core/page/scoped_page_pauser.h
@@ -20,7 +20,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCOPED_PAGE_PAUSER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCOPED_PAGE_PAUSER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -34,6 +33,8 @@ public: explicit ScopedPagePauser(); + ScopedPagePauser(const ScopedPagePauser&) = delete; + ScopedPagePauser& operator=(const ScopedPagePauser&) = delete; ~ScopedPagePauser(); private: @@ -43,7 +44,6 @@ static bool IsActive(); std::unique_ptr<ThreadScheduler::RendererPauseHandle> pause_handle_; - DISALLOW_COPY_AND_ASSIGN(ScopedPagePauser); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h index 3c38470..48f0cab6 100644 --- a/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h
@@ -35,6 +35,8 @@ bool should_scroll); ElementFragmentAnchor(Node& anchor_node, LocalFrame& frame); + ElementFragmentAnchor(const ElementFragmentAnchor&) = delete; + ElementFragmentAnchor& operator=(const ElementFragmentAnchor&) = delete; ~ElementFragmentAnchor() override = default; // Will attempt to scroll the anchor into view. @@ -75,8 +77,6 @@ // Invoke has no effect and the fragment can be disposed (unless focus is // still needed). bool needs_invoke_ = false; - - DISALLOW_COPY_AND_ASSIGN(ElementFragmentAnchor); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h b/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h index 0cc04b4..f234b179 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h +++ b/third_party/blink/renderer/core/page/scrolling/scroll_customization_callbacks.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLL_CUSTOMIZATION_CALLBACKS_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLL_CUSTOMIZATION_CALLBACKS_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" @@ -19,6 +18,10 @@ : public GarbageCollected<ScrollCustomizationCallbacks> { public: ScrollCustomizationCallbacks() = default; + ScrollCustomizationCallbacks(const ScrollCustomizationCallbacks&) = delete; + ScrollCustomizationCallbacks& operator=(const ScrollCustomizationCallbacks&) = + delete; + void SetDistributeScroll(Node*, ScrollStateCallback*); ScrollStateCallback* GetDistributeScroll(Node*); void SetApplyScroll(Node*, ScrollStateCallback*); @@ -39,8 +42,6 @@ ScrollStateCallbackList apply_scroll_callbacks_; ScrollStateCallbackList distribute_scroll_callbacks_; HeapHashMap<WeakMember<Node>, bool> in_scrolling_phase_; - - DISALLOW_COPY_AND_ASSIGN(ScrollCustomizationCallbacks); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h index cdae7058..a4ccbf16 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h
@@ -28,7 +28,6 @@ #include <memory> -#include "base/macros.h" #include "base/memory/weak_ptr.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/scroll/scroll_types.h" @@ -64,6 +63,8 @@ public CompositorScrollCallbacks { public: explicit ScrollingCoordinator(Page*); + ScrollingCoordinator(const ScrollingCoordinator&) = delete; + ScrollingCoordinator& operator=(const ScrollingCoordinator&) = delete; ~ScrollingCoordinator() override; void Trace(Visitor*) const; @@ -149,8 +150,6 @@ ScrollbarMap vertical_scrollbars_; base::WeakPtrFactory<ScrollingCoordinator> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(ScrollingCoordinator); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h index a4b1b926f..149d332 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h
@@ -22,8 +22,11 @@ USING_FAST_MALLOC(ScrollingCoordinatorContext); public: - ScrollingCoordinatorContext() {} - virtual ~ScrollingCoordinatorContext() {} + ScrollingCoordinatorContext() = default; + ScrollingCoordinatorContext(const ScrollingCoordinatorContext&) = delete; + ScrollingCoordinatorContext& operator=(const ScrollingCoordinatorContext&) = + delete; + virtual ~ScrollingCoordinatorContext() = default; void SetAnimationTimeline( std::unique_ptr<CompositorAnimationTimeline> timeline) { @@ -39,8 +42,6 @@ private: std::unique_ptr<CompositorAnimationTimeline> animation_timeline_; cc::AnimationHost* animation_host_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(ScrollingCoordinatorContext); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h index 98f72b3..4aed25c2 100644 --- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h +++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SNAP_COORDINATOR_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SNAP_COORDINATOR_H_ -#include "base/macros.h" #include "cc/input/scroll_snap_data.h" #include "cc/input/snap_selection_strategy.h" #include "third_party/blink/renderer/core/core_export.h" @@ -35,6 +34,8 @@ : public GarbageCollected<SnapCoordinator> { public: explicit SnapCoordinator(); + SnapCoordinator(const SnapCoordinator&) = delete; + SnapCoordinator& operator=(const SnapCoordinator&) = delete; ~SnapCoordinator(); void Trace(Visitor* visitor) const {} @@ -82,8 +83,6 @@ // Used for reporting to UMA when snapping on the initial layout affects the // initial scroll position. bool did_first_resnap_all_containers_ = false; - - DISALLOW_COPY_AND_ASSIGN(SnapCoordinator); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h index c520078..6e17b6c 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h
@@ -61,6 +61,8 @@ const Vector<TextFragmentSelector>& text_fragment_selectors, LocalFrame& frame, bool should_scroll); + TextFragmentAnchor(const TextFragmentAnchor&) = delete; + TextFragmentAnchor& operator=(const TextFragmentAnchor&) = delete; ~TextFragmentAnchor() override = default; bool Invoke() override; @@ -148,8 +150,6 @@ } beforematch_state_ = kNoMatchFound; Member<TextFragmentAnchorMetrics> metrics_; - - DISALLOW_COPY_AND_ASSIGN(TextFragmentAnchor); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.h index aa346b00..62e9fc80 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.h +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.h
@@ -25,6 +25,8 @@ public blink::mojom::blink::TextFragmentReceiver { public: explicit TextFragmentHandler(LocalFrame* main_frame); + TextFragmentHandler(const TextFragmentHandler&) = delete; + TextFragmentHandler& operator=(const TextFragmentHandler&) = delete; // Determine if |result| represents a click on an existing highlight. static bool IsOverTextFragment(HitTestResult result); @@ -103,8 +105,6 @@ HeapMojoReceiver<blink::mojom::blink::TextFragmentReceiver, TextFragmentHandler> selector_producer_{this, nullptr}; - - DISALLOW_COPY_AND_ASSIGN(TextFragmentHandler); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h index 8762de09..2d54bc5 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h
@@ -37,6 +37,9 @@ public: explicit TextFragmentSelectorGenerator(LocalFrame* main_frame); + TextFragmentSelectorGenerator(const TextFragmentSelectorGenerator&) = delete; + TextFragmentSelectorGenerator& operator=( + const TextFragmentSelectorGenerator&) = delete; // Requests a TextFragmentSelector be generated for the selection of DOM // specified by |range|. Will be generated asynchronously and returned by @@ -170,8 +173,6 @@ base::TimeTicks generation_start_time_; Member<TextFragmentFinder> finder_; - - DISALLOW_COPY_AND_ASSIGN(TextFragmentSelectorGenerator); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc index 3ef4c701..1f0a9f3 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_text_fragment_painter.cc
@@ -172,15 +172,17 @@ PhysicalRect box_rect = ComputeBoxRect(cursor_, paint_offset, parent_offset_); IntRect visual_rect; - const LayoutSVGInlineText* svg_inline_text = nullptr; + const auto* const svg_inline_text = + DynamicTo<LayoutSVGInlineText>(layout_object); float scaling_factor = 1.0f; - if (text_item.Type() == NGFragmentItem::kSvgText) { - svg_inline_text = To<LayoutSVGInlineText>(layout_object); + if (UNLIKELY(svg_inline_text)) { + DCHECK_EQ(text_item.Type(), NGFragmentItem::kSvgText); scaling_factor = svg_inline_text->ScalingFactor(); DCHECK_NE(scaling_factor, 0.0f); visual_rect = EnclosingIntRect( svg_inline_text->Parent()->VisualRectInLocalSVGCoordinates()); } else { + DCHECK_NE(text_item.Type(), NGFragmentItem::kSvgText); PhysicalRect ink_overflow = text_item.SelfInkOverflow(); ink_overflow.Move(box_rect.offset); visual_rect = EnclosingIntRect(ink_overflow); @@ -194,7 +196,7 @@ AsDisplayItemClient(cursor_, selection.has_value()); // Ensure the selection bounds are recorded on the paint chunk regardless of - // whether the diplay item that contains the actual selection painting is + // whether the display item that contains the actual selection painting is // reused. absl::optional<SelectionBoundsRecorder> selection_recorder; if (UNLIKELY(selection && paint_info.phase == PaintPhase::kForeground && @@ -213,12 +215,14 @@ } if (paint_info.phase != PaintPhase::kTextClip) { - if (DrawingRecorder::UseCachedDrawingIfPossible( - paint_info.context, display_item_client, paint_info.phase)) { - return; + if (LIKELY(!paint_info.context.InDrawingRecorder())) { + if (DrawingRecorder::UseCachedDrawingIfPossible( + paint_info.context, display_item_client, paint_info.phase)) { + return; + } + recorder.emplace(paint_info.context, display_item_client, + paint_info.phase, visual_rect); } - recorder.emplace(paint_info.context, display_item_client, paint_info.phase, - visual_rect); } if (UNLIKELY(text_item.IsSymbolMarker())) {
diff --git a/third_party/blink/renderer/core/paint/object_paint_invalidator.h b/third_party/blink/renderer/core/paint/object_paint_invalidator.h index c4afc37..bc53051b 100644 --- a/third_party/blink/renderer/core/paint/object_paint_invalidator.h +++ b/third_party/blink/renderer/core/paint/object_paint_invalidator.h
@@ -7,7 +7,6 @@ #include "base/auto_reset.h" #include "base/dcheck_is_on.h" -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/graphics/paint/display_item_client.h" #include "third_party/blink/renderer/platform/graphics/paint_invalidation_reason.h"
diff --git a/third_party/blink/renderer/core/paint/paint_controller_paint_test.cc b/third_party/blink/renderer/core/paint/paint_controller_paint_test.cc index e176942..0c543f7 100644 --- a/third_party/blink/renderer/core/paint/paint_controller_paint_test.cc +++ b/third_party/blink/renderer/core/paint/paint_controller_paint_test.cc
@@ -128,10 +128,10 @@ <div id='div4' style='top: 9000px; left: 9000px'></div> )HTML"); - const auto& div1 = *GetLayoutObjectByElementId("div1"); - const auto& div2 = *GetLayoutObjectByElementId("div2"); - const auto& div3 = *GetLayoutObjectByElementId("div3"); - const auto& div4 = *GetLayoutObjectByElementId("div4"); + const auto& div1 = To<LayoutBox>(*GetLayoutObjectByElementId("div1")); + const auto& div2 = To<LayoutBox>(*GetLayoutObjectByElementId("div2")); + const auto& div3 = To<LayoutBox>(*GetLayoutObjectByElementId("div3")); + const auto& div4 = To<LayoutBox>(*GetLayoutObjectByElementId("div4")); EXPECT_THAT(ContentDisplayItems(), ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, @@ -147,8 +147,18 @@ PaintChunk::Id(GetLayoutView(), DisplayItem::kScrollHitTest), GetLayoutView().FirstFragment().LocalBorderBoxProperties(), &view_scroll_hit_test, IntRect(0, 0, 800, 600))); - EXPECT_THAT(ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK(3, nullptr))); + auto contents_properties = + GetLayoutView().FirstFragment().ContentsProperties(); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + IsPaintChunk(1, 2, + PaintChunk::Id(*div1.Layer(), DisplayItem::kLayerChunk), + contents_properties), + IsPaintChunk(2, 3, + PaintChunk::Id(*div2.Layer(), DisplayItem::kLayerChunk), + contents_properties))); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(5000, 5000), mojom::blink::ScrollType::kProgrammatic); @@ -165,8 +175,20 @@ PaintChunk::Id(GetLayoutView(), DisplayItem::kScrollHitTest), GetLayoutView().FirstFragment().LocalBorderBoxProperties(), &view_scroll_hit_test, IntRect(0, 0, 800, 600))); - EXPECT_THAT(ContentPaintChunks(), - ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK(4, nullptr))); + EXPECT_THAT( + ContentPaintChunks(), + ElementsAre( + VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, + // html and div1 are out of the cull rect. + IsPaintChunk(1, 2, + PaintChunk::Id(*div2.Layer(), DisplayItem::kLayerChunk), + contents_properties), + IsPaintChunk(2, 3, + PaintChunk::Id(*div3.Layer(), DisplayItem::kLayerChunk), + contents_properties), + IsPaintChunk(3, 4, + PaintChunk::Id(*div4.Layer(), DisplayItem::kLayerChunk), + contents_properties))); } TEST_P(PaintControllerPaintTestForCAP, BlockScrollingNonLayeredContents) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index b1263e3b..d4808d9 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -3127,8 +3127,8 @@ if (EnclosingPaginationLayer()) return false; - // SVG paints atomically. - if (GetLayoutObject().IsSVGRoot()) + // SVG root and SVG foreign object paint atomically. + if (GetLayoutObject().IsSVGRoot() || GetLayoutObject().IsSVGForeignObject()) return true; // Don't create subsequence for the document element because the subsequence @@ -3137,8 +3137,8 @@ if (GetLayoutObject().IsDocumentElement()) return false; - // Create subsequence for only stacking contexts whose painting are atomic. - return GetLayoutObject().IsStackingContext(); + // Create subsequence for only stacked objects whose paintings are atomic. + return GetLayoutObject().IsStacked(); } ScrollingCoordinator* PaintLayer::GetScrollingCoordinator() {
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 25703b5..4d2de98 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -404,21 +404,6 @@ !paint_layer_.IsUnderSVGHiddenContainer() && is_self_painting_layer && !is_painting_overlay_overflow_controls; - bool should_create_subsequence = - should_paint_content && - ShouldCreateSubsequence(paint_layer_, context, painting_info); - - absl::optional<SubsequenceRecorder> subsequence_recorder; - if (should_create_subsequence) { - if (!ShouldRepaintSubsequence(paint_layer_, painting_info) && - SubsequenceRecorder::UseCachedSubsequenceIfPossible(context, - paint_layer_)) { - return paint_layer_.PreviousPaintResult(); - } - DCHECK(paint_layer_.SupportsSubsequenceCaching()); - subsequence_recorder.emplace(context, paint_layer_); - } - // TODO(paint-dev): Become block fragmentation aware. Unconditionally using // the first fragment doesn't seem right. PhysicalOffset offset_from_root = object.FirstFragment().PaintOffset(); @@ -497,6 +482,20 @@ } } + bool should_create_subsequence = + should_paint_content && + ShouldCreateSubsequence(paint_layer_, context, painting_info); + absl::optional<SubsequenceRecorder> subsequence_recorder; + if (should_create_subsequence) { + if (!ShouldRepaintSubsequence(paint_layer_, painting_info) && + SubsequenceRecorder::UseCachedSubsequenceIfPossible(context, + paint_layer_)) { + return paint_layer_.PreviousPaintResult(); + } + DCHECK(paint_layer_.SupportsSubsequenceCaching()); + subsequence_recorder.emplace(context, paint_layer_); + } + bool is_painting_root_layer = (&paint_layer_) == painting_info.root_layer; bool should_paint_background = should_paint_content && !selection_drag_image_only &&
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc b/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc index 4fadc94b..4c74e1d 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc
@@ -82,8 +82,10 @@ auto* filler2 = GetLayoutObjectByElementId("filler2"); auto* container1_layer = To<LayoutBoxModelObject>(container1)->Layer(); + auto* content1_layer = To<LayoutBoxModelObject>(content1)->Layer(); auto* filler1_layer = To<LayoutBoxModelObject>(filler1)->Layer(); auto* container2_layer = To<LayoutBoxModelObject>(container2)->Layer(); + auto* content2_layer = To<LayoutBoxModelObject>(content2)->Layer(); auto* filler2_layer = To<LayoutBoxModelObject>(filler2)->Layer(); auto chunk_state = GetLayoutView().FirstFragment().ContentsProperties(); @@ -106,27 +108,36 @@ // Check that new paint chunks were forced for the layers. auto chunks = ContentPaintChunks(); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*container1_layer, chunks.begin() + 1, 1); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler1_layer, chunks.begin() + 2, 1); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*container2_layer, chunks.begin() + 3, 1); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler2_layer, chunks.begin() + 4, 1); + auto chunk_it = chunks.begin(); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*container1_layer, chunk_it + 1, 2); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*content1_layer, chunk_it + 2, 1); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler1_layer, chunk_it + 3, 1); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*container2_layer, chunk_it + 4, 2); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*content2_layer, chunk_it + 5, 1); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler2_layer, chunk_it + 6, 1); EXPECT_THAT( chunks, ElementsAre( VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, IsPaintChunk( - 1, 3, + 1, 2, PaintChunk::Id(*container1_layer, DisplayItem::kLayerChunk), chunk_state, nullptr, IntRect(0, 0, 200, 200)), IsPaintChunk( + 2, 3, PaintChunk::Id(*content1_layer, DisplayItem::kLayerChunk), + chunk_state, nullptr, IntRect(0, 0, 100, 100)), + IsPaintChunk( 3, 4, PaintChunk::Id(*filler1_layer, DisplayItem::kLayerChunk), chunk_state, nullptr, IntRect(0, 200, 20, 20)), IsPaintChunk( - 4, 6, + 4, 5, PaintChunk::Id(*container2_layer, DisplayItem::kLayerChunk), chunk_state, nullptr, IntRect(0, 220, 200, 200)), IsPaintChunk( + 5, 6, PaintChunk::Id(*content2_layer, DisplayItem::kLayerChunk), + chunk_state, nullptr, IntRect(0, 220, 100, 100)), + IsPaintChunk( 6, 7, PaintChunk::Id(*filler2_layer, DisplayItem::kLayerChunk), chunk_state, nullptr, IntRect(0, 420, 20, 20)))); }; @@ -140,7 +151,7 @@ CachedItemAndSubsequenceCounter counter; UpdateAllLifecyclePhasesForTest(); EXPECT_EQ(6u, counter.NumNewCachedItems()); - EXPECT_EQ(3u, counter.NumNewCachedSubsequences()); + EXPECT_EQ(4u, counter.NumNewCachedSubsequences()); // We should still have the paint chunks forced by the cached subsequences. check_results(); @@ -181,9 +192,10 @@ auto* filler_layer = To<LayoutBoxModelObject>(filler)->Layer(); auto chunks = ContentPaintChunks(); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*container_layer, chunks.begin() + 1, 4); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*content_layer, chunks.begin() + 3, 1); - EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler_layer, chunks.begin() + 4, 1); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*container_layer, chunks.begin() + 1, 5); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*content_layer, chunks.begin() + 3, 2); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*inner_content_layer, chunks.begin() + 4, 1); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler_layer, chunks.begin() + 5, 1); auto container_properties = container->FirstFragment().LocalBorderBoxProperties(); @@ -207,6 +219,10 @@ PaintChunk::Id(*content_layer, DisplayItem::kLayerChunk), content_properties, nullptr, IntRect(0, 0, 200, 100)), IsPaintChunk( + 1, 1, + PaintChunk::Id(*inner_content_layer, DisplayItem::kLayerChunk), + content_properties, nullptr, IntRect(0, 0, 100, 100)), + IsPaintChunk( 1, 1, PaintChunk::Id(*filler_layer, DisplayItem::kLayerChunk), content_properties, nullptr, IntRect(0, 100, 300, 300)))); @@ -214,8 +230,12 @@ ->setAttribute(html_names::kStyleAttr, "position: absolute; width: 100px; height: 100px; " "top: 100px; background-color: green"); + CachedItemAndSubsequenceCounter counter; UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ(1u, counter.NumNewCachedItems()); // view background. + EXPECT_EQ(1u, counter.NumNewCachedSubsequences()); // filler layer. + EXPECT_THAT( ContentDisplayItems(), ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, @@ -225,6 +245,7 @@ chunks = ContentPaintChunks(); EXPECT_SUBSEQUENCE_FROM_CHUNK(*container_layer, chunks.begin() + 1, 5); EXPECT_SUBSEQUENCE_FROM_CHUNK(*content_layer, chunks.begin() + 3, 2); + EXPECT_SUBSEQUENCE_FROM_CHUNK(*inner_content_layer, chunks.begin() + 4, 1); EXPECT_SUBSEQUENCE_FROM_CHUNK(*filler_layer, chunks.begin() + 5, 1); EXPECT_THAT( @@ -250,12 +271,6 @@ } TEST_P(PaintLayerPainterTest, CachedSubsequenceOnCullRectChange) { - // This test doesn't work in CompositeAfterPaint mode because we always paint - // from the local root frame view, and we always expand cull rect for - // scrolling. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - SetBodyInnerHTML(R"HTML( <div id='container1' style='position: relative; z-index: 1; width: 200px; height: 200px; background-color: blue'> @@ -318,7 +333,7 @@ // Content2b is out of the interest rect and outputs nothing; // Container3 becomes out of the interest rect and outputs nothing. EXPECT_EQ(5u, counter.NumNewCachedItems()); - EXPECT_EQ(1u, counter.NumNewCachedSubsequences()); + EXPECT_EQ(2u, counter.NumNewCachedSubsequences()); EXPECT_THAT(ContentDisplayItems(), ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, @@ -356,12 +371,12 @@ SetBodyInnerHTML(R"HTML( <div id='container1' style='position: relative; z-index: 1; width: 200px; height: 200px; background-color: blue'> - <div id='content1' style='position: absolute; width: 100px; + <div id='content1' style='overflow: hidden; width: 100px; height: 100px; background-color: red'></div> </div> <div id='container2' style='position: relative; z-index: 1; width: 200px; height: 200px; background-color: blue'> - <div id='content2' style='position: absolute; width: 100px; + <div id='content2' style='overflow: hidden; width: 100px; height: 100px; background-color: green'></div> </div> )HTML"); @@ -527,12 +542,13 @@ div { background: blue } </style> <div id='container1' style='position: relative; height: 150px; z-index: 1'> - <div id='content1a' style='position: relative; height: 100px'></div> - <div id='content1b' style='position: relative; height: 100px'></div> + <div id='content1a' style='overflow: hidden; height: 100px'></div> + <div id='content1b' style='overflow: hidden; height: 100px'></div> </div> <div id='container2' style='position: relative; z-index: 1'> - <div id='content2a' style='position: relative; height: 100px'></div> - <div id='content2b' style='position: relative; z-index: -1; height: 100px'></div> + <div id='content2a' style='overflow: hidden; height: 100px'></div> + <div id='content2b' + style='position: relative; z-index: -1; height: 100px'></div> </div> )HTML"); @@ -559,14 +575,9 @@ VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON, // Includes |container1| and |content1a|. IsPaintChunk( - 1, 3, + 1, 4, PaintChunk::Id(*container1->Layer(), DisplayItem::kLayerChunk), - chunk_state, nullptr, IntRect(0, 0, 800, 150)), - // Includes |content1b| which overflows |container1|. - IsPaintChunk( - 3, 4, - PaintChunk::Id(*content1b->Layer(), DisplayItem::kLayerChunk), - chunk_state, nullptr, IntRect(0, 100, 800, 100)), + chunk_state, nullptr, IntRect(0, 0, 800, 200)), IsPaintChunk( 4, 5, PaintChunk::Id(*container2->Layer(), DisplayItem::kLayerChunk), @@ -575,10 +586,10 @@ 5, 6, PaintChunk::Id(*content2b->Layer(), DisplayItem::kLayerChunk), chunk_state, nullptr, IntRect(0, 250, 800, 100)), - IsPaintChunk( - 6, 7, - PaintChunk::Id(*content2a->Layer(), DisplayItem::kLayerChunk), - chunk_state, nullptr, IntRect(0, 150, 800, 100)))); + IsPaintChunk(6, 7, + PaintChunk::Id(*container2->Layer(), + DisplayItem::kLayerChunkForeground), + chunk_state, nullptr, IntRect(0, 150, 800, 100)))); } TEST_P(PaintLayerPainterTest, HintedPaintChunksWithoutBackgrounds) { @@ -588,20 +599,18 @@ SetBodyInnerHTML(R"HTML( <style>body { margin: 0 }</style> <div id='container1' style='position: relative; height: 150px; z-index: 1'> - <div id='content1a' style='position: relative; height: 100px'></div> - <div id='content1b' style='position: relative; height: 100px'></div> + <div id='content1a' style='overflow: hidden; height: 100px'></div> + <div id='content1b' style='overflow: hidden; height: 100px'></div> </div> <div id='container2' style='position: relative; z-index: 1'> - <div id='content2a' style='position: relative; height: 100px'></div> + <div id='content2a' style='overflow: hidden; height: 100px'></div> <div id='content2b' style='position: relative; z-index: -1; height: 100px'></div> </div> )HTML"); auto* container1 = GetLayoutBoxByElementId("container1"); - auto* content1b = GetLayoutBoxByElementId("content1b"); auto* container2 = GetLayoutBoxByElementId("container2"); - auto* content2a = GetLayoutBoxByElementId("content2a"); auto* content2b = GetLayoutBoxByElementId("content2b"); auto chunk_state = GetLayoutView().FirstFragment().ContentsProperties(); @@ -615,11 +624,7 @@ IsPaintChunk( 1, 1, PaintChunk::Id(*container1->Layer(), DisplayItem::kLayerChunk), - chunk_state, nullptr, IntRect(0, 0, 800, 150)), - IsPaintChunk( - 1, 1, - PaintChunk::Id(*content1b->Layer(), DisplayItem::kLayerChunk), - chunk_state, nullptr, IntRect(0, 100, 800, 100)), + chunk_state, nullptr, IntRect(0, 0, 800, 200)), IsPaintChunk( 1, 1, PaintChunk::Id(*container2->Layer(), DisplayItem::kLayerChunk), @@ -628,10 +633,10 @@ 1, 1, PaintChunk::Id(*content2b->Layer(), DisplayItem::kLayerChunk), chunk_state, nullptr, IntRect(0, 250, 800, 100)), - IsPaintChunk( - 1, 1, - PaintChunk::Id(*content2a->Layer(), DisplayItem::kLayerChunk), - chunk_state, nullptr, IntRect(0, 150, 800, 100)))); + IsPaintChunk(1, 1, + PaintChunk::Id(*container2->Layer(), + DisplayItem::kLayerChunkForeground), + chunk_state, nullptr, IntRect(0, 150, 800, 100)))); } TEST_P(PaintLayerPainterTest, PaintPhaseOutline) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer_test.cc b/third_party/blink/renderer/core/paint/paint_layer_test.cc index 279ede1a..1a7516d 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_test.cc
@@ -1074,44 +1074,35 @@ PaintLayer* grandchild1 = GetPaintLayerByElementId("grandchild1"); PaintLayer* grandchild2 = GetPaintLayerByElementId("grandchild2"); - EXPECT_FALSE(parent->SupportsSubsequenceCaching()); - EXPECT_FALSE(child1->SupportsSubsequenceCaching()); - EXPECT_TRUE(child2->SupportsSubsequenceCaching()); - EXPECT_FALSE(grandchild1->SupportsSubsequenceCaching()); - EXPECT_FALSE(grandchild2->SupportsSubsequenceCaching()); - - GetDocument() - .getElementById("grandchild1") - ->setAttribute(html_names::kStyleAttr, "isolation: isolate"); - UpdateAllLifecyclePhasesForTest(); - - EXPECT_FALSE(parent->SupportsSubsequenceCaching()); - EXPECT_FALSE(child1->SupportsSubsequenceCaching()); + EXPECT_TRUE(parent->SupportsSubsequenceCaching()); + EXPECT_TRUE(child1->SupportsSubsequenceCaching()); EXPECT_TRUE(child2->SupportsSubsequenceCaching()); EXPECT_TRUE(grandchild1->SupportsSubsequenceCaching()); - EXPECT_FALSE(grandchild2->SupportsSubsequenceCaching()); + EXPECT_TRUE(grandchild2->SupportsSubsequenceCaching()); } -TEST_P(PaintLayerTest, SubsequenceCachingSVGRoot) { +TEST_P(PaintLayerTest, SubsequenceCachingSVG) { SetBodyInnerHTML(R"HTML( - <div id='parent' style='position: relative'> - <svg id='svgroot' style='position: relative'></svg> - </div> + <svg id='svgroot'> + <foreignObject id='foreignObject'/> + </svg> )HTML"); PaintLayer* svgroot = GetPaintLayerByElementId("svgroot"); + PaintLayer* foreign_object = GetPaintLayerByElementId("foreignObject"); EXPECT_TRUE(svgroot->SupportsSubsequenceCaching()); + EXPECT_TRUE(foreign_object->SupportsSubsequenceCaching()); } TEST_P(PaintLayerTest, SubsequenceCachingMuticol) { SetBodyInnerHTML(R"HTML( <div style='columns: 2'> - <svg id='svgroot' style='position: relative'></svg> + <div id='target' style='position: relative'></div> </div> )HTML"); - PaintLayer* svgroot = GetPaintLayerByElementId("svgroot"); - EXPECT_FALSE(svgroot->SupportsSubsequenceCaching()); + PaintLayer* target = GetPaintLayerByElementId("target"); + EXPECT_FALSE(target->SupportsSubsequenceCaching()); } TEST_P(PaintLayerTest, NegativeZIndexChangeToPositive) {
diff --git a/third_party/blink/renderer/core/script/import_map.h b/third_party/blink/renderer/core/script/import_map.h index 87f79305..31fd7d3 100644 --- a/third_party/blink/renderer/core/script/import_map.h +++ b/third_party/blink/renderer/core/script/import_map.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_IMPORT_MAP_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_IMPORT_MAP_H_ -#include "base/macros.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/core/script/parsed_specifier.h b/third_party/blink/renderer/core/script/parsed_specifier.h index c95e30f8..ec06378 100644 --- a/third_party/blink/renderer/core/script/parsed_specifier.h +++ b/third_party/blink/renderer/core/script/parsed_specifier.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_PARSED_SPECIFIER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_PARSED_SPECIFIER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/core/streams/miscellaneous_operations.h b/third_party/blink/renderer/core/streams/miscellaneous_operations.h index 692b138f..4dfd5b2 100644 --- a/third_party/blink/renderer/core/streams/miscellaneous_operations.h +++ b/third_party/blink/renderer/core/streams/miscellaneous_operations.h
@@ -168,6 +168,8 @@ // arbitrary user code. The object cannot be used if // exception_state.HadException() is true. StrategyUnpacker(ScriptState*, ScriptValue strategy, ExceptionState&); + StrategyUnpacker(const StrategyUnpacker&) = delete; + StrategyUnpacker& operator=(const StrategyUnpacker&) = delete; ~StrategyUnpacker() = default; // Performs MakeSizeAlgorithmFromSizeFunction on |size_|. Because this method @@ -186,8 +188,6 @@ private: v8::Local<v8::Value> size_; v8::Local<v8::Value> high_water_mark_; - - DISALLOW_COPY_AND_ASSIGN(StrategyUnpacker); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/streams/readable_stream.cc b/third_party/blink/renderer/core/streams/readable_stream.cc index c3e7543..922fab9 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.cc +++ b/third_party/blink/renderer/core/streams/readable_stream.cc
@@ -95,6 +95,8 @@ public: PipeToEngine(ScriptState* script_state, PipeOptions* pipe_options) : script_state_(script_state), pipe_options_(pipe_options) {} + PipeToEngine(const PipeToEngine&) = delete; + PipeToEngine& operator=(const PipeToEngine&) = delete; // This is the main entrypoint for ReadableStreamPipeTo(). ScriptPromise Start(ReadableStream* readable, WritableStream* destination) { @@ -701,13 +703,13 @@ TraceWrapperV8Reference<v8::Value> shutdown_error_; bool is_shutting_down_ = false; bool is_reading_ = false; - - DISALLOW_COPY_AND_ASSIGN(PipeToEngine); }; class ReadableStream::TeeEngine final : public GarbageCollected<TeeEngine> { public: TeeEngine() = default; + TeeEngine(const TeeEngine&) = delete; + TeeEngine& operator=(const TeeEngine&) = delete; // Create the streams and start copying data. void Start(ScriptState*, ReadableStream*, ExceptionState&); @@ -745,8 +747,6 @@ TraceWrapperV8Reference<v8::Value> reason_[2]; Member<ReadableStream> branch_[2]; Member<ReadableStreamDefaultController> controller_[2]; - - DISALLOW_COPY_AND_ASSIGN(TeeEngine); }; class ReadableStream::TeeEngine::PullAlgorithm final : public StreamAlgorithm {
diff --git a/third_party/blink/renderer/core/streams/transform_stream_transformer.h b/third_party/blink/renderer/core/streams/transform_stream_transformer.h index 530b2c9..f5aa8a4 100644 --- a/third_party/blink/renderer/core/streams/transform_stream_transformer.h +++ b/third_party/blink/renderer/core/streams/transform_stream_transformer.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_TRANSFORM_STREAM_TRANSFORMER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_TRANSFORM_STREAM_TRANSFORMER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/heap.h" @@ -27,6 +26,9 @@ : public GarbageCollected<TransformStreamTransformer> { public: TransformStreamTransformer() = default; + TransformStreamTransformer(const TransformStreamTransformer&) = delete; + TransformStreamTransformer& operator=(const TransformStreamTransformer&) = + delete; virtual ~TransformStreamTransformer() = default; virtual ScriptPromise Transform(v8::Local<v8::Value> chunk, @@ -39,9 +41,6 @@ virtual ScriptState* GetScriptState() = 0; virtual void Trace(Visitor*) const {} - - private: - DISALLOW_COPY_AND_ASSIGN(TransformStreamTransformer); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/streams/writable_stream.cc b/third_party/blink/renderer/core/streams/writable_stream.cc index e47f01b..e635e50 100644 --- a/third_party/blink/renderer/core/streams/writable_stream.cc +++ b/third_party/blink/renderer/core/streams/writable_stream.cc
@@ -45,6 +45,8 @@ : promise_(promise), reason_(isolate, reason), was_already_erroring_(was_already_erroring) {} + PendingAbortRequest(const PendingAbortRequest&) = delete; + PendingAbortRequest& operator=(const PendingAbortRequest&) = delete; StreamPromiseResolver* GetPromise() { return promise_; } v8::Local<v8::Value> Reason(v8::Isolate* isolate) { @@ -62,8 +64,6 @@ Member<StreamPromiseResolver> promise_; TraceWrapperV8Reference<v8::Value> reason_; const bool was_already_erroring_; - - DISALLOW_COPY_AND_ASSIGN(PendingAbortRequest); }; WritableStream* WritableStream::Create(ScriptState* script_state,
diff --git a/third_party/blink/renderer/core/testing/dummy_modulator.h b/third_party/blink/renderer/core/testing/dummy_modulator.h index 47fc8677..c15d8dc 100644 --- a/third_party/blink/renderer/core/testing/dummy_modulator.h +++ b/third_party/blink/renderer/core/testing/dummy_modulator.h
@@ -24,10 +24,10 @@ // implementation. Unit tests can implement a subset of Modulator interface // which is exercised from unit-under-test. class DummyModulator : public Modulator { - DISALLOW_COPY_AND_ASSIGN(DummyModulator); - public: DummyModulator(); + DummyModulator(const DummyModulator&) = delete; + DummyModulator& operator=(const DummyModulator&) = delete; ~DummyModulator() override; void Trace(Visitor*) const override;
diff --git a/third_party/blink/renderer/core/testing/dummy_page_holder.h b/third_party/blink/renderer/core/testing/dummy_page_holder.h index 10d66647..c237b690 100644 --- a/third_party/blink/renderer/core/testing/dummy_page_holder.h +++ b/third_party/blink/renderer/core/testing/dummy_page_holder.h
@@ -35,7 +35,6 @@ #include "base/callback.h" #include "base/callback_helpers.h" -#include "base/macros.h" #include "base/time/default_tick_clock.h" #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/core/page/page.h" @@ -76,6 +75,8 @@ base::OnceCallback<void(Settings&)> setting_overrider = base::NullCallback(), const base::TickClock* clock = base::DefaultTickClock::GetInstance()); + DummyPageHolder(const DummyPageHolder&) = delete; + DummyPageHolder& operator=(const DummyPageHolder&) = delete; ~DummyPageHolder(); Page& GetPage() const; @@ -100,7 +101,6 @@ Persistent<LocalFrameClient> local_frame_client_; std::unique_ptr<scheduler::WebAgentGroupScheduler> agent_group_scheduler_; - DISALLOW_COPY_AND_ASSIGN(DummyPageHolder); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index 00fa51e..af50b2c 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -30,7 +30,6 @@ #include <memory> #include <utility> -#include "base/macros.h" #include "base/process/process_handle.h" #include "cc/layers/picture_layer.h" #include "cc/trees/layer_tree_host.h" @@ -215,6 +214,9 @@ UseCounterImplObserverImpl(ScriptPromiseResolver* resolver, WebFeature feature) : resolver_(resolver), feature_(feature) {} + UseCounterImplObserverImpl(const UseCounterImplObserverImpl&) = delete; + UseCounterImplObserverImpl& operator=(const UseCounterImplObserverImpl&) = + delete; bool OnCountFeature(WebFeature feature) final { if (feature_ != feature) @@ -231,7 +233,6 @@ private: Member<ScriptPromiseResolver> resolver_; WebFeature feature_; - DISALLOW_COPY_AND_ASSIGN(UseCounterImplObserverImpl); }; class TestReadableStreamSource : public UnderlyingSourceBase {
diff --git a/third_party/blink/renderer/core/testing/mock_clipboard_host.h b/third_party/blink/renderer/core/testing/mock_clipboard_host.h index 97a724b..a6efeafa 100644 --- a/third_party/blink/renderer/core/testing/mock_clipboard_host.h +++ b/third_party/blink/renderer/core/testing/mock_clipboard_host.h
@@ -16,6 +16,8 @@ class MockClipboardHost : public mojom::blink::ClipboardHost { public: MockClipboardHost(); + MockClipboardHost(const MockClipboardHost&) = delete; + MockClipboardHost& operator=(const MockClipboardHost&) = delete; ~MockClipboardHost() override; void Bind(mojo::PendingReceiver<mojom::blink::ClipboardHost> receiver); @@ -68,8 +70,6 @@ HashMap<String, String> custom_data_; bool write_smart_paste_ = false; bool needs_reset_ = false; - - DISALLOW_COPY_AND_ASSIGN(MockClipboardHost); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/testing/static_selection.h b/third_party/blink/renderer/core/testing/static_selection.h index 6c4b3cb..9aeb123 100644 --- a/third_party/blink/renderer/core/testing/static_selection.h +++ b/third_party/blink/renderer/core/testing/static_selection.h
@@ -22,6 +22,8 @@ explicit StaticSelection(const SelectionInFlatTree&); explicit StaticSelection(const SelectionInDOMTree&); + StaticSelection(const StaticSelection&) = delete; + StaticSelection& operator=(const StaticSelection&) = delete; Node* anchorNode() const { return anchor_node_; } unsigned anchorOffset() const { return anchor_offset_; } @@ -36,8 +38,6 @@ const unsigned anchor_offset_; const Member<Node> focus_node_; const unsigned focus_offset_; - - DISALLOW_COPY_AND_ASSIGN(StaticSelection); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc b/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc index 66a0568..601ef01 100644 --- a/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc +++ b/third_party/blink/renderer/core/timing/measure_memory/measure_memory_controller.cc
@@ -237,7 +237,9 @@ result->setUrl(kCrossOriginUrl); } result->setScope(ConvertScope(attribution->scope)); - result->setContainer(ConvertContainer(attribution)); + if (auto* container = ConvertContainer(attribution)) { + result->setContainer(container); + } return result; }
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc index 8fdbdaf..b8db6cc 100644 --- a/third_party/blink/renderer/core/timing/performance.cc +++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -128,7 +128,7 @@ .Record(execution_context->UkmRecorder()); } -// TODO(crbug.com/1181288): Remove the old IDL union version. +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) V8UnionDoubleOrString* StringOrDoubleToV8UnionDoubleOrString( const StringOrDouble& value) { if (value.IsString()) @@ -137,6 +137,7 @@ return MakeGarbageCollected<V8UnionDoubleOrString>(value.GetAsDouble()); return nullptr; } +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace @@ -903,18 +904,26 @@ return nullptr; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + V8UnionDoubleOrString* start = options->getStartOr(nullptr); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) V8UnionDoubleOrString* start = nullptr; if (options->hasStart()) { start = StringOrDoubleToV8UnionDoubleOrString(options->start()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) absl::optional<double> duration; if (options->hasDuration()) { duration = options->duration(); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + V8UnionDoubleOrString* end = options->getEndOr(nullptr); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) V8UnionDoubleOrString* end = nullptr; if (options->hasEnd()) { end = StringOrDoubleToV8UnionDoubleOrString(options->end()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return MeasureWithDetail( script_state, measure_name, start, duration, end,
diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h index fcf19e6..03fcc36 100644 --- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h +++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h
@@ -28,7 +28,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_TYPED_ARRAYS_ARRAY_BUFFER_ARRAY_BUFFER_CONTENTS_H_ #include "base/allocator/partition_allocator/page_allocator.h" -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_array_piece.cc b/third_party/blink/renderer/core/typed_arrays/dom_array_piece.cc index a49ddf8..b9cfcc0 100644 --- a/third_party/blink/renderer/core/typed_arrays/dom_array_piece.cc +++ b/third_party/blink/renderer/core/typed_arrays/dom_array_piece.cc
@@ -39,7 +39,7 @@ InitNull(); } -// TODO(crbug.com/1181288): Remove the old IDL union version. +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DOMArrayPiece::DOMArrayPiece( const ArrayBufferOrArrayBufferView& array_buffer_or_view) { if (array_buffer_or_view.IsArrayBuffer()) { @@ -51,6 +51,7 @@ InitWithArrayBufferView(array_buffer_view); } } +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) bool DOMArrayPiece::IsNull() const { return is_null_;
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_array_piece.h b/third_party/blink/renderer/core/typed_arrays/dom_array_piece.h index 2954328f..a855174 100644 --- a/third_party/blink/renderer/core/typed_arrays/dom_array_piece.h +++ b/third_party/blink/renderer/core/typed_arrays/dom_array_piece.h
@@ -28,12 +28,17 @@ public: DOMArrayPiece(); + // NOLINTNEXTLINE(google-explicit-constructor) DOMArrayPiece(DOMArrayBuffer* buffer); + // NOLINTNEXTLINE(google-explicit-constructor) DOMArrayPiece(DOMArrayBufferView* view); + // NOLINTNEXTLINE(google-explicit-constructor) DOMArrayPiece( const V8UnionArrayBufferOrArrayBufferView* array_buffer_or_view); - // TODO(crbug.com/1181288): Remove the old IDL union version. +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + // NOLINTNEXTLINE(google-explicit-constructor) DOMArrayPiece(const ArrayBufferOrArrayBufferView&); +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) bool operator==(const DOMArrayBuffer& other) const { return ByteLength() == other.ByteLength() &&
diff --git a/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h b/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h index 62c4e33..92e1f921b 100644 --- a/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h +++ b/third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TYPED_ARRAYS_FLEXIBLE_ARRAY_BUFFER_VIEW_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_TYPED_ARRAYS_FLEXIBLE_ARRAY_BUFFER_VIEW_H_ -#include "base/macros.h" #include "third_party/blink/renderer/bindings/core/v8/v8_array_buffer_view.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h"
diff --git a/third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h b/third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h index 5eac3e79..fd4e39e7 100644 --- a/third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h +++ b/third_party/blink/renderer/core/typed_arrays/typed_flexible_array_buffer_view.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_TYPED_ARRAYS_TYPED_FLEXIBLE_ARRAY_BUFFER_VIEW_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_TYPED_ARRAYS_TYPED_FLEXIBLE_ARRAY_BUFFER_VIEW_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/typed_arrays/flexible_array_buffer_view.h" namespace blink {
diff --git a/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.h b/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.h index ba740c8..7a4621a7 100644 --- a/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.h +++ b/third_party/blink/renderer/core/web_test/web_test_web_frame_widget_impl.h
@@ -8,7 +8,6 @@ #include <memory> #include <utility> -#include "base/macros.h" #include "third_party/blink/public/test/frame_widget_test_helper.h" #include "third_party/blink/renderer/core/frame/web_frame_widget_impl.h"
diff --git a/third_party/blink/renderer/core/xml/document_xslt.h b/third_party/blink/renderer/core/xml/document_xslt.h index 86de7a3..ea34ef4 100644 --- a/third_party/blink/renderer/core/xml/document_xslt.h +++ b/third_party/blink/renderer/core/xml/document_xslt.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_XML_DOCUMENT_XSLT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_XML_DOCUMENT_XSLT_H_ -#include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/platform/heap/handle.h" @@ -34,10 +33,9 @@ static bool HasTransformSourceDocument(Document&); explicit DocumentXSLT(Document&); + DocumentXSLT(const DocumentXSLT&) = delete; + DocumentXSLT& operator=(const DocumentXSLT&) = delete; void Trace(Visitor*) const override; - - private: - DISALLOW_COPY_AND_ASSIGN(DocumentXSLT); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/xml/parser/xml_document_parser_scope.h b/third_party/blink/renderer/core/xml/parser/xml_document_parser_scope.h index 8f5f07f..37cd36ec 100644 --- a/third_party/blink/renderer/core/xml/parser/xml_document_parser_scope.h +++ b/third_party/blink/renderer/core/xml/parser/xml_document_parser_scope.h
@@ -27,7 +27,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_XML_PARSER_XML_DOCUMENT_PARSER_SCOPE_H_ #include <libxml/xmlerror.h> -#include "base/macros.h" #include "third_party/blink/renderer/platform/heap/handle.h" namespace blink { @@ -43,6 +42,8 @@ xmlGenericErrorFunc, xmlStructuredErrorFunc = nullptr, void* error_context = nullptr); + XMLDocumentParserScope(const XMLDocumentParserScope&) = delete; + XMLDocumentParserScope& operator=(const XMLDocumentParserScope&) = delete; ~XMLDocumentParserScope(); static Document* current_document_; @@ -53,7 +54,6 @@ xmlGenericErrorFunc old_generic_error_func_; xmlStructuredErrorFunc old_structured_error_func_; void* old_error_context_; - DISALLOW_COPY_AND_ASSIGN(XMLDocumentParserScope); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/xml/xpath_expression_node.h b/third_party/blink/renderer/core/xml/xpath_expression_node.h index 6c24488..7de84ba 100644 --- a/third_party/blink/renderer/core/xml/xpath_expression_node.h +++ b/third_party/blink/renderer/core/xml/xpath_expression_node.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_EXPRESSION_NODE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_EXPRESSION_NODE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/xml/xpath_value.h" @@ -64,6 +63,8 @@ class CORE_EXPORT Expression : public ParseNode { public: Expression(); + Expression(const Expression&) = delete; + Expression& operator=(const Expression&) = delete; ~Expression() override; void Trace(Visitor*) const override; @@ -107,7 +108,6 @@ bool is_context_node_sensitive_; bool is_context_position_sensitive_; bool is_context_size_sensitive_; - DISALLOW_COPY_AND_ASSIGN(Expression); }; } // namespace xpath
diff --git a/third_party/blink/renderer/core/xml/xpath_parser.h b/third_party/blink/renderer/core/xml/xpath_parser.h index e0b28f3e..75caf3d 100644 --- a/third_party/blink/renderer/core/xml/xpath_parser.h +++ b/third_party/blink/renderer/core/xml/xpath_parser.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_PARSER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_PARSER_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/xml/xpath_predicate.h" #include "third_party/blink/renderer/core/xml/xpath_step.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -65,6 +64,8 @@ public: Parser(); + Parser(const Parser&) = delete; + Parser& operator=(const Parser&) = delete; ~Parser(); XPathNSResolver* Resolver() const { return resolver_; } @@ -109,8 +110,6 @@ String data_; int last_token_type_; XPathNSResolver* resolver_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(Parser); }; } // namespace xpath
diff --git a/third_party/blink/renderer/core/xml/xpath_predicate.h b/third_party/blink/renderer/core/xml/xpath_predicate.h index f6b47e8b..694b1f97 100644 --- a/third_party/blink/renderer/core/xml/xpath_predicate.h +++ b/third_party/blink/renderer/core/xml/xpath_predicate.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_PREDICATE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_PREDICATE_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/xml/xpath_expression_node.h" #include "third_party/blink/renderer/core/xml/xpath_value.h" @@ -120,6 +119,8 @@ class Predicate final : public GarbageCollected<Predicate> { public: explicit Predicate(Expression*); + Predicate(const Predicate&) = delete; + Predicate& operator=(const Predicate&) = delete; void Trace(Visitor*) const; bool Evaluate(EvaluationContext&) const; @@ -133,7 +134,6 @@ private: Member<Expression> expr_; - DISALLOW_COPY_AND_ASSIGN(Predicate); }; } // namespace xpath
diff --git a/third_party/blink/renderer/core/xml/xpath_step.h b/third_party/blink/renderer/core/xml/xpath_step.h index 5d03a54..16adbf2 100644 --- a/third_party/blink/renderer/core/xml/xpath_step.h +++ b/third_party/blink/renderer/core/xml/xpath_step.h
@@ -27,7 +27,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_STEP_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_XML_XPATH_STEP_H_ -#include "base/macros.h" #include "third_party/blink/renderer/core/xml/xpath_expression_node.h" #include "third_party/blink/renderer/core/xml/xpath_node_set.h" @@ -109,6 +108,8 @@ Step(Axis, const NodeTest&); Step(Axis, const NodeTest&, HeapVector<Member<Predicate>>&); + Step(const Step&) = delete; + Step& operator=(const Step&) = delete; ~Step() override; void Trace(Visitor*) const override; @@ -131,7 +132,6 @@ Axis axis_; Member<NodeTest> node_test_; HeapVector<Member<Predicate>> predicates_; - DISALLOW_COPY_AND_ASSIGN(Step); }; bool OptimizeStepPair(Step*, Step*);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc index f6f95831..9e81ddb7 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc
@@ -98,7 +98,7 @@ Vector<float> widths; inline_text_box_->CharacterWidths(widths); - DCHECK_EQ(int{widths.size()}, TextLength()); + DCHECK_EQ(static_cast<int>(widths.size()), TextLength()); offsets.resize(TextLength()); float width_so_far = 0; @@ -131,8 +131,8 @@ return 0; // Retrieve the text offset from the start of the layout block flow ancestor. - return int{inline_text_box_->TextOffsetInFormattingContext( - static_cast<unsigned int>(offset))}; + return static_cast<int>(inline_text_box_->TextOffsetInFormattingContext( + static_cast<unsigned int>(offset))); } int AXInlineTextBox::TextOffsetInContainer(int offset) const { @@ -389,7 +389,7 @@ int AXInlineTextBox::TextLength() const { if (IsDetached()) return 0; - return int{inline_text_box_->Len()}; + return static_cast<int>(inline_text_box_->Len()); } void AXInlineTextBox::ClearChildren() const {
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 fbe1f510..10a6b01 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -3480,7 +3480,7 @@ inline_offset_mapping->GetMappingUnitsForLayoutObject(*layout_obj); if (mapping_units.empty()) return AXObject::TextOffsetInFormattingContext(offset); - return int{mapping_units.front().TextContentStart()} + offset; + return static_cast<int>(mapping_units.front().TextContentStart()) + offset; } // @@ -4320,11 +4320,11 @@ return true; } -void AXNodeObject::ChildrenChanged() { +void AXNodeObject::ChildrenChangedWithCleanLayout() { if (!GetNode() && !GetLayoutObject()) return; - DCHECK(!IsDetached()) << "Avoid ChildrenChanged() on detached node: " + DCHECK(!IsDetached()) << "Don't call on detached node: " << ToString(true, true); // When children changed on a <map> that means we need to forward the @@ -4336,38 +4336,37 @@ if (image_element) { AXObject* ax_image = AXObjectCache().Get(image_element); if (ax_image) { - ax_image->ChildrenChanged(); + ax_image->ChildrenChangedWithCleanLayout(); return; } } } - // Always update current object, in case it wasn't included in the tree but - // now is. In that case, the LastKnownIsIncludedInTreeValue() won't have been - // updated yet, so we can't use that. Unfortunately, this is not a safe time - // to get the current included in tree value, therefore, we'll play it safe - // and update the children in two places sometimes. + // Always invalidate |children_| even if it was invalidated before, because + // now layout is clean. SetNeedsToUpdateChildren(); - // If this node is not in the tree, update the children of the first ancesor - // that is included in the tree. + // If this object is not included in the tree, then our parent needs to + // recompute its included-in-the-tree children vector. (And if our parent + // isn't included in the tree either, it will recursively update its parent + // and so on.) + // + // The first ancestor that's included in the tree will + // be the one that actually fires the ChildrenChanged + // event notification. if (!LastKnownIsIncludedInTreeValue()) { - // The first object (this or ancestor) that is included in the tree is the - // one whose children may have changed. - // Can be null, e.g. if <title> contents change - if (AXObject* node_to_update = ParentObjectIncludedInTree()) - node_to_update->SetNeedsToUpdateChildren(); + if (AXObject* ax_parent = CachedParentObject()) { + ax_parent->ChildrenChangedWithCleanLayout(); + return; + } } + // TODO(accessibility) Move this up. if (!CanHaveChildren()) return; - // TODO(aleventhal) Consider removing. - if (IsDetached()) { - NOTREACHED() << "None of the above calls should be able to detach |this|: " - << ToString(true, true); - return; - } + DCHECK(!IsDetached()) << "None of the above should be able to detach |this|: " + << ToString(true, true); AXObjectCache().PostNotification(this, ax::mojom::blink::Event::kChildrenChanged);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h index c41a49f..33b3b26 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -250,7 +250,7 @@ bool OnNativeSetSequentialFocusNavigationStartingPointAction() final; // Notifications that this object may have changed. - void ChildrenChanged() override; + void ChildrenChangedWithCleanLayout() override; void SelectionChanged() final; void HandleAriaExpandedChanged() override; void HandleActiveDescendantChanged() override;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 1ca45435..e1bd617 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -3758,7 +3758,7 @@ } int AXObject::ChildCountIncludingIgnored() const { - return int{ChildrenIncludingIgnored().size()}; + return static_cast<int>(ChildrenIncludingIgnored().size()); } AXObject* AXObject::ChildAtIncludingIgnored(int index) const { @@ -3991,12 +3991,12 @@ } int AXObject::UnignoredChildCount() const { - return int{UnignoredChildren().size()}; + return static_cast<int>(UnignoredChildren().size()); } AXObject* AXObject::UnignoredChildAt(int index) const { const AXObjectVector unignored_children = UnignoredChildren(); - if (index < 0 || index >= int{unignored_children.size()}) + if (index < 0 || index >= static_cast<int>(unignored_children.size())) return nullptr; return unignored_children[index]; } @@ -4573,14 +4573,14 @@ if (!HasAOMPropertyOrARIAAttribute(AOMIntProperty::kRowCount, row_count)) return 0; - if (row_count > int{RowCount()}) + if (row_count > static_cast<int>(RowCount())) return row_count; // Spec says that if all of the rows are present in the DOM, it is // not necessary to set this attribute as the user agent can // automatically calculate the total number of rows. // It returns 0 in order not to set this attribute. - if (row_count == int{RowCount()} || row_count != -1) + if (row_count == static_cast<int>(RowCount()) || row_count != -1) return 0; // In the spec, -1 explicitly means an unknown number of rows.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h index 7970603..ae5bc95 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -1322,7 +1322,7 @@ bool OnNativeShowContextMenuAction(); // Notifications that this object may have changed. - virtual void ChildrenChanged() {} + virtual void ChildrenChangedWithCleanLayout() {} virtual void HandleActiveDescendantChanged() {} virtual void HandleAutofillStateChanged(WebAXAutofillState) {} virtual void HandleAriaExpandedChanged() {}
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 60a2c7f..9f06da5 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -334,7 +334,11 @@ return true; // Slots are relevant if they have content. - return LayoutTreeBuilderTraversal::FirstChild(*slot_element); + // However, this can only be checked during safe times. + // During other times we must assume that the <slot> is relevant. + return node->GetDocument().IsFlatTreeTraversalForbidden() || + node->GetDocument().IsSlotAssignmentRecalcForbidden() || + LayoutTreeBuilderTraversal::FirstChild(*slot_element); } bool IsLayoutObjectRelevantForAccessibility(const LayoutObject& layout_object) { @@ -379,7 +383,7 @@ // An HTML <title> does not require an AXObject: the document's name is // retrieved directly via the inner text. if (IsA<HTMLTitleElement>(node)) - return node->IsSVGElement(); + return false; return true; } @@ -474,7 +478,7 @@ // An HTML <title> does not require an AXObject: the document's name is // retrieved directly via the inner text. if (IsA<HTMLTitleElement>(node)) - return node->IsSVGElement(); + return false; // The node is either hidden or display locked: // Do not consider <head>/<style>/<script> relevant in these cases. @@ -1327,6 +1331,12 @@ } // This is safe to call even if there isn't a current mapping. +// This is called by other Remove() methods, called by Blink for DOM and layout +// changes, iterating over all removed content in the subtree: +// - When a DOM subtree is removed, it is called with the root node first, and +// then descending down into the subtree. +// - When layout for a subtree is detached, it is called on layout objects, +// starting with leaves and moving upward, ending with the subtree root. void AXObjectCacheImpl::Remove(AXID ax_id) { if (!ax_id) return; @@ -1769,7 +1779,8 @@ #endif // DCHECK_IS_ON() if (obj) { - if (obj->RoleValue() == ax::mojom::blink::Role::kStaticText) { + if (obj->RoleValue() == ax::mojom::blink::Role::kStaticText && + obj->LastKnownIsIncludedInTreeValue()) { Settings* settings = GetSettings(); if (settings && settings->GetInlineTextBoxAccessibilityEnabled()) { // Update inline text box children. @@ -1803,8 +1814,12 @@ if (obj->AriaHiddenRoot()) { // Elements that are hidden but focusable are not ignored. Therefore, if a // hidden element's focusable state changes, it's ignored state must be - // recomputed. - ChildrenChangedWithCleanLayout(element->parentNode()); + // recomputed. It may be newly included in the tree, which means the + // parents must be updated. + // TODO(accessibility) Is this necessary? We have other places in the code + // that automatically do a children changed on parents of nodes whose + // ignored or included states change. + ChildrenChangedWithCleanLayout(obj->CachedParentObject()); } // Refresh the focusable state and State::kIgnored on the exposed object. @@ -1860,7 +1875,8 @@ // descendants of the attached node, thus ChildrenChangedWithCleanLayout() // must be called. It handles ignored logic, ensuring that the first ancestor // that should have this as a child will be updated. - ChildrenChangedWithCleanLayout(LayoutTreeBuilderTraversal::Parent(*node)); + ChildrenChangedWithCleanLayout( + Get(LayoutTreeBuilderTraversal::Parent(*node))); } void AXObjectCacheImpl::DidInsertChildrenOfNode(Node* node) { @@ -1877,14 +1893,8 @@ } } -// This is called by Remove(), which Blink calls for DOM and layout changes, -// iterating over all removed content in the subtree: -// - When a DOM subtree is removed, it is called with the root node first, and -// then descending down into the subtree. -// - When layout for a subtree is detached, it is called on layout objects, -// starting with leaves and moving upward, ending with the subtree root. -// TODO(accessibility) Consider how these types of optimizations could be made -// for other ChildrenChanged() processing. +// Note: do not call this when a child is becoming newly included, because +// it will return early if |obj| was last known to be unincluded. void AXObjectCacheImpl::ChildrenChangedOnAncestorOf(AXObject* obj) { DCHECK(obj); DCHECK(!obj->IsDetached()); @@ -1905,10 +1915,35 @@ // cached an ancestor's list of children: // Any ancestor up to the first included ancestor can contain the now-detached // child in it's cached children, and therefore must update children. - AXObject* ancestor = obj->CachedParentObject(); + ChildrenChanged(obj->CachedParentObject()); +} + +void AXObjectCacheImpl::ChildrenChangedWithCleanLayout(AXObject* obj) { + if (AXObject* ax_ancestor_for_notification = InvalidateChildren(obj)) { + ChildrenChangedWithCleanLayout(ax_ancestor_for_notification->GetNode(), + ax_ancestor_for_notification); + } +} + +void AXObjectCacheImpl::ChildrenChanged(AXObject* obj) { + if (AXObject* ax_ancestor_for_notification = InvalidateChildren(obj)) { + DeferTreeUpdate(&AXObjectCacheImpl::ChildrenChangedWithCleanLayout, + ax_ancestor_for_notification); + } +} + +AXObject* AXObjectCacheImpl::InvalidateChildren(AXObject* obj) { + if (!obj) + return nullptr; + + // Clear children of ancestors in order to ensure this detached object is not + // cached an ancestor's list of children: + // Any ancestor up to the first included ancestor can contain the now-detached + // child in it's cached children, and therefore must update children. + AXObject* ancestor = obj; while (ancestor && !ancestor->LastKnownIsIncludedInTreeValue()) { if (ancestor->NeedsToUpdateChildren() || ancestor->IsDetached()) - return; // Processing has already occurred for this ancestor. + return nullptr; // Processing has already occurred for this ancestor. ancestor->SetNeedsToUpdateChildren(); ancestor = ancestor->CachedParentObject(); } @@ -1919,24 +1954,24 @@ // grandchildren have changed, only the root children changed needs to be // processed. if (!ancestor) - return; + return nullptr; + // Don't enqueue a deferred event on the same node more than once. + if (ancestor->GetNode() && + !nodes_with_pending_children_changed_.insert(ancestor->GetNode()) + .is_new_entry) { + return nullptr; + } - Node* node = ancestor->GetNode(); - if (node && !nodes_with_pending_children_changed_.insert(node).is_new_entry) - return; + // Return ancestor to fire children changed notification on. + DCHECK(ancestor->LastKnownIsIncludedInTreeValue()) + << "ChildrenChanged() must only be called on included nodes: " + << ancestor->ToString(true, true); - DeferTreeUpdate(&AXObjectCacheImpl::ChildrenChangedWithCleanLayout, ancestor); + return ancestor; } void AXObjectCacheImpl::ChildrenChanged(Node* node) { - if (!node) - return; - - // Don't enqueue a deferred event on the same node more than once. - if (!nodes_with_pending_children_changed_.insert(node).is_new_entry) - return; - - DeferTreeUpdate(&AXObjectCacheImpl::ChildrenChangedWithCleanLayout, node); + ChildrenChanged(Get(node)); } void AXObjectCacheImpl::ChildrenChanged(const LayoutObject* layout_object) { @@ -1949,15 +1984,10 @@ // Update using nearest node (walking ancestors if necessary). Node* node = GetClosestNodeForLayoutObject(layout_object); - if (!node) return; - // Don't enqueue a deferred event on the same node more than once. - if (!nodes_with_pending_children_changed_.insert(node).is_new_entry) - return; - - DeferTreeUpdate(&AXObjectCacheImpl::ChildrenChangedWithCleanLayout, node); + ChildrenChanged(Get(node)); if (!layout_object->IsAnonymous()) return; @@ -1986,18 +2016,12 @@ for (Node* child = LayoutTreeBuilderTraversal::FirstChild(*node); child; child = LayoutTreeBuilderTraversal::NextSibling(*child)) { - DeferTreeUpdate(&AXObjectCacheImpl::ChildrenChangedWithCleanLayout, child); + ChildrenChanged(Get(child)); } } void AXObjectCacheImpl::ChildrenChanged(AccessibleNode* accessible_node) { - if (!accessible_node) - return; - - AXObject* object = Get(accessible_node); - if (!object) - return; - DeferTreeUpdate(&AXObjectCacheImpl::ChildrenChangedWithCleanLayout, object); + ChildrenChanged(Get(accessible_node)); } void AXObjectCacheImpl::ChildrenChangedWithCleanLayout(Node* node) { @@ -2038,7 +2062,7 @@ #endif // DCHECK_IS_ON() if (obj) - obj->ChildrenChanged(); + obj->ChildrenChangedWithCleanLayout(); if (optional_node) relation_cache_->UpdateRelatedTree(optional_node, obj); @@ -2439,7 +2463,7 @@ const bool is_in_tree = obj->LastKnownIsIncludedInTreeValue(); if (is_ignored != was_ignored || was_in_tree != is_in_tree) - ChildrenChangedWithCleanLayout(nullptr, obj->CachedParentObject()); + ChildrenChangedWithCleanLayout(obj->CachedParentObject()); } } @@ -2668,7 +2692,7 @@ // a new one needs to be created in its place. We destroy the current // AXObject in this method and call ChildrenChangeWithCleanLayout() on the // parent so that future updates to its children will create the alert. - ChildrenChangedWithCleanLayout(nullptr, obj->CachedParentObject()); + ChildrenChangedWithCleanLayout(obj->CachedParentObject()); if (int depth = RolePresentationPropagationDepth(node)) { // If role changes on a table, menu, or list invalidate the subtree of // objects that may require a specific parent role in order to keep their @@ -2737,7 +2761,7 @@ // Invalidate the subtree because aria-hidden affects the // accessibility ignored state for the entire subtree. MarkAXObjectDirtyWithCleanLayout(obj, /*subtree=*/true); - ChildrenChangedWithCleanLayout(node->parentNode()); + ChildrenChangedWithCleanLayout(obj->CachedParentObject()); } void AXObjectCacheImpl::HandleAttributeChanged(const QualifiedName& attr_name, @@ -2922,11 +2946,17 @@ } // No focused, invalid form control. - RemoveValidationMessageObject(); + if (validation_message_axid_) { + DeferTreeUpdate( + &AXObjectCacheImpl::RemoveValidationMessageObjectWithCleanLayout, + document_); + } return nullptr; } -void AXObjectCacheImpl::RemoveValidationMessageObject() { +void AXObjectCacheImpl::RemoveValidationMessageObjectWithCleanLayout( + Node* document) { + DCHECK_EQ(document, document_); if (validation_message_axid_) { // Remove when it becomes hidden, so that a new object is created the next // time the message becomes visible. It's not possible to reuse the same @@ -3185,7 +3215,11 @@ SCOPED_DISALLOW_LIFECYCLE_TRANSITION(focused_doc); #endif // DCHECK_IS_ON() - RemoveValidationMessageObject(); + if (validation_message_axid_) { + DeferTreeUpdate( + &AXObjectCacheImpl::RemoveValidationMessageObjectWithCleanLayout, + document_); + } if (!new_focused_element) { // When focus is cleared, implicitly focus the document by sending a blur.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 78b4d5a..1ceae10b 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -98,8 +98,8 @@ void SelectionChanged(Node*) override; void UpdateReverseRelations(const AXObject* relation_source, const Vector<String>& target_ids); - // void ChildrenChanged(AXObject*); - // void ChildrenChanged(const AXObject*); + void ChildrenChanged(AXObject*); + void ChildrenChangedWithCleanLayout(AXObject*); void ChildrenChanged(Node*) override; void ChildrenChanged(const LayoutObject*) override; void ChildrenChanged(AccessibleNode*) override; @@ -116,7 +116,7 @@ void Remove(Node*) override; void Remove(AbstractInlineTextBox*) override; void Remove(AXObject*); // Calls more specific Remove methods as necessary. - // For any ancetor that could contain the passed-in AXObject* in their cached + // For any ancestor that could contain the passed-in AXObject* in their cached // children, clear their children and set needs to update children on them. // In addition, ChildrenChanged() on an included ancestor that might contain // this child, if one exists. @@ -446,6 +446,10 @@ void MarkAXSubtreeDirtyWithCleanLayout(AXObject*); void MarkElementDirtyWithCleanLayout(const Node*, bool subtree); + // Helper that clears children up to the first included ancestor and returns + // the ancestor if a children changed notification should be fired on it. + AXObject* InvalidateChildren(AXObject* obj); + Member<Document> document_; ui::AXMode ax_mode_; HeapHashMap<AXID, Member<AXObject>> objects_; @@ -527,7 +531,7 @@ // Object for HTML validation alerts. Created at most once per object cache. AXObject* GetOrCreateValidationMessageObject(); - void RemoveValidationMessageObject(); + void RemoveValidationMessageObjectWithCleanLayout(Node* document); // Enqueue a callback to the given method to be run after layout is // complete.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc index a77ca46..c27a732a 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_test.cc
@@ -63,7 +63,7 @@ : AXObject(ax_object_cache) {} static unsigned num_children_changed_calls_; - void ChildrenChanged() final { num_children_changed_calls_++; } + void ChildrenChangedWithCleanLayout() final { num_children_changed_calls_++; } Document* GetDocument() const final { return &AXObjectCache().GetDocument(); } void AddChildren() final {} ax::mojom::blink::Role NativeRoleIgnoringAria() const override {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position.cc b/third_party/blink/renderer/modules/accessibility/ax_position.cc index 6f89a2c..3116646 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_position.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_position.cc
@@ -266,9 +266,10 @@ // same formatting context. int container_offset = container->TextOffsetInFormattingContext(0); int text_offset = - int{container_offset_mapping + static_cast<int>( + container_offset_mapping ->GetTextContentOffset(parent_anchored_position) - .value_or(static_cast<unsigned int>(container_offset))} - + .value_or(static_cast<unsigned int>(container_offset))) - container_offset; DCHECK_GE(text_offset, 0); ax_position.text_offset_or_child_index_ = text_offset; @@ -463,8 +464,8 @@ container_offset_mapping->GetMappingUnitsForNode(*container_node); if (mapping_units.empty()) return container_object_->ComputedName().length(); - return int{mapping_units.back().TextContentEnd() - - mapping_units.front().TextContentStart()}; + return static_cast<int>(mapping_units.back().TextContentEnd() - + mapping_units.front().TextContentStart()); } TextAffinity AXPosition::Affinity() const {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc index 70fec6e..15c8d19 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
@@ -515,7 +515,7 @@ } void AXRelationCache::ChildrenChanged(AXObject* object) { - object->ChildrenChanged(); + object->ChildrenChangedWithCleanLayout(); } void AXRelationCache::LabelChanged(Node* node) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_selection.cc b/third_party/blink/renderer/modules/accessibility/ax_selection.cc index 2b0c51e6..986aee88 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_selection.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_selection.cc
@@ -158,13 +158,13 @@ const bool is_backward = (text_control.selectionDirection() == "backward"); const auto ax_base = AXPosition::CreatePositionInTextObject( *ax_text_control, - (is_backward ? int{text_control.selectionEnd()} - : int{text_control.selectionStart()}), + static_cast<int>(is_backward ? text_control.selectionEnd() + : text_control.selectionStart()), base_affinity); const auto ax_extent = AXPosition::CreatePositionInTextObject( *ax_text_control, - (is_backward ? int{text_control.selectionStart()} - : int{text_control.selectionEnd()}), + static_cast<int>(is_backward ? text_control.selectionStart() + : text_control.selectionEnd()), extent_affinity); if (!ax_base.IsValid() || !ax_extent.IsValid())
diff --git a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc index 06f217e..f9fb65a 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
@@ -865,7 +865,7 @@ ASSERT_TRUE(ax_selection.Extent().IsTextPosition()); EXPECT_EQ(ax_static_text, ax_selection.Extent().ContainerObject()); EXPECT_EQ(ax_static_text->ComputedName().length(), - unsigned{ax_selection.Extent().TextOffset()}); + static_cast<unsigned>(ax_selection.Extent().TextOffset())); } TEST_F(AccessibilitySelectionTest, @@ -1187,8 +1187,8 @@ testing::Message message; message << "While selecting forward character " - << char{text_control.InnerEditorValue()[i]} << " at position " << i - << " in text field."; + << static_cast<char>(text_control.InnerEditorValue()[i]) + << " at position " << i << " in text field."; SCOPED_TRACE(message); EXPECT_TRUE(ax_selection.Select()); @@ -1206,8 +1206,8 @@ testing::Message message; message << "While selecting backward character " - << char{text_control.InnerEditorValue()[i]} << " at position " << i - << " in text field."; + << static_cast<char>(text_control.InnerEditorValue()[i]) + << " at position " << i << " in text field."; SCOPED_TRACE(message); EXPECT_TRUE(ax_selection.Select()); @@ -1263,8 +1263,8 @@ testing::Message message; message << "While selecting forward character " - << char{text_control.InnerEditorValue()[i]} << " at position " << i - << " in text field."; + << static_cast<char>(text_control.InnerEditorValue()[i]) + << " at position " << i << " in text field."; SCOPED_TRACE(message); EXPECT_TRUE(ax_selection.Select()); @@ -1282,8 +1282,8 @@ testing::Message message; message << "While selecting backward character " - << char{text_control.InnerEditorValue()[i]} << " at position " << i - << " in text field."; + << static_cast<char>(text_control.InnerEditorValue()[i]) + << " at position " << i << " in text field."; SCOPED_TRACE(message); EXPECT_TRUE(ax_selection.Select()); @@ -1510,8 +1510,8 @@ testing::Message message; message << "While selecting forward character " - << char{text_control.value()[i]} << " at position " << i - << " in textarea."; + << static_cast<char>(text_control.value()[i]) << " at position " + << i << " in textarea."; SCOPED_TRACE(message); EXPECT_TRUE(ax_selection.Select()); @@ -1530,8 +1530,8 @@ testing::Message message; message << "While selecting backward character " - << char{text_control.value()[i]} << " at position " << i - << " in textarea."; + << static_cast<char>(text_control.value()[i]) << " at position " + << i << " in textarea."; SCOPED_TRACE(message); EXPECT_TRUE(ax_selection.Select()); @@ -1651,13 +1651,13 @@ EXPECT_TRUE(ax_selection.Base().IsTextPosition()); EXPECT_EQ(ax_text, ax_selection.Base().ContainerObject()); EXPECT_LE(15, ax_selection.Base().TextOffset()); - EXPECT_GT(int{ax_text->ComputedName().length()}, + EXPECT_GT(static_cast<int>(ax_text->ComputedName().length()), ax_selection.Base().TextOffset()); EXPECT_EQ(TextAffinity::kUpstream, ax_selection.Base().Affinity()); EXPECT_TRUE(ax_selection.Extent().IsTextPosition()); EXPECT_EQ(ax_text, ax_selection.Extent().ContainerObject()); EXPECT_LE(15, ax_selection.Extent().TextOffset()); - EXPECT_GT(int{ax_text->ComputedName().length()}, + EXPECT_GT(static_cast<int>(ax_text->ComputedName().length()), ax_selection.Extent().TextOffset()); EXPECT_EQ(TextAffinity::kUpstream, ax_selection.Extent().Affinity()); } @@ -1712,8 +1712,10 @@ // The discrepancy between DOM and AX text offsets is due to the fact that // there is some white space in the DOM that is compressed in the // accessibility tree. - EXPECT_EQ(int{i + 9}, dom_selection.Base().OffsetInContainerNode()); - EXPECT_EQ(int{i + 10}, dom_selection.Extent().OffsetInContainerNode()); + EXPECT_EQ(static_cast<int>(i + 9), + dom_selection.Base().OffsetInContainerNode()); + EXPECT_EQ(static_cast<int>(i + 10), + dom_selection.Extent().OffsetInContainerNode()); } for (unsigned int i = computed_name.length(); i > 0; --i) { @@ -1738,8 +1740,10 @@ // The discrepancy between DOM and AX text offsets is due to the fact that // there is some white space in the DOM that is compressed in the // accessibility tree. - EXPECT_EQ(int{i + 9}, dom_selection.Base().OffsetInContainerNode()); - EXPECT_EQ(int{i + 8}, dom_selection.Extent().OffsetInContainerNode()); + EXPECT_EQ(static_cast<int>(i + 9), + dom_selection.Base().OffsetInContainerNode()); + EXPECT_EQ(static_cast<int>(i + 8), + dom_selection.Extent().OffsetInContainerNode()); } }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc index a91bb0d0..a1e46c9 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc
@@ -58,7 +58,7 @@ } } -void AXVirtualObject::ChildrenChanged() { +void AXVirtualObject::ChildrenChangedWithCleanLayout() { ClearChildren(); AXObjectCache().PostNotification(this, ax::mojom::Event::kChildrenChanged); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h index c796e00f..12b4ec7 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h
@@ -23,7 +23,7 @@ void Detach() override; bool IsVirtualObject() const override { return true; } void AddChildren() override; - void ChildrenChanged() override; + void ChildrenChangedWithCleanLayout() override; const AtomicString& GetAOMPropertyOrARIAAttribute( AOMStringProperty) const override; bool HasAOMPropertyOrARIAAttribute(AOMBooleanProperty,
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index 0fba4da4..b157e77 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -256,6 +256,40 @@ if (!input.hasInterestGroupBuyers()) return true; output.interest_group_buyers = mojom::blink::InterestGroupBuyers::New(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (input.interestGroupBuyers()->GetContentType()) { + case V8UnionUSVStringOrUSVStringSequence::ContentType::kUSVString: { + const String& maybe_wildcard = + input.interestGroupBuyers()->GetAsUSVString(); + if (maybe_wildcard != "*") { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "interestGroupBuyers", maybe_wildcard, + "must be \"*\" (wildcard) or a list of buyer https origin " + "strings.")); + return false; + } + output.interest_group_buyers->set_all_buyers( + mojom::blink::AllBuyers::New()); + break; + } + case V8UnionUSVStringOrUSVStringSequence::ContentType::kUSVStringSequence: { + Vector<scoped_refptr<const SecurityOrigin>> buyers; + for (const auto& buyer_str : + input.interestGroupBuyers()->GetAsUSVStringSequence()) { + scoped_refptr<const SecurityOrigin> buyer = ParseOrigin(buyer_str); + if (!buyer) { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "interestGroupBuyers buyer", buyer_str, + "must be a valid https origin.")); + return false; + } + buyers.push_back(buyer); + } + output.interest_group_buyers->set_buyers(std::move(buyers)); + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (input.interestGroupBuyers().IsUSVString()) { String maybe_wildcard = input.interestGroupBuyers().GetAsUSVString(); if (maybe_wildcard != "*") { @@ -282,6 +316,7 @@ } output.interest_group_buyers->set_buyers(std::move(buyers)); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return true; }
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation_test.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation_test.cc index 8a7edb2..b857086f 100644 --- a/third_party/blink/renderer/modules/animationworklet/worklet_animation_test.cc +++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation_test.cc
@@ -202,8 +202,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 20), mojom::blink::ScrollType::kProgrammatic); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -319,8 +324,13 @@ scrollable_area->SetScrollOffset(ScrollOffset(0, 20), mojom::blink::ScrollType::kProgrammatic); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -373,8 +383,13 @@ PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); ASSERT_TRUE(scrollable_area); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(GetElementById("scroller")); ScrollTimeline* scroll_timeline = @@ -422,8 +437,13 @@ Element* scroller_element = GetElementById("scroller"); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(scroller_element); ScrollTimeline* scroll_timeline = @@ -479,8 +499,13 @@ Element* scroller_element = GetElementById("scroller"); ScrollTimelineOptions* options = ScrollTimelineOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* time_range = + MakeGarbageCollected<V8UnionDoubleOrScrollTimelineAutoKeyword>(100); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrScrollTimelineAutoKeyword time_range = DoubleOrScrollTimelineAutoKeyword::FromDouble(100); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setTimeRange(time_range); options->setScrollSource(scroller_element); ScrollTimeline* scroll_timeline =
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth.cc index de7241c0..d1c5ee9 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth.cc +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth.cc
@@ -58,6 +58,7 @@ namespace { +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // TODO(crbug.com/1181288): Remove the old IDL union version. V8BluetoothServiceUUID* ToV8BluetoothServiceUUID( const StringOrUnsignedLong& uuid) { @@ -70,6 +71,7 @@ NOTREACHED(); return nullptr; } +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace @@ -106,6 +108,15 @@ return; } canonicalized_filter->services.emplace(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + for (const V8UnionStringOrUnsignedLong* service : filter->services()) { + const String& validated_service = + BluetoothUUID::getService(service, exception_state); + if (exception_state.HadException()) + return; + canonicalized_filter->services->push_back(validated_service); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) for (const StringOrUnsignedLong& service : filter->services()) { const String& validated_service = BluetoothUUID::getService( ToV8BluetoothServiceUUID(service), exception_state); @@ -113,6 +124,7 @@ return; canonicalized_filter->services->push_back(validated_service); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } if (filter->hasName()) { @@ -146,8 +158,14 @@ } canonicalized_filter->manufacturer_data.emplace(); for (const auto& manufacturer_data : filter->manufacturerData()) { - DOMArrayPiece mask_buffer = manufacturer_data->mask(); - DOMArrayPiece data_prefix_buffer = manufacturer_data->dataPrefix(); + DOMArrayPiece mask_buffer = manufacturer_data->hasMask() + ? DOMArrayPiece(manufacturer_data->mask()) + : DOMArrayPiece(); + DOMArrayPiece data_prefix_buffer = + manufacturer_data->hasDataPrefix() + ? DOMArrayPiece(manufacturer_data->dataPrefix()) + : DOMArrayPiece(); + if (manufacturer_data->hasMask()) { if (mask_buffer.IsDetached()) { exception_state.ThrowDOMException( @@ -247,6 +265,16 @@ } if (options->hasOptionalServices()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + for (const V8UnionStringOrUnsignedLong* optional_service : + options->optionalServices()) { + const String& validated_optional_service = + BluetoothUUID::getService(optional_service, exception_state); + if (exception_state.HadException()) + return; + result->optional_services.push_back(validated_optional_service); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) for (const StringOrUnsignedLong& optional_service : options->optionalServices()) { const String& validated_optional_service = BluetoothUUID::getService( @@ -255,6 +283,7 @@ return; result->optional_services.push_back(validated_optional_service); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } if (options->hasOptionalManufacturerData()) {
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_advertising_event.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_advertising_event.cc index 9f318ae..8be2b5f 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_advertising_event.cc +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_advertising_event.cc
@@ -25,6 +25,11 @@ rssi_(initializer->hasRssi() ? initializer->rssi() : 0), manufacturer_data_map_(initializer->manufacturerData()), service_data_map_(initializer->serviceData()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (initializer->hasUuids()) { + uuids_ = initializer->uuids(); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) for (const auto& uuid : initializer->uuids()) { if (uuid.IsString()) { uuids_.push_back( @@ -36,6 +41,7 @@ NOTREACHED(); } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } BluetoothAdvertisingEvent::BluetoothAdvertisingEvent(
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc index 195ecbf..de06c805 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
@@ -20,6 +20,7 @@ #include "third_party/blink/renderer/modules/bluetooth/bluetooth_attribute_instance_map.h" #include "third_party/blink/renderer/modules/bluetooth/bluetooth_error.h" #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan.cc index 84df2a30..46498b3 100644 --- a/third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan.cc +++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan.cc
@@ -30,12 +30,20 @@ filter_init->setNamePrefix(filter->name_prefix); if (filter->services && filter->services.has_value()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + HeapVector<Member<V8UnionStringOrUnsignedLong>> services; + for (const auto& uuid : filter->services.value()) { + services.push_back( + MakeGarbageCollected<V8UnionStringOrUnsignedLong>(uuid)); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) HeapVector<blink::StringOrUnsignedLong> services; for (const auto& uuid : filter->services.value()) { blink::StringOrUnsignedLong uuid_string; uuid_string.SetString(uuid); services.push_back(uuid_string); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) filter_init->setServices(services); } filters_.push_back(std::move(filter_init));
diff --git a/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.cc b/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.cc index 09bb4315..264d6d9 100644 --- a/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.cc +++ b/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.cc
@@ -42,23 +42,25 @@ ScriptPromise FrameQueueUnderlyingSource<NativeFrameType>::pull( ScriptState* script_state) { DCHECK(realm_task_runner_->RunsTasksInCurrentSequence()); + { + MutexLocker locker(mutex_); + num_pending_pulls_++; + } auto frame_queue = frame_queue_handle_.Queue(); if (!frame_queue) return ScriptPromise::CastUndefined(script_state); - if (frame_queue->IsEmpty()) { - MutexLocker locker(mutex_); - is_pending_pull_ = true; - return ScriptPromise::CastUndefined(script_state); + + if (!frame_queue->IsEmpty()) { + // Enqueuing the frame in the stream controller synchronously can lead to a + // state where the JS code issuing and handling the read requests keeps + // executing and prevents other tasks from executing. To avoid this, enqueue + // the frame on another task. See https://crbug.com/1216445#c1 + realm_task_runner_->PostTask( + FROM_HERE, + WTF::Bind(&FrameQueueUnderlyingSource< + NativeFrameType>::MaybeSendFrameFromQueueToStream, + WrapPersistent(this))); } - // Enqueuing the frame in the stream controller synchronously can lead to a - // state where the JS code issuing and handling the read requests keeps - // executing and prevents other tasks from executing. To avoid this, enqueue - // the frame on another task. See https://crbug.com/1216445#c1 - realm_task_runner_->PostTask( - FROM_HERE, - WTF::Bind(&FrameQueueUnderlyingSource< - NativeFrameType>::MaybeSendFrameFromQueueToStream, - WrapPersistent(this))); return ScriptPromise::CastUndefined(script_state); } @@ -97,7 +99,7 @@ template <typename NativeFrameType> bool FrameQueueUnderlyingSource<NativeFrameType>::HasPendingActivity() const { MutexLocker locker(mutex_); - return is_pending_pull_ && Controller(); + return (num_pending_pulls_ > 0) && Controller(); } template <typename NativeFrameType> @@ -131,7 +133,7 @@ is_closed_ = true; { MutexLocker locker(mutex_); - is_pending_pull_ = false; + num_pending_pulls_ = 0; if (transferred_source_) { PostCrossThreadTask( *transferred_source_->GetRealmRunner(), FROM_HERE, @@ -153,7 +155,7 @@ transferred_source_->QueueFrame(std::move(media_frame)); return; } - should_send_frame_to_stream = is_pending_pull_; + should_send_frame_to_stream = num_pending_pulls_ > 0; } auto frame_queue = frame_queue_handle_.Queue(); @@ -178,10 +180,10 @@ } template <typename NativeFrameType> -bool FrameQueueUnderlyingSource<NativeFrameType>::IsPendingPullForTesting() +int FrameQueueUnderlyingSource<NativeFrameType>::NumPendingPullsForTesting() const { MutexLocker locker(mutex_); - return is_pending_pull_; + return num_pending_pulls_; } template <typename NativeFrameType> @@ -217,14 +219,22 @@ if (!frame_queue) return; - absl::optional<NativeFrameType> media_frame = frame_queue->Pop(); - if (!media_frame.has_value()) - return; - - Controller()->Enqueue(MakeBlinkFrame(std::move(media_frame.value()))); { MutexLocker locker(mutex_); - is_pending_pull_ = false; + if (num_pending_pulls_ == 0) + return; + } + while (true) { + absl::optional<NativeFrameType> media_frame = frame_queue->Pop(); + if (!media_frame.has_value()) + return; + + Controller()->Enqueue(MakeBlinkFrame(std::move(media_frame.value()))); + { + MutexLocker locker(mutex_); + if (--num_pending_pulls_ == 0) + return; + } } }
diff --git a/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.h b/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.h index 55fe478..43479b3 100644 --- a/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.h +++ b/third_party/blink/renderer/modules/breakout_box/frame_queue_underlying_source.h
@@ -62,7 +62,7 @@ // Delivers a new frame to this source. void QueueFrame(NativeFrameType); - bool IsPendingPullForTesting() const; + int NumPendingPullsForTesting() const; double DesiredSizeForTesting() const; void Trace(Visitor*) const override; @@ -115,7 +115,7 @@ // transferred stream. CrossThreadPersistent<FrameQueueUnderlyingSource<NativeFrameType>> transferred_source_ GUARDED_BY(mutex_); - bool is_pending_pull_ GUARDED_BY(mutex_) = false; + int num_pending_pulls_ GUARDED_BY(mutex_) = 0; }; template <>
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source_test.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source_test.cc index 470cd05..e987ab0 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source_test.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_audio_track_underlying_source_test.cc
@@ -183,9 +183,9 @@ // Pulling causes a pending pull since there are no frames available for // reading. - EXPECT_FALSE(source->IsPendingPullForTesting()); + EXPECT_EQ(source->NumPendingPullsForTesting(), 0); source->pull(script_state); - EXPECT_TRUE(source->IsPendingPullForTesting()); + EXPECT_EQ(source->NumPendingPullsForTesting(), 1); source->Close(); WebMediaStreamAudioSink::RemoveFromAudioTrack(
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc index e3f6501..880e33e 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc
@@ -102,7 +102,12 @@ return MakeGarbageCollected<MediaStreamTrackGenerator>( script_state, type, - /*track_id=*/WTF::CreateCanonicalUUIDString(), init->signalTarget(), + /*track_id=*/WTF::CreateCanonicalUUIDString(), +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->getSignalTargetOr(nullptr), +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->signalTarget(), +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) max_signal_buffer_size); }
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source_test.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source_test.cc index a809f87a..226db4aa9 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source_test.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source_test.cc
@@ -177,9 +177,9 @@ // Pulling causes a pending pull since there are no frames available for // reading. - EXPECT_FALSE(source->IsPendingPullForTesting()); + EXPECT_EQ(source->NumPendingPullsForTesting(), 0); source->pull(script_state); - EXPECT_TRUE(source->IsPendingPullForTesting()); + EXPECT_EQ(source->NumPendingPullsForTesting(), 1); source->Close(); track->stopTrack(v8_scope.GetExecutionContext());
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc index f03c212..492e4809 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -1266,12 +1266,12 @@ kClipFill); c = GetPaintCanvas(); // Check overdraw may have swapped the PaintCanvas c->drawRect(rect, clear_flags); - DidDraw(clip_bounds); + DidDraw2D(clip_bounds); } else { SkIRect dirty_rect; if (ComputeDirtyRect(rect, clip_bounds, &dirty_rect)) { c->drawRect(rect, clear_flags); - DidDraw(dirty_rect); + DidDraw2D(dirty_rect); } } } @@ -2138,7 +2138,7 @@ } } - DidDraw(dest_rect); + DidDraw2D(dest_rect); } void BaseRenderingContext2D::PutByteArray(const SkPixmap& source,
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h index 4ef0eff..6b385ee 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.h
@@ -288,7 +288,7 @@ virtual cc::PaintCanvas* GetOrCreatePaintCanvas() = 0; virtual cc::PaintCanvas* GetPaintCanvas() const = 0; - virtual void DidDraw(const SkIRect& dirty_rect) = 0; + virtual void DidDraw2D(const SkIRect& dirty_rect) = 0; virtual bool StateHasFilter() = 0; virtual sk_sp<PaintFilter> StateGetFilter() = 0; @@ -577,13 +577,13 @@ (GetState().ShouldDrawShadows() && ShouldUseDropShadowPaintFilter(paint_type, image_type))) { CompositedDraw(draw_func, GetPaintCanvas(), paint_type, image_type); - DidDraw(clip_bounds); + DidDraw2D(clip_bounds); } else if (GetState().GlobalComposite() == SkBlendMode::kSrc) { ClearCanvas(); // takes care of checkOverdraw() const PaintFlags* flags = GetState().GetFlags(paint_type, kDrawForegroundOnly, image_type); draw_func(GetPaintCanvas(), flags); - DidDraw(clip_bounds); + DidDraw2D(clip_bounds); } else { SkIRect dirty_rect; if (ComputeDirtyRect(bounds, clip_bounds, &dirty_rect)) { @@ -593,7 +593,7 @@ draw_covers_clip_bounds(clip_bounds)) CheckOverdraw(bounds, flags, image_type, kClipFill); draw_func(GetPaintCanvas(), flags); - DidDraw(dirty_rect); + DidDraw2D(dirty_rect); } } }
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc index 0eddd3a..11762ac 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -434,10 +434,7 @@ } } -void CanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) { - if (dirty_rect.isEmpty()) - return; - +void CanvasRenderingContext2D::DidDraw2D(const SkIRect& dirty_rect) { CanvasRenderingContext::DidDraw(dirty_rect); }
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h index ca823f2c..ad17981 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.h
@@ -178,6 +178,7 @@ void ClearFilterReferences(); // BaseRenderingContext2D implementation + void DidDraw2D(const SkIRect& dirty_rect) final; bool OriginClean() const final; void SetOriginTainted() final; bool WouldTaintOrigin(CanvasImageSource* source) final { @@ -197,7 +198,6 @@ cc::PaintCanvas* GetOrCreatePaintCanvas() final; cc::PaintCanvas* GetPaintCanvas() const final; - void DidDraw(const SkIRect& dirty_rect) final; scoped_refptr<StaticBitmapImage> GetImage() final; bool StateHasFilter() final;
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc index 23d3ae3..838a5948 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.cc
@@ -279,16 +279,9 @@ return GetCanvasResourceProvider()->Canvas(); } -void OffscreenCanvasRenderingContext2D::DidDraw() { - dirty_rect_for_commit_.setWH(Width(), Height()); - Host()->DidDraw(); - if (GetCanvasResourceProvider() && GetCanvasResourceProvider()->needs_flush()) - FinalizeFrame(); -} - -void OffscreenCanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) { +void OffscreenCanvasRenderingContext2D::DidDraw2D(const SkIRect& dirty_rect) { dirty_rect_for_commit_.join(dirty_rect); - Host()->DidDraw(SkRect::Make(dirty_rect_for_commit_)); + Host()->DidDraw(dirty_rect_for_commit_); if (GetCanvasResourceProvider() && GetCanvasResourceProvider()->needs_flush()) FinalizeFrame(); }
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h index ec80a60df..3c5add39 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas2d/offscreen_canvas_rendering_context_2d.h
@@ -120,8 +120,7 @@ cc::PaintCanvas* GetOrCreatePaintCanvas() final; cc::PaintCanvas* GetPaintCanvas() const final; - void DidDraw() final; - void DidDraw(const SkIRect& dirty_rect) final; + void DidDraw2D(const SkIRect& dirty_rect) final; bool StateHasFilter() final; sk_sp<PaintFilter> StateGetFilter() final;
diff --git a/third_party/blink/renderer/modules/compute_pressure/compute_pressure_observer.cc b/third_party/blink/renderer/modules/compute_pressure/compute_pressure_observer.cc index e9feea6..197a15d8 100644 --- a/third_party/blink/renderer/modules/compute_pressure/compute_pressure_observer.cc +++ b/third_party/blink/renderer/modules/compute_pressure/compute_pressure_observer.cc
@@ -9,10 +9,10 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise.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" +#include "third_party/blink/renderer/bindings/modules/v8/v8_compute_pressure_observer_options.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_compute_pressure_observer_update.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/modules/compute_pressure/compute_pressure_observer_options.h" -#include "third_party/blink/renderer/modules/compute_pressure/compute_pressure_observer_update.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/heap/heap.h"
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 ccb4af1..bb5616e 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
@@ -109,8 +109,11 @@ if (!is_deleted) { list_item->setValue(String::FromUTF8(canonical_cookie.Value())); if (canonical_cookie.ExpiryDate().is_null()) { - // TODO(crbug.com/1070871): Use absl::nullopt instead. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + list_item->setExpires(absl::nullopt); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) list_item->setExpiresToNull(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } else { list_item->setExpires(ConvertSecondsToDOMTimeStamp( canonical_cookie.ExpiryDate().ToDoubleT()));
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 73c8f65..606ca6e6 100644 --- a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc +++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
@@ -12,6 +12,7 @@ #include "services/network/public/mojom/restricted_cookie_manager.mojom-blink.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_cookie_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_cookie_list_item.h"
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc index 287e63b..12812da 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc
@@ -11,6 +11,8 @@ #include "build/build_config.h" #include "third_party/blink/public/mojom/webauthn/authenticator.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_inputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_inputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authenticator_selection_criteria.h" @@ -22,6 +24,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_request_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_rp_entity.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_user_entity.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h" #include "third_party/blink/renderer/modules/credentialmanager/credential.h" #include "third_party/blink/renderer/modules/credentialmanager/federated_credential.h" #include "third_party/blink/renderer/modules/credentialmanager/password_credential.h" @@ -180,6 +183,15 @@ } // static helper method. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +Vector<uint8_t> ConvertFixedSizeArray(const blink::V8BufferSource* buffer, + unsigned length) { + if (blink::DOMArrayPiece(buffer).ByteLength() != length) + return {}; + + return ConvertTo<Vector<uint8_t>>(buffer); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Vector<uint8_t> ConvertFixedSizeArray( const blink::ArrayBufferOrArrayBufferView& buffer, unsigned length) { @@ -195,7 +207,32 @@ return ConvertTo<Vector<uint8_t>>(buffer); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +// static +Vector<uint8_t> +TypeConverter<Vector<uint8_t>, blink::V8UnionArrayBufferOrArrayBufferView*>:: + Convert(const blink::V8UnionArrayBufferOrArrayBufferView* buffer) { + DCHECK(buffer); + Vector<uint8_t> vector; + switch (buffer->GetContentType()) { + case blink::V8UnionArrayBufferOrArrayBufferView::ContentType::kArrayBuffer: + vector.Append(static_cast<uint8_t*>(buffer->GetAsArrayBuffer()->Data()), + base::checked_cast<wtf_size_t>( + buffer->GetAsArrayBuffer()->ByteLength())); + break; + case blink::V8UnionArrayBufferOrArrayBufferView::ContentType:: + kArrayBufferView: + vector.Append( + static_cast<uint8_t*>(buffer->GetAsArrayBufferView()->BaseAddress()), + base::checked_cast<wtf_size_t>( + buffer->GetAsArrayBufferView()->byteLength())); + break; + } + return vector; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // static Vector<uint8_t> TypeConverter<Vector<uint8_t>, blink::ArrayBufferOrArrayBufferView>::Convert( @@ -215,6 +252,7 @@ } return vector; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // static PublicKeyCredentialType TypeConverter<PublicKeyCredentialType, String>::Convert(
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h index fe48abd..2187ad9 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h +++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h
@@ -13,8 +13,8 @@ #include "third_party/blink/renderer/platform/wtf/vector.h" namespace blink { -class AuthenticatorSelectionCriteria; class ArrayBufferOrArrayBufferView; +class AuthenticatorSelectionCriteria; class CableAuthenticationData; class CableRegistrationData; class Credential; @@ -25,6 +25,7 @@ class PublicKeyCredentialRpEntity; class PublicKeyCredentialUserEntity; class UserVerificationRequirement; +class V8UnionArrayBufferOrArrayBufferView; } // namespace blink namespace mojo { @@ -52,10 +53,19 @@ const blink::mojom::blink::AuthenticatorStatus&); }; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +template <> +struct TypeConverter<Vector<uint8_t>, + blink::V8UnionArrayBufferOrArrayBufferView*> { + static Vector<uint8_t> Convert( + const blink::V8UnionArrayBufferOrArrayBufferView*); +}; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) template <> struct TypeConverter<Vector<uint8_t>, blink::ArrayBufferOrArrayBufferView> { static Vector<uint8_t> Convert(const blink::ArrayBufferOrArrayBufferView&); }; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) template <> struct TypeConverter<blink::mojom::blink::PublicKeyCredentialType, String> {
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc index 53b140b..115d7b3 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
@@ -292,6 +292,25 @@ // Checks if the size of the supplied ArrayBuffer or ArrayBufferView is at most // the maximum size allowed. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +bool IsArrayBufferOrViewBelowSizeLimit( + const V8UnionArrayBufferOrArrayBufferView* buffer_or_view) { + if (!buffer_or_view) + return true; + switch (buffer_or_view->GetContentType()) { + case V8UnionArrayBufferOrArrayBufferView::ContentType::kArrayBuffer: + return base::CheckedNumeric<wtf_size_t>( + buffer_or_view->GetAsArrayBuffer()->ByteLength()) + .IsValid(); + case V8UnionArrayBufferOrArrayBufferView::ContentType::kArrayBufferView: + return base::CheckedNumeric<wtf_size_t>( + buffer_or_view->GetAsArrayBufferView()->byteLength()) + .IsValid(); + } + NOTREACHED(); + return false; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) bool IsArrayBufferOrViewBelowSizeLimit( ArrayBufferOrArrayBufferView buffer_or_view) { if (buffer_or_view.IsNull()) @@ -308,6 +327,7 @@ buffer_or_view.GetAsArrayBufferView()->byteLength()) .IsValid(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DOMException* CredentialManagerErrorToDOMException( CredentialManagerError reason) { @@ -1214,6 +1234,16 @@ } if (options->hasPassword()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + resolver->Resolve( + options->password()->IsPasswordCredentialData() + ? PasswordCredential::Create( + options->password()->GetAsPasswordCredentialData(), + exception_state) + : PasswordCredential::Create( + options->password()->GetAsHTMLFormElement(), + exception_state)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) resolver->Resolve( options->password().IsPasswordCredentialData() ? PasswordCredential::Create( @@ -1221,6 +1251,7 @@ exception_state) : PasswordCredential::Create( options->password().GetAsHTMLFormElement(), exception_state)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return promise; } if (options->hasFederated()) {
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc index 0463d18e..fcb7f74 100644 --- a/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc +++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container_test.cc
@@ -249,9 +249,15 @@ auto* user_options = PublicKeyCredentialUserEntity::Create(); int dummy_buffer_source = 1; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* dummy_buffer = + MakeGarbageCollected<V8BufferSource>(DOMArrayBuffer::Create( + &dummy_buffer_source, sizeof(dummy_buffer_source))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto dummy_buffer = ArrayBufferOrArrayBufferView::FromArrayBuffer(DOMArrayBuffer::Create( &dummy_buffer_source, sizeof(dummy_buffer_source))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) user_options->setId(dummy_buffer); user_options->setIcon("invalid URL");
diff --git a/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.cc b/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.cc index c138063..2c21901e 100644 --- a/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.cc
@@ -41,7 +41,7 @@ did_record_draw_commands_in_paint_recorder_ = false; } -void PaintRenderingContext2D::DidDraw(const SkIRect&) { +void PaintRenderingContext2D::DidDraw2D(const SkIRect&) { did_record_draw_commands_in_paint_recorder_ = true; }
diff --git a/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.h b/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.h index cd568e8..3f4c202 100644 --- a/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.h +++ b/third_party/blink/renderer/modules/csspaint/paint_rendering_context_2d.h
@@ -56,7 +56,7 @@ cc::PaintCanvas* GetOrCreatePaintCanvas() final { return GetPaintCanvas(); } cc::PaintCanvas* GetPaintCanvas() const final; - void DidDraw(const SkIRect&) final; + void DidDraw2D(const SkIRect&) final; double shadowOffsetX() const final; void setShadowOffsetX(double) final;
diff --git a/third_party/blink/renderer/modules/encryptedmedia/DEPS b/third_party/blink/renderer/modules/encryptedmedia/DEPS index 85333ee..8673eb6 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/DEPS +++ b/third_party/blink/renderer/modules/encryptedmedia/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "-third_party/blink/renderer/modules", + "+media/base/content_decryption_module.h", "+media/base/eme_constants.h", "+services/metrics/public/cpp/ukm_builders.h", "+services/metrics/public/cpp/ukm_recorder.h",
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc index 89cb7a6..e7cdac5 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc +++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.cc
@@ -28,6 +28,7 @@ #include <cmath> #include <limits> +#include "media/base/content_decryption_module.h" #include "media/base/eme_constants.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_content_decryption_module.h" @@ -55,6 +56,7 @@ #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/instrumentation/instance_counters.h" #include "third_party/blink/renderer/platform/network/mime/content_type.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/timer.h" #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h" @@ -107,6 +109,22 @@ return false; } +V8MediaKeySessionClosedReason::Enum ConvertSessionClosedReason( + media::CdmSessionClosedReason reason) { + switch (reason) { + case media::CdmSessionClosedReason::kInternalError: + return V8MediaKeySessionClosedReason::Enum::kInternalError; + case media::CdmSessionClosedReason::kClose: + return V8MediaKeySessionClosedReason::Enum::kClosedByApplication; + case media::CdmSessionClosedReason::kReleaseAcknowledged: + return V8MediaKeySessionClosedReason::Enum::kReleaseAcknowledged; + case media::CdmSessionClosedReason::kHardwareContextReset: + return V8MediaKeySessionClosedReason::Enum::kHardwareContextReset; + case media::CdmSessionClosedReason::kResourceEvicted: + return V8MediaKeySessionClosedReason::Enum::kResourceEvicted; + } +} + static ScriptPromise CreateRejectedPromiseNotCallable( ExceptionState& exception_state) { exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, @@ -846,7 +864,7 @@ } // Queue a task to fire a simple event named keymessage at the new object. -void MediaKeySession::OnSessionMessage(MessageType message_type, +void MediaKeySession::OnSessionMessage(media::CdmMessageType message_type, const unsigned char* message, size_t message_length) { DVLOG(MEDIA_KEY_SESSION_LOG_LEVEL) << __func__ << "(" << this << ")"; @@ -864,20 +882,16 @@ MediaKeyMessageEventInit* init = MediaKeyMessageEventInit::Create(); switch (message_type) { - case WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRequest: + case media::CdmMessageType::LICENSE_REQUEST: init->setMessageType("license-request"); break; - case WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRenewal: + case media::CdmMessageType::LICENSE_RENEWAL: init->setMessageType("license-renewal"); break; - case WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRelease: + case media::CdmMessageType::LICENSE_RELEASE: init->setMessageType("license-release"); break; - case WebContentDecryptionModuleSession::Client::MessageType:: - kIndividualizationRequest: + case media::CdmMessageType::INDIVIDUALIZATION_REQUEST: init->setMessageType("individualization-request"); break; } @@ -890,7 +904,7 @@ async_event_queue_->EnqueueEvent(FROM_HERE, *event); } -void MediaKeySession::OnSessionClosed() { +void MediaKeySession::OnSessionClosed(media::CdmSessionClosedReason reason) { // Note that this is the event from the CDM when this session is actually // closed. The CDM can close a session at any time. Normally it would happen // as the result of a close() call, but also happens when update() has been @@ -916,7 +930,12 @@ OnSessionExpirationUpdate(std::numeric_limits<double>::quiet_NaN()); // 7. Resolve promise. - closed_promise_->ResolveWithUndefined(); + if (RuntimeEnabledFeatures::EncryptedMediaSessionClosedReasonEnabled()) { + closed_promise_->Resolve( + V8MediaKeySessionClosedReason(ConvertSessionClosedReason(reason))); + } else { + closed_promise_->ResolveWithUndefined(); + } // Stop the CDM from firing any more events for this session. session_.reset();
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.h b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.h index 192e4d4..2dfa7d8 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.h +++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.h
@@ -27,10 +27,13 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_ENCRYPTEDMEDIA_MEDIA_KEY_SESSION_H_ #include <memory> + +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/platform/web_content_decryption_module_session.h" #include "third_party/blink/public/platform/web_encrypted_media_types.h" #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_media_key_session_closed_reason.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h" #include "third_party/blink/renderer/modules/encryptedmedia/media_key_status_map.h" @@ -40,6 +43,7 @@ namespace media { enum class EmeInitDataType; +enum class CdmSessionClosedReason; } namespace blink { @@ -130,10 +134,10 @@ void RemoveTask(ContentDecryptionModuleResult*); // WebContentDecryptionModuleSession::Client - void OnSessionMessage(MessageType, + void OnSessionMessage(media::CdmMessageType message_type, const unsigned char* message, size_t message_length) override; - void OnSessionClosed() override; + void OnSessionClosed(media::CdmSessionClosedReason reason) override; void OnSessionExpirationUpdate(double updated_expiry_time_in_ms) override; void OnSessionKeysChange(const WebVector<WebEncryptedMediaKeyInformation>&, bool has_additional_usable_key) override; @@ -156,7 +160,10 @@ bool is_closing_or_closed_; // Keep track of the closed promise. - typedef ScriptPromiseProperty<ToV8UndefinedGenerator, Member<DOMException>> + // absl::optional<> is needed because V8MediaKeySessionClosedReason's default + // constructor is private. + typedef ScriptPromiseProperty<absl::optional<V8MediaKeySessionClosedReason>, + Member<DOMException>> ClosedPromise; Member<ClosedPromise> closed_promise_;
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.idl b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.idl index 58481d0..adc751e 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/media_key_session.idl +++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_session.idl
@@ -25,6 +25,14 @@ // https://w3c.github.io/encrypted-media/#mediakeysession-interface +enum MediaKeySessionClosedReason { + "internal-error", + "closed-by-application", + "release-acknowledged", + "hardware-context-reset", + "resource-evicted" +}; + [ Exposed=Window, ActiveScriptWrappable, @@ -33,7 +41,10 @@ // session properties readonly attribute DOMString sessionId; readonly attribute unrestricted double expiration; - [CallWith=ScriptState] readonly attribute Promise<void> closed; + // When runtime feature EncryptedMediaSessionClosedReason is enabled, the + // promise is resolved with "MediaKeySessionClosedReason". Otherwise, it's + // resolved with "undefined". + [CallWith=ScriptState] readonly attribute Promise<MediaKeySessionClosedReason> closed; readonly attribute MediaKeyStatusMap keyStatuses; attribute EventHandler onkeystatuseschange; attribute EventHandler onmessage;
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_media_capability.idl b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_media_capability.idl index f475a843..5d8c31f 100644 --- a/third_party/blink/renderer/modules/encryptedmedia/media_key_system_media_capability.idl +++ b/third_party/blink/renderer/modules/encryptedmedia/media_key_system_media_capability.idl
@@ -7,5 +7,5 @@ dictionary MediaKeySystemMediaCapability { DOMString contentType = ""; DOMString robustness = ""; - [RuntimeEnabled=EncryptedMediaEncryptionSchemeQuery] DOMString? encryptionScheme = null; + DOMString? encryptionScheme = null; };
diff --git a/third_party/blink/renderer/modules/exported/web_ax_object.cc b/third_party/blink/renderer/modules/exported/web_ax_object.cc index 38369d7..e5b6f34 100644 --- a/third_party/blink/renderer/modules/exported/web_ax_object.cc +++ b/third_party/blink/renderer/modules/exported/web_ax_object.cc
@@ -228,7 +228,8 @@ if (IsDetached()) return WebAXObject(); - return WebAXObject(private_->ChildAtIncludingIgnored(int{index})); + return WebAXObject( + private_->ChildAtIncludingIgnored(static_cast<int>(index))); } WebAXObject WebAXObject::ParentObject() const {
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc index e2151857..c6030b7 100644 --- a/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc +++ b/third_party/blink/renderer/modules/file_system_access/file_system_underlying_sink.cc
@@ -123,6 +123,9 @@ "Invalid params passed. write requires a data argument"); return ScriptPromise(); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + return WriteData(script_state, position, params.data(), exception_state); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) V8UnionArrayBufferOrArrayBufferViewOrBlobOrUSVString* data; if (params.data().IsArrayBuffer()) { data = MakeGarbageCollected< @@ -143,6 +146,7 @@ params.data().GetAsUSVString()); } return WriteData(script_state, position, data, exception_state); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
diff --git a/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc index e19c2be..2c2c4a1f8 100644 --- a/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc +++ b/third_party/blink/renderer/modules/file_system_access/global_file_system_access.cc
@@ -138,6 +138,24 @@ } mimeTypes.push_back(type); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (a.second->GetContentType()) { + case V8UnionUSVStringOrUSVStringSequence::ContentType::kUSVString: + if (!AddExtension(a.second->GetAsUSVString(), extensions, + exception_state)) { + return {}; + } + break; + case V8UnionUSVStringOrUSVStringSequence::ContentType:: + kUSVStringSequence: + for (const auto& extension : a.second->GetAsUSVStringSequence()) { + if (!AddExtension(extension, extensions, exception_state)) { + return {}; + } + } + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (a.second.IsUSVString()) { if (!AddExtension(a.second.GetAsUSVString(), extensions, exception_state)) @@ -148,6 +166,7 @@ return {}; } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } result.emplace_back( blink::mojom::blink::ChooseFileSystemEntryAcceptsOption::New( @@ -309,6 +328,20 @@ mojom::blink::WellKnownDirectory::kDefault; mojo::PendingRemote<blink::mojom::blink::FileSystemAccessTransferToken> token; if (options->hasStartIn()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto* start_in = options->startIn(); + switch (start_in->GetContentType()) { + case V8UnionFileSystemHandleOrWellKnownDirectory::ContentType:: + kFileSystemHandle: + token = start_in->GetAsFileSystemHandle()->Transfer(); + break; + case V8UnionFileSystemHandleOrWellKnownDirectory::ContentType:: + kWellKnownDirectory: + well_known_starting_directory = + ConvertWellKnownDirectory(start_in->GetAsWellKnownDirectory()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto& start_in = options->startIn(); if (start_in.IsWellKnownDirectory()) { well_known_starting_directory = @@ -317,6 +350,7 @@ if (start_in.IsFileSystemHandle()) { token = start_in.GetAsFileSystemHandle()->Transfer(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } VerifyIsAllowedToShowFilePicker(window, exception_state); @@ -368,6 +402,20 @@ mojom::blink::WellKnownDirectory::kDefault; mojo::PendingRemote<blink::mojom::blink::FileSystemAccessTransferToken> token; if (options->hasStartIn()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto* start_in = options->startIn(); + switch (start_in->GetContentType()) { + case V8UnionFileSystemHandleOrWellKnownDirectory::ContentType:: + kFileSystemHandle: + token = start_in->GetAsFileSystemHandle()->Transfer(); + break; + case V8UnionFileSystemHandleOrWellKnownDirectory::ContentType:: + kWellKnownDirectory: + well_known_starting_directory = + ConvertWellKnownDirectory(start_in->GetAsWellKnownDirectory()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto& start_in = options->startIn(); if (start_in.IsWellKnownDirectory()) { well_known_starting_directory = @@ -376,6 +424,7 @@ if (start_in.IsFileSystemHandle()) { token = start_in.GetAsFileSystemHandle()->Transfer(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } VerifyIsAllowedToShowFilePicker(window, exception_state); @@ -417,6 +466,20 @@ mojom::blink::WellKnownDirectory::kDefault; mojo::PendingRemote<blink::mojom::blink::FileSystemAccessTransferToken> token; if (options->hasStartIn()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto* start_in = options->startIn(); + switch (start_in->GetContentType()) { + case V8UnionFileSystemHandleOrWellKnownDirectory::ContentType:: + kFileSystemHandle: + token = start_in->GetAsFileSystemHandle()->Transfer(); + break; + case V8UnionFileSystemHandleOrWellKnownDirectory::ContentType:: + kWellKnownDirectory: + well_known_starting_directory = + ConvertWellKnownDirectory(start_in->GetAsWellKnownDirectory()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto& start_in = options->startIn(); if (start_in.IsWellKnownDirectory()) { well_known_starting_directory = @@ -425,6 +488,7 @@ if (start_in.IsFileSystemHandle()) { token = start_in.GetAsFileSystemHandle()->Transfer(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } VerifyIsAllowedToShowFilePicker(window, exception_state);
diff --git a/third_party/blink/renderer/modules/hid/hid_device.cc b/third_party/blink/renderer/modules/hid/hid_device.cc index 7a5dedd..de68f81 100644 --- a/third_party/blink/renderer/modules/hid/hid_device.cc +++ b/third_party/blink/renderer/modules/hid/hid_device.cc
@@ -145,7 +145,7 @@ DCHECK_LE(unit_factor_exponent, 0x0f); // Values from 0x08 to 0x0f encode negative exponents. if (unit_factor_exponent > 0x08) - return int8_t{unit_factor_exponent} - 16; + return static_cast<int8_t>(unit_factor_exponent) - 16; return unit_factor_exponent; }
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc index da85cd3..a6f7aa3f 100644 --- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc +++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -20,6 +20,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_capabilities.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_constraints.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_photo_capabilities.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_point_2d.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -501,11 +502,22 @@ // TODO(mcasas): support other Mode types beyond simple string i.e. the // equivalents of "sequence<DOMString>"" or "ConstrainDOMStringParameters". +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_white_balance_mode = + constraints->hasWhiteBalanceMode() && + constraints->whiteBalanceMode()->IsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_white_balance_mode = constraints->hasWhiteBalanceMode() && constraints->whiteBalanceMode().IsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_white_balance_mode) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto white_balance_mode = + constraints->whiteBalanceMode()->GetAsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto white_balance_mode = constraints->whiteBalanceMode().GetAsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (capabilities_->whiteBalanceMode().Find(white_balance_mode) == kNotFound) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -516,10 +528,19 @@ temp_constraints->setWhiteBalanceMode(constraints->whiteBalanceMode()); settings->white_balance_mode = ParseMeteringMode(white_balance_mode); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_exposure_mode = + constraints->hasExposureMode() && constraints->exposureMode()->IsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_exposure_mode = constraints->hasExposureMode() && constraints->exposureMode().IsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_exposure_mode) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto exposure_mode = constraints->exposureMode()->GetAsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto exposure_mode = constraints->exposureMode().GetAsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (capabilities_->exposureMode().Find(exposure_mode) == kNotFound) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, "Unsupported exposureMode.")); @@ -529,10 +550,19 @@ settings->exposure_mode = ParseMeteringMode(exposure_mode); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_focus_mode = + constraints->hasFocusMode() && constraints->focusMode()->IsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_focus_mode = constraints->hasFocusMode() && constraints->focusMode().IsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_focus_mode) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto focus_mode = constraints->focusMode()->GetAsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto focus_mode = constraints->focusMode().GetAsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (capabilities_->focusMode().Find(focus_mode) == kNotFound) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, "Unsupported focusMode.")); @@ -544,9 +574,19 @@ // TODO(mcasas): support ConstrainPoint2DParameters. if (constraints->hasPointsOfInterest() && - constraints->pointsOfInterest().IsPoint2DSequence()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + constraints->pointsOfInterest()->IsPoint2DSequence() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + constraints->pointsOfInterest().IsPoint2DSequence() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { for (const auto& point : - constraints->pointsOfInterest().GetAsPoint2DSequence()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + constraints->pointsOfInterest()->GetAsPoint2DSequence() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + constraints->pointsOfInterest().GetAsPoint2DSequence() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { auto mojo_point = media::mojom::blink::Point2D::New(); mojo_point->x = point->x(); mojo_point->y = point->y(); @@ -556,12 +596,23 @@ } // TODO(mcasas): support ConstrainDoubleRange where applicable. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_exposure_compensation = + constraints->hasExposureCompensation() && + constraints->exposureCompensation()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_exposure_compensation = constraints->hasExposureCompensation() && constraints->exposureCompensation().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_exposure_compensation) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto exposure_compensation = + constraints->exposureCompensation()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto exposure_compensation = constraints->exposureCompensation().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (exposure_compensation < capabilities_->exposureCompensation()->min() || exposure_compensation > capabilities_->exposureCompensation()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -574,10 +625,19 @@ settings->exposure_compensation = exposure_compensation; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_exposure_time = + constraints->hasExposureTime() && constraints->exposureTime()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_exposure_time = constraints->hasExposureTime() && constraints->exposureTime().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_exposure_time) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto exposure_time = constraints->exposureTime()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto exposure_time = constraints->exposureTime().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (exposure_time < capabilities_->exposureTime()->min() || exposure_time > capabilities_->exposureTime()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -588,11 +648,21 @@ temp_constraints->setExposureTime(constraints->exposureTime()); settings->exposure_time = exposure_time; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_color_temperature = constraints->hasColorTemperature() && + constraints->colorTemperature()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_color_temperature = constraints->hasColorTemperature() && constraints->colorTemperature().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_color_temperature) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto color_temperature = + constraints->colorTemperature()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto color_temperature = constraints->colorTemperature().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (color_temperature < capabilities_->colorTemperature()->min() || color_temperature > capabilities_->colorTemperature()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -603,9 +673,17 @@ temp_constraints->setColorTemperature(constraints->colorTemperature()); settings->color_temperature = color_temperature; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_iso = constraints->hasIso() && constraints->iso()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_iso = constraints->hasIso() && constraints->iso().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_iso) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto iso = constraints->iso()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto iso = constraints->iso().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (iso < capabilities_->iso()->min() || iso > capabilities_->iso()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -616,10 +694,19 @@ settings->iso = iso; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_brightness = + constraints->hasBrightness() && constraints->brightness()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_brightness = constraints->hasBrightness() && constraints->brightness().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_brightness) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto brightness = constraints->brightness()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto brightness = constraints->brightness().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (brightness < capabilities_->brightness()->min() || brightness > capabilities_->brightness()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -630,10 +717,19 @@ temp_constraints->setBrightness(constraints->brightness()); settings->brightness = brightness; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_contrast = + constraints->hasContrast() && constraints->contrast()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_contrast = constraints->hasContrast() && constraints->contrast().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_contrast) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto contrast = constraints->contrast()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto contrast = constraints->contrast().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (contrast < capabilities_->contrast()->min() || contrast > capabilities_->contrast()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -644,10 +740,19 @@ temp_constraints->setContrast(constraints->contrast()); settings->contrast = contrast; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_saturation = + constraints->hasSaturation() && constraints->saturation()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_saturation = constraints->hasSaturation() && constraints->saturation().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_saturation) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto saturation = constraints->saturation()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto saturation = constraints->saturation().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (saturation < capabilities_->saturation()->min() || saturation > capabilities_->saturation()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -658,10 +763,19 @@ temp_constraints->setSaturation(constraints->saturation()); settings->saturation = saturation; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_sharpness = + constraints->hasSharpness() && constraints->sharpness()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_sharpness = constraints->hasSharpness() && constraints->sharpness().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_sharpness) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto sharpness = constraints->sharpness()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto sharpness = constraints->sharpness().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (sharpness < capabilities_->sharpness()->min() || sharpness > capabilities_->sharpness()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -673,10 +787,19 @@ settings->sharpness = sharpness; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_focus_distance = constraints->hasFocusDistance() && + constraints->focusDistance()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_focus_distance = constraints->hasFocusDistance() && constraints->focusDistance().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_focus_distance) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto focus_distance = constraints->focusDistance()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto focus_distance = constraints->focusDistance().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (focus_distance < capabilities_->focusDistance()->min() || focus_distance > capabilities_->focusDistance()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -688,14 +811,22 @@ settings->focus_distance = focus_distance; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_pan = constraints->hasPan() && constraints->pan()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_pan = constraints->hasPan() && constraints->pan().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_pan) { if (!IsPageVisible()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kSecurityError, "the page is not visible")); return; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto pan = constraints->pan()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto pan = constraints->pan().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (pan < capabilities_->pan()->min() || pan > capabilities_->pan()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -706,14 +837,23 @@ settings->pan = pan; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_tilt = + constraints->hasTilt() && constraints->tilt()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_tilt = constraints->hasTilt() && constraints->tilt().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_tilt) { if (!IsPageVisible()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kSecurityError, "the page is not visible")); return; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto tilt = constraints->tilt()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto tilt = constraints->tilt().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (tilt < capabilities_->tilt()->min() || tilt > capabilities_->tilt()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -724,14 +864,23 @@ settings->tilt = tilt; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_zoom = + constraints->hasZoom() && constraints->zoom()->IsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_zoom = constraints->hasZoom() && constraints->zoom().IsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_zoom) { if (!IsPageVisible()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kSecurityError, "the page is not visible")); return; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto zoom = constraints->zoom()->GetAsDouble(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto zoom = constraints->zoom().GetAsDouble(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (zoom < capabilities_->zoom()->min() || zoom > capabilities_->zoom()->max()) { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -743,10 +892,19 @@ } // TODO(mcasas): support ConstrainBooleanParameters where applicable. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + settings->has_torch = + constraints->hasTorch() && constraints->torch()->IsBoolean(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) settings->has_torch = constraints->hasTorch() && constraints->torch().IsBoolean(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (settings->has_torch) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto torch = constraints->torch()->GetAsBoolean(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto torch = constraints->torch().GetAsBoolean(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (torch && !capabilities_->torch()) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotSupportedError, "torch not supported"));
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_key_path.cc b/third_party/blink/renderer/modules/indexeddb/idb_key_path.cc index 0e08d63e..2ed7be2 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_key_path.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_key_path.cc
@@ -138,6 +138,7 @@ } } +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) IDBKeyPath::IDBKeyPath(const StringOrStringSequence& key_path) { if (key_path.IsNull()) { type_ = mojom::IDBKeyPathType::Null; @@ -155,6 +156,7 @@ #endif } } +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) bool IDBKeyPath::IsValid() const { switch (type_) {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_key_path.h b/third_party/blink/renderer/modules/indexeddb/idb_key_path.h index 64ac34af..564d0d18 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_key_path.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_key_path.h
@@ -54,8 +54,9 @@ explicit IDBKeyPath(const String&); explicit IDBKeyPath(const Vector<String>& array); explicit IDBKeyPath(const V8UnionStringOrStringSequence* key_path); - // TODO(crbug.com/1181288): Remove the old IDL union version. +#if !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) explicit IDBKeyPath(const StringOrStringSequence& key_path); +#endif // !defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) mojom::IDBKeyPathType GetType() const { return type_; }
diff --git a/third_party/blink/renderer/modules/managed_device/navigator_managed.idl b/third_party/blink/renderer/modules/managed_device/navigator_managed.idl index f2e424b..0be789c 100644 --- a/third_party/blink/renderer/modules/managed_device/navigator_managed.idl +++ b/third_party/blink/renderer/modules/managed_device/navigator_managed.idl
@@ -4,7 +4,6 @@ // [ ImplementedAs=NavigatorManagedData, - RuntimeEnabled=ManagedInterface, SecureContext ] partial interface Navigator { [SameObject]
diff --git a/third_party/blink/renderer/modules/managed_device/navigator_managed_data.idl b/third_party/blink/renderer/modules/managed_device/navigator_managed_data.idl index e62fb69..aa3d153 100644 --- a/third_party/blink/renderer/modules/managed_device/navigator_managed_data.idl +++ b/third_party/blink/renderer/modules/managed_device/navigator_managed_data.idl
@@ -5,7 +5,6 @@ [ ActiveScriptWrappable, Exposed=Window, - RuntimeEnabled=ManagedInterface, SecureContext ] interface NavigatorManagedData : EventTarget { // Managed Configuration API.
diff --git a/third_party/blink/renderer/modules/mediastream/capture_handle_change_event.cc b/third_party/blink/renderer/modules/mediastream/capture_handle_change_event.cc index a3b1044..8d2a60e 100644 --- a/third_party/blink/renderer/modules/mediastream/capture_handle_change_event.cc +++ b/third_party/blink/renderer/modules/mediastream/capture_handle_change_event.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/modules/mediastream/capture_handle_change_event.h" -#include "third_party/blink/renderer/modules/mediastream/capture_handle.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/mediastream/identifiability_metrics.cc b/third_party/blink/renderer/modules/mediastream/identifiability_metrics.cc index 79122a4..46f58fe 100644 --- a/third_party/blink/renderer/modules/mediastream/identifiability_metrics.cc +++ b/third_party/blink/renderer/modules/mediastream/identifiability_metrics.cc
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/string_or_string_sequence_or_constrain_dom_string_parameters.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_constraints.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_constraint_set.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/platform/privacy_budget/identifiability_digest_helpers.h" @@ -40,6 +41,22 @@ builder.AddToken(range->hasMin() ? range->min() : IdentifiableToken()); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, const V8ConstrainDouble* d) { + if (!d) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (d->GetContentType()) { + case V8ConstrainDouble::ContentType::kConstrainDoubleRange: + return Visit(builder, d->GetAsConstrainDoubleRange()); + case V8ConstrainDouble::ContentType::kDouble: + builder.AddToken(d->GetAsDouble()); + return; + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const ConstrainDouble& d) { if (d.IsDouble()) { builder.AddToken(d.GetAsDouble()); @@ -52,7 +69,24 @@ DCHECK(d.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, const V8ConstrainLong* l) { + if (!l) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (l->GetContentType()) { + case V8ConstrainLong::ContentType::kConstrainLongRange: + return Visit(builder, l->GetAsConstrainLongRange()); + case V8ConstrainLong::ContentType::kLong: + builder.AddToken(l->GetAsLong()); + return; + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const ConstrainLong& l) { if (l.IsLong()) { builder.AddToken(l.GetAsLong()); @@ -65,7 +99,28 @@ DCHECK(l.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, + const V8UnionStringOrStringSequence* s) { + if (!s) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (s->GetContentType()) { + case V8UnionStringOrStringSequence::ContentType::kString: + builder.AddToken(IdentifiabilityBenignStringToken(s->GetAsString())); + return; + case V8UnionStringOrStringSequence::ContentType::kStringSequence: + for (const String& str : s->GetAsStringSequence()) { + builder.AddToken(IdentifiabilityBenignStringToken(str)); + } + return; + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const StringOrStringSequence& s) { if (s.IsString()) { builder.AddToken(IdentifiabilityBenignStringToken(s.GetAsString())); @@ -80,7 +135,34 @@ DCHECK(s.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, const V8ConstrainDOMString* s) { + if (!s) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (s->GetContentType()) { + case V8ConstrainDOMString::ContentType::kConstrainDOMStringParameters: { + const ConstrainDOMStringParameters* params = + s->GetAsConstrainDOMStringParameters(); + Visit(builder, params->getExactOr(nullptr)); + Visit(builder, params->getIdealOr(nullptr)); + return; + } + case V8ConstrainDOMString::ContentType::kString: + builder.AddToken(IdentifiabilityBenignStringToken(s->GetAsString())); + return; + case V8ConstrainDOMString::ContentType::kStringSequence: + for (const String& str : s->GetAsStringSequence()) { + builder.AddToken(IdentifiabilityBenignStringToken(str)); + } + return; + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const ConstrainDOMString& s) { if (s.IsString()) { builder.AddToken(IdentifiabilityBenignStringToken(s.GetAsString())); @@ -110,7 +192,31 @@ DCHECK(s.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, const V8ConstrainBoolean* b) { + if (!b) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (b->GetContentType()) { + case V8ConstrainBoolean::ContentType::kBoolean: + builder.AddToken(b->GetAsBoolean()); + return; + case V8ConstrainBoolean::ContentType::kConstrainBooleanParameters: { + const ConstrainBooleanParameters* params = + b->GetAsConstrainBooleanParameters(); + builder.AddToken(params->hasExact() ? params->exact() + : IdentifiableToken()); + builder.AddToken(params->hasIdeal() ? params->ideal() + : IdentifiableToken()); + return; + } + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const ConstrainBoolean& b) { if (b.IsBoolean()) { builder.AddToken(b.GetAsBoolean()); @@ -128,7 +234,28 @@ DCHECK(b.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, + const V8UnionBooleanOrConstrainDouble* x) { + if (!x) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (x->GetContentType()) { + case V8UnionBooleanOrConstrainDouble::ContentType::kBoolean: + builder.AddToken(x->GetAsBoolean()); + return; + case V8UnionBooleanOrConstrainDouble::ContentType::kConstrainDoubleRange: + return Visit(builder, x->GetAsConstrainDoubleRange()); + case V8UnionBooleanOrConstrainDouble::ContentType::kDouble: + builder.AddToken(x->GetAsDouble()); + return; + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const BooleanOrDoubleOrConstrainDoubleRange& x) { if (x.IsBoolean()) { @@ -146,6 +273,7 @@ DCHECK(x.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const HeapVector<Member<Point2D>>& points) { @@ -155,6 +283,34 @@ } } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, const V8ConstrainPoint2D* p) { + if (!p) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (p->GetContentType()) { + case V8ConstrainPoint2D::ContentType::kConstrainPoint2DParameters: { + const ConstrainPoint2DParameters* params = + p->GetAsConstrainPoint2DParameters(); + if (params->hasExact()) { + Visit(builder, params->exact()); + } else { + builder.AddToken(IdentifiableToken()); + } + if (params->hasIdeal()) { + Visit(builder, params->ideal()); + } else { + builder.AddToken(IdentifiableToken()); + } + return; + } + case V8ConstrainPoint2D::ContentType::kPoint2DSequence: + return Visit(builder, p->GetAsPoint2DSequence()); + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const ConstrainPoint2D& x) { if (x.IsPoint2DSequence()) { Visit(builder, x.GetAsPoint2DSequence()); @@ -178,11 +334,43 @@ DCHECK(x.IsNull()); builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const MediaTrackConstraintSet& set) { // TODO(crbug.com/1070871): As a workaround for code simplicity, we use a // default value of a union type if each member is not provided in input. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + Visit(builder, set.getWidthOr(nullptr)); + Visit(builder, set.getHeightOr(nullptr)); + Visit(builder, set.getAspectRatioOr(nullptr)); + Visit(builder, set.getFrameRateOr(nullptr)); + Visit(builder, set.getFacingModeOr(nullptr)); + Visit(builder, set.getSampleRateOr(nullptr)); + Visit(builder, set.getSampleSizeOr(nullptr)); + Visit(builder, set.getEchoCancellationOr(nullptr)); + Visit(builder, set.getAutoGainControlOr(nullptr)); + Visit(builder, set.getLatencyOr(nullptr)); + Visit(builder, set.getChannelCountOr(nullptr)); + Visit(builder, set.getVideoKindOr(nullptr)); + Visit(builder, set.getWhiteBalanceModeOr(nullptr)); + Visit(builder, set.getExposureModeOr(nullptr)); + Visit(builder, set.getFocusModeOr(nullptr)); + Visit(builder, set.getPointsOfInterestOr(nullptr)); + Visit(builder, set.getExposureCompensationOr(nullptr)); + Visit(builder, set.getExposureTimeOr(nullptr)); + Visit(builder, set.getColorTemperatureOr(nullptr)); + Visit(builder, set.getIsoOr(nullptr)); + Visit(builder, set.getBrightnessOr(nullptr)); + Visit(builder, set.getContrastOr(nullptr)); + Visit(builder, set.getSaturationOr(nullptr)); + Visit(builder, set.getSharpnessOr(nullptr)); + Visit(builder, set.getFocusDistanceOr(nullptr)); + Visit(builder, set.getPanOr(nullptr)); + Visit(builder, set.getTiltOr(nullptr)); + Visit(builder, set.getZoomOr(nullptr)); + Visit(builder, set.getTorchOr(nullptr)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Visit(builder, set.hasWidth() ? set.width() : ConstrainLong()); Visit(builder, set.hasHeight() ? set.height() : ConstrainLong()); Visit(builder, set.hasAspectRatio() ? set.aspectRatio() : ConstrainDouble()); @@ -224,8 +412,38 @@ Visit(builder, set.hasZoom() ? set.zoom() : BooleanOrDoubleOrConstrainDoubleRange()); Visit(builder, set.hasTorch() ? set.torch() : ConstrainBoolean()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void Visit(IdentifiableTokenBuilder& builder, + const V8UnionBooleanOrMediaTrackConstraints* constraint) { + if (!constraint) { + builder.AddToken(IdentifiableToken()); + return; + } + switch (constraint->GetContentType()) { + case V8UnionBooleanOrMediaTrackConstraints::ContentType::kBoolean: + builder.AddToken(constraint->GetAsBoolean()); + return; + case V8UnionBooleanOrMediaTrackConstraints::ContentType:: + kMediaTrackConstraints: { + const MediaTrackConstraints* constraints = + constraint->GetAsMediaTrackConstraints(); + DCHECK(constraints); + if (constraints->hasAdvanced()) { + for (const auto& advanced : constraints->advanced()) { + Visit(builder, *advanced); + } + } else { + builder.AddToken(IdentifiableToken()); + } + return; + } + } + NOTREACHED(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void Visit(IdentifiableTokenBuilder& builder, const BooleanOrMediaTrackConstraints& constraint) { if (constraint.IsBoolean()) { @@ -246,6 +464,7 @@ } builder.AddToken(IdentifiableToken()); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc index 3e4f87d..20ed561e 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.cc
@@ -33,11 +33,17 @@ #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/renderer/bindings/core/v8/array_value.h" #include "third_party/blink/renderer/bindings/core/v8/dictionary.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_constrain_boolean_parameters.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_constrain_dom_string_parameters.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_constrain_double_range.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_constrain_long_range.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_constraints.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/deprecation.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/inspector/console_message.h" +#include "third_party/blink/renderer/modules/mediastream/media_error_state.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" @@ -47,7 +53,6 @@ #include "third_party/blink/renderer/platform/wtf/vector.h" namespace blink { - namespace media_constraints_impl { // A naked value is treated as an "ideal" value in the basic constraints, @@ -493,6 +498,41 @@ return CreateFromNamedConstraints(context, mandatory, optional, error_state); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void CopyLongConstraint(const V8ConstrainLong* blink_union_form, + NakedValueDisposition naked_treatment, + LongConstraint& web_form) { + web_form.SetIsPresent(true); + switch (blink_union_form->GetContentType()) { + case V8ConstrainLong::ContentType::kConstrainLongRange: { + const auto* blink_form = blink_union_form->GetAsConstrainLongRange(); + if (blink_form->hasMin()) { + web_form.SetMin(blink_form->min()); + } + if (blink_form->hasMax()) { + web_form.SetMax(blink_form->max()); + } + if (blink_form->hasIdeal()) { + web_form.SetIdeal(blink_form->ideal()); + } + if (blink_form->hasExact()) { + web_form.SetExact(blink_form->exact()); + } + break; + } + case V8ConstrainLong::ContentType::kLong: + switch (naked_treatment) { + case NakedValueDisposition::kTreatAsIdeal: + web_form.SetIdeal(blink_union_form->GetAsLong()); + break; + case NakedValueDisposition::kTreatAsExact: + web_form.SetExact(blink_union_form->GetAsLong()); + break; + } + break; + } +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void CopyLongConstraint(const LongOrConstrainLongRange& blink_union_form, NakedValueDisposition naked_treatment, LongConstraint& web_form) { @@ -522,7 +562,43 @@ web_form.SetExact(blink_form->exact()); } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void CopyDoubleConstraint(const V8ConstrainDouble* blink_union_form, + NakedValueDisposition naked_treatment, + DoubleConstraint& web_form) { + web_form.SetIsPresent(true); + switch (blink_union_form->GetContentType()) { + case V8ConstrainDouble::ContentType::kConstrainDoubleRange: { + const auto* blink_form = blink_union_form->GetAsConstrainDoubleRange(); + if (blink_form->hasMin()) { + web_form.SetMin(blink_form->min()); + } + if (blink_form->hasMax()) { + web_form.SetMax(blink_form->max()); + } + if (blink_form->hasIdeal()) { + web_form.SetIdeal(blink_form->ideal()); + } + if (blink_form->hasExact()) { + web_form.SetExact(blink_form->exact()); + } + break; + } + case V8ConstrainDouble::ContentType::kDouble: + switch (naked_treatment) { + case NakedValueDisposition::kTreatAsIdeal: + web_form.SetIdeal(blink_union_form->GetAsDouble()); + break; + case NakedValueDisposition::kTreatAsExact: + web_form.SetExact(blink_union_form->GetAsDouble()); + break; + } + break; + } +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void CopyDoubleConstraint(const DoubleOrConstrainDoubleRange& blink_union_form, NakedValueDisposition naked_treatment, DoubleConstraint& web_form) { @@ -552,7 +628,25 @@ web_form.SetExact(blink_form->exact()); } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void CopyBooleanOrDoubleConstraint( + const V8UnionBooleanOrConstrainDouble* blink_union_form, + NakedValueDisposition naked_treatment, + DoubleConstraint& web_form) { + switch (blink_union_form->GetContentType()) { + case V8UnionBooleanOrConstrainDouble::ContentType::kBoolean: + web_form.SetIsPresent(blink_union_form->GetAsBoolean()); + break; + case V8UnionBooleanOrConstrainDouble::ContentType::kConstrainDoubleRange: + case V8UnionBooleanOrConstrainDouble::ContentType::kDouble: + CopyDoubleConstraint(blink_union_form->GetAsV8ConstrainDouble(), + naked_treatment, web_form); + break; + } +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void CopyBooleanOrDoubleConstraint( const BooleanOrDoubleOrConstrainDoubleRange& blink_union_form, NakedValueDisposition naked_treatment, @@ -571,7 +665,64 @@ } CopyDoubleConstraint(double_constraint, naked_treatment, web_form); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void CopyStringConstraint(const V8ConstrainDOMString* blink_union_form, + NakedValueDisposition naked_treatment, + StringConstraint& web_form) { + web_form.SetIsPresent(true); + switch (blink_union_form->GetContentType()) { + case V8ConstrainDOMString::ContentType::kConstrainDOMStringParameters: { + const auto* blink_form = + blink_union_form->GetAsConstrainDOMStringParameters(); + if (blink_form->hasIdeal()) { + switch (blink_form->ideal()->GetContentType()) { + case V8UnionStringOrStringSequence::ContentType::kString: + web_form.SetIdeal( + Vector<String>(1, blink_form->ideal()->GetAsString())); + break; + case V8UnionStringOrStringSequence::ContentType::kStringSequence: + web_form.SetIdeal(blink_form->ideal()->GetAsStringSequence()); + break; + } + } + if (blink_form->hasExact()) { + switch (blink_form->exact()->GetContentType()) { + case V8UnionStringOrStringSequence::ContentType::kString: + web_form.SetExact( + Vector<String>(1, blink_form->exact()->GetAsString())); + break; + case V8UnionStringOrStringSequence::ContentType::kStringSequence: + web_form.SetExact(blink_form->exact()->GetAsStringSequence()); + break; + } + } + break; + } + case V8ConstrainDOMString::ContentType::kString: + switch (naked_treatment) { + case NakedValueDisposition::kTreatAsIdeal: + web_form.SetIdeal(Vector<String>(1, blink_union_form->GetAsString())); + break; + case NakedValueDisposition::kTreatAsExact: + web_form.SetExact(Vector<String>(1, blink_union_form->GetAsString())); + break; + } + break; + case V8ConstrainDOMString::ContentType::kStringSequence: + switch (naked_treatment) { + case NakedValueDisposition::kTreatAsIdeal: + web_form.SetIdeal(blink_union_form->GetAsStringSequence()); + break; + case NakedValueDisposition::kTreatAsExact: + web_form.SetExact(blink_union_form->GetAsStringSequence()); + break; + } + break; + } +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void CopyStringConstraint( const StringOrStringSequenceOrConstrainDOMStringParameters& blink_union_form, @@ -617,7 +768,38 @@ } } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +void CopyBooleanConstraint(const V8ConstrainBoolean* blink_union_form, + NakedValueDisposition naked_treatment, + BooleanConstraint& web_form) { + web_form.SetIsPresent(true); + switch (blink_union_form->GetContentType()) { + case V8ConstrainBoolean::ContentType::kBoolean: + switch (naked_treatment) { + case NakedValueDisposition::kTreatAsIdeal: + web_form.SetIdeal(blink_union_form->GetAsBoolean()); + break; + case NakedValueDisposition::kTreatAsExact: + web_form.SetExact(blink_union_form->GetAsBoolean()); + break; + } + break; + case V8ConstrainBoolean::ContentType::kConstrainBooleanParameters: { + const auto* blink_form = + blink_union_form->GetAsConstrainBooleanParameters(); + if (blink_form->hasIdeal()) { + web_form.SetIdeal(blink_form->ideal()); + } + if (blink_form->hasExact()) { + web_form.SetExact(blink_form->exact()); + } + break; + } + } +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void CopyBooleanConstraint( const BooleanOrConstrainBooleanParameters& blink_union_form, NakedValueDisposition naked_treatment, @@ -642,6 +824,7 @@ web_form.SetExact(blink_form->exact()); } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void CopyConstraintSet(const MediaTrackConstraintSet* constraints_in, NakedValueDisposition naked_treatment, @@ -820,6 +1003,27 @@ return input.Exact(); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8ConstrainLong* ConvertLong(const LongConstraint& input, + NakedValueDisposition naked_treatment) { + if (UseNakedNumeric(input, naked_treatment)) { + return MakeGarbageCollected<V8ConstrainLong>( + GetNakedValue<uint32_t>(input, naked_treatment)); + } else if (!input.IsUnconstrained()) { + ConstrainLongRange* output = ConstrainLongRange::Create(); + if (input.HasExact()) + output->setExact(input.Exact()); + if (input.HasMin()) + output->setMin(input.Min()); + if (input.HasMax()) + output->setMax(input.Max()); + if (input.HasIdeal()) + output->setIdeal(input.Ideal()); + return MakeGarbageCollected<V8ConstrainLong>(output); + } + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) LongOrConstrainLongRange ConvertLong(const LongConstraint& input, NakedValueDisposition naked_treatment) { LongOrConstrainLongRange output_union; @@ -839,7 +1043,29 @@ } return output_union; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8ConstrainDouble* ConvertDouble(const DoubleConstraint& input, + NakedValueDisposition naked_treatment) { + if (UseNakedNumeric(input, naked_treatment)) { + return MakeGarbageCollected<V8ConstrainDouble>( + GetNakedValue<double>(input, naked_treatment)); + } else if (!input.IsUnconstrained()) { + ConstrainDoubleRange* output = ConstrainDoubleRange::Create(); + if (input.HasExact()) + output->setExact(input.Exact()); + if (input.HasIdeal()) + output->setIdeal(input.Ideal()); + if (input.HasMin()) + output->setMin(input.Min()); + if (input.HasMax()) + output->setMax(input.Max()); + return MakeGarbageCollected<V8ConstrainDouble>(output); + } + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DoubleOrConstrainDoubleRange ConvertDouble( const DoubleConstraint& input, NakedValueDisposition naked_treatment) { @@ -860,7 +1086,30 @@ } return output_union; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8UnionBooleanOrConstrainDouble* ConvertBooleanOrDouble( + const DoubleConstraint& input, + NakedValueDisposition naked_treatment) { + if (UseNakedNumeric(input, naked_treatment)) { + return MakeGarbageCollected<V8UnionBooleanOrConstrainDouble>( + GetNakedValue<double>(input, naked_treatment)); + } else if (!input.IsUnconstrained()) { + ConstrainDoubleRange* output = ConstrainDoubleRange::Create(); + if (input.HasExact()) + output->setExact(input.Exact()); + if (input.HasIdeal()) + output->setIdeal(input.Ideal()); + if (input.HasMin()) + output->setMin(input.Min()); + if (input.HasMax()) + output->setMax(input.Max()); + return MakeGarbageCollected<V8UnionBooleanOrConstrainDouble>(output); + } + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) BooleanOrDoubleOrConstrainDoubleRange ConvertBooleanOrDouble( const DoubleConstraint& input, NakedValueDisposition naked_treatment) { @@ -881,7 +1130,23 @@ } return output_union; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8UnionStringOrStringSequence* ConvertStringSequence( + const WebVector<WebString>& input) { + if (input.size() > 1) { + Vector<String> buffer; + for (const auto& scanner : input) + buffer.push_back(scanner); + return MakeGarbageCollected<V8UnionStringOrStringSequence>( + std::move(buffer)); + } else if (!input.empty()) { + return MakeGarbageCollected<V8UnionStringOrStringSequence>(input[0]); + } + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) StringOrStringSequence ConvertStringSequence( const WebVector<WebString>& input) { StringOrStringSequence the_strings; @@ -895,7 +1160,35 @@ } return the_strings; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8ConstrainDOMString* ConvertString(const StringConstraint& input, + NakedValueDisposition naked_treatment) { + if (UseNakedNonNumeric(input, naked_treatment)) { + WebVector<WebString> input_buffer( + GetNakedValue<WebVector<WebString>>(input, naked_treatment)); + if (input_buffer.size() > 1) { + Vector<String> buffer; + for (const auto& scanner : input_buffer) + buffer.push_back(scanner); + return MakeGarbageCollected<V8ConstrainDOMString>(std::move(buffer)); + } else if (!input_buffer.empty()) { + return MakeGarbageCollected<V8ConstrainDOMString>(input_buffer[0]); + } + return nullptr; + } else if (!input.IsUnconstrained()) { + ConstrainDOMStringParameters* output = + ConstrainDOMStringParameters::Create(); + if (input.HasExact()) + output->setExact(ConvertStringSequence(input.Exact())); + if (input.HasIdeal()) + output->setIdeal(ConvertStringSequence(input.Ideal())); + return MakeGarbageCollected<V8ConstrainDOMString>(output); + } + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) StringOrStringSequenceOrConstrainDOMStringParameters ConvertString( const StringConstraint& input, NakedValueDisposition naked_treatment) { @@ -922,7 +1215,25 @@ } return output_union; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8ConstrainBoolean* ConvertBoolean(const BooleanConstraint& input, + NakedValueDisposition naked_treatment) { + if (UseNakedNonNumeric(input, naked_treatment)) { + return MakeGarbageCollected<V8ConstrainBoolean>( + GetNakedValue<bool>(input, naked_treatment)); + } else if (!input.IsUnconstrained()) { + ConstrainBooleanParameters* output = ConstrainBooleanParameters::Create(); + if (input.HasExact()) + output->setExact(input.Exact()); + if (input.HasIdeal()) + output->setIdeal(input.Ideal()); + return MakeGarbageCollected<V8ConstrainBoolean>(output); + } + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) BooleanOrConstrainBooleanParameters ConvertBoolean( const BooleanConstraint& input, NakedValueDisposition naked_treatment) { @@ -939,6 +1250,7 @@ } return output_union; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void ConvertConstraintSet(const MediaTrackConstraintSetPlatform& input, NakedValueDisposition naked_treatment,
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.h b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.h index 82ac3531..15c0438 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_impl.h +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_impl.h
@@ -31,15 +31,14 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_CONSTRAINTS_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_CONSTRAINTS_IMPL_H_ -#include "third_party/blink/renderer/modules/mediastream/media_error_state.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/mediastream/media_constraints.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { class Dictionary; class ExecutionContext; +class MediaErrorState; class MediaTrackConstraints; namespace media_constraints_impl {
diff --git a/third_party/blink/renderer/modules/mediastream/media_constraints_test.cc b/third_party/blink/renderer/modules/mediastream/media_constraints_test.cc index 263a953..beeec767b 100644 --- a/third_party/blink/renderer/modules/mediastream/media_constraints_test.cc +++ b/third_party/blink/renderer/modules/mediastream/media_constraints_test.cc
@@ -3,8 +3,11 @@ // found in the LICENSE file. #include "third_party/blink/renderer/platform/mediastream/media_constraints.h" + #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_constrain_dom_string_parameters.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_constraints.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h" #include "third_party/blink/renderer/modules/mediastream/media_constraints_impl.h" namespace blink { @@ -162,8 +165,13 @@ MediaTrackConstraints* output = media_constraints_impl::ConvertConstraints(input); ASSERT_TRUE(output->hasFacingMode()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ASSERT_TRUE(output->facingMode()->IsString()); + EXPECT_EQ("foo", output->facingMode()->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(output->facingMode().IsString()); EXPECT_EQ("foo", output->facingMode().GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } TEST(MediaTrackConstraintsTest, ConvertWebDoubleStringConstraint) { @@ -181,8 +189,13 @@ MediaTrackConstraints* output = media_constraints_impl::ConvertConstraints(input); ASSERT_TRUE(output->hasFacingMode()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ASSERT_TRUE(output->facingMode()->IsStringSequence()); + const auto& out_buffer = output->facingMode()->GetAsStringSequence(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(output->facingMode().IsStringSequence()); auto out_buffer = output->facingMode().GetAsStringSequence(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) EXPECT_EQ("foo", out_buffer[0]); EXPECT_EQ("bar", out_buffer[1]); } @@ -190,8 +203,12 @@ TEST(MediaTrackConstraintsTest, ConvertBlinkStringConstraint) { MediaTrackConstraints* input = MediaTrackConstraints::Create(); MediaConstraints output; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* parameter = MakeGarbageCollected<V8ConstrainDOMString>("foo"); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) StringOrStringSequenceOrConstrainDOMStringParameters parameter; parameter.SetString("foo"); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) input->setFacingMode(parameter); output = media_constraints_impl::ConvertTrackConstraintsToMediaConstraints(input); @@ -203,13 +220,19 @@ TEST(MediaTrackConstraintsTest, ConvertBlinkComplexStringConstraint) { MediaTrackConstraints* input = MediaTrackConstraints::Create(); MediaConstraints output; - StringOrStringSequenceOrConstrainDOMStringParameters parameter; ConstrainDOMStringParameters* subparameter = ConstrainDOMStringParameters::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + subparameter->setIdeal( + MakeGarbageCollected<V8UnionStringOrStringSequence>("foo")); + auto* parameter = MakeGarbageCollected<V8ConstrainDOMString>(subparameter); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) StringOrStringSequence inner_string; inner_string.SetString("foo"); subparameter->setIdeal(inner_string); + StringOrStringSequenceOrConstrainDOMStringParameters parameter; parameter.SetConstrainDOMStringParameters(subparameter); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) input->setFacingMode(parameter); output = media_constraints_impl::ConvertTrackConstraintsToMediaConstraints(input); @@ -221,14 +244,23 @@ MediaTrackConstraints* recycled = media_constraints_impl::ConvertConstraints(output); ASSERT_TRUE(recycled->hasFacingMode()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ASSERT_TRUE(recycled->facingMode()->IsString()); + ASSERT_EQ("foo", recycled->facingMode()->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(recycled->facingMode().IsString()); ASSERT_EQ("foo", recycled->facingMode().GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } TEST(MediaTrackConstraintsTest, NakedIsExactInAdvanced) { MediaTrackConstraints* input = MediaTrackConstraints::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* parameter = MakeGarbageCollected<V8ConstrainDOMString>("foo"); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) StringOrStringSequenceOrConstrainDOMStringParameters parameter; parameter.SetString("foo"); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) input->setFacingMode(parameter); HeapVector<Member<MediaTrackConstraintSet>> advanced( 1, MediaTrackConstraintSet::Create()); @@ -277,19 +309,37 @@ MediaTrackConstraintSet* element2 = output->advanced()[1]; ASSERT_TRUE(output->hasFacingMode()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ASSERT_TRUE(output->facingMode()->IsString()); + EXPECT_EQ("ideal", output->facingMode()->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(output->facingMode().IsString()); EXPECT_EQ("ideal", output->facingMode().GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(element1->hasFacingMode()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ASSERT_TRUE(element1->facingMode()->IsConstrainDOMStringParameters()); + EXPECT_EQ("ideal", element1->facingMode() + ->GetAsConstrainDOMStringParameters() + ->ideal() + ->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(element1->facingMode().IsConstrainDOMStringParameters()); EXPECT_EQ("ideal", element1->facingMode() .GetAsConstrainDOMStringParameters() ->ideal() .GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(element2->hasFacingMode()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ASSERT_TRUE(element2->facingMode()->IsString()); + EXPECT_EQ("exact", element2->facingMode()->GetAsString()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ASSERT_TRUE(element2->facingMode().IsString()); EXPECT_EQ("exact", element2->facingMode().GetAsString()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.cc b/third_party/blink/renderer/modules/mediastream/media_devices.cc index 6ced1a42..49f1459 100644 --- a/third_party/blink/renderer/modules/mediastream/media_devices.cc +++ b/third_party/blink/renderer/modules/mediastream/media_devices.cc
@@ -14,6 +14,7 @@ #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_constraints.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_supported_constraints.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_domexception_overconstrainederror.h" @@ -23,7 +24,6 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/navigator.h" -#include "third_party/blink/renderer/modules/mediastream/capture_handle_config.h" #include "third_party/blink/renderer/modules/mediastream/identifiability_metrics.h" #include "third_party/blink/renderer/modules/mediastream/input_device_info.h" #include "third_party/blink/renderer/modules/mediastream/media_error_state.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices_test.cc b/third_party/blink/renderer/modules/mediastream/media_devices_test.cc index ec05e7c..96c79e22 100644 --- a/third_party/blink/renderer/modules/mediastream/media_devices_test.cc +++ b/third_party/blink/renderer/modules/mediastream/media_devices_test.cc
@@ -15,10 +15,10 @@ #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_constraints.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/testing/null_execution_context.h" -#include "third_party/blink/renderer/modules/mediastream/capture_handle_config.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_track.cc index da2a349d7..2467ff8db 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_track.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_track.cc
@@ -36,9 +36,12 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle_change_event.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_capture_handle_change_event_init.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_double_range.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_long_range.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_capabilities.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_constraints.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_track_settings.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_point_2d.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" @@ -48,6 +51,7 @@ #include "third_party/blink/renderer/modules/imagecapture/image_capture.h" #include "third_party/blink/renderer/modules/mediastream/apply_constraints_request.h" #include "third_party/blink/renderer/modules/mediastream/media_constraints_impl.h" +#include "third_party/blink/renderer/modules/mediastream/media_error_state.h" #include "third_party/blink/renderer/modules/mediastream/media_stream.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_utils.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc index 1300f8a..8930866 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -62,6 +62,7 @@ using blink::mojom::StreamSelectionStrategy; using EchoCancellationType = blink::AudioProcessingProperties::EchoCancellationType; +using AudioSourceErrorCode = media::AudioCapturerSource::ErrorCode; namespace { @@ -99,6 +100,8 @@ return "KILL_SWITCH_ON"; case MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED: return "SYSTEM_PERMISSION_DENIED"; + case MediaStreamRequestResult::DEVICE_IN_USE: + return "DEVICE_IN_USE"; case MediaStreamRequestResult::NUM_MEDIA_REQUEST_RESULTS: return "NUM_MEDIA_REQUEST_RESULTS"; default: @@ -1710,6 +1713,10 @@ user_media_request->Fail(UserMediaRequest::Error::kSystemPermissionDenied, "Permission denied by system"); return; + case MediaStreamRequestResult::DEVICE_IN_USE: + user_media_request->Fail(UserMediaRequest::Error::kDeviceInUse, + "Device in use"); + return; } NOTREACHED(); user_media_request->Fail(UserMediaRequest::Error::kPermissionDenied, ""); @@ -1774,15 +1781,19 @@ String message; if (source->GetType() == MediaStreamSource::kTypeAudio) { auto error = MediaStreamAudioSource::From(source)->ErrorCode(); - if (error.has_value() && - error.value() == - media::AudioCapturerSource::ErrorCode::kSystemPermissions) { - result = MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED; - message = - "System Permssions prevented access to audio capture device"; - } else { - result = MediaStreamRequestResult::TRACK_START_FAILURE_AUDIO; - message = "Failed to access audio capture device"; + switch (error.value_or(AudioSourceErrorCode::kUnknown)) { + case AudioSourceErrorCode::kSystemPermissions: + result = MediaStreamRequestResult::SYSTEM_PERMISSION_DENIED; + message = + "System Permssions prevented access to audio capture device"; + break; + case AudioSourceErrorCode::kDeviceInUse: + result = MediaStreamRequestResult::DEVICE_IN_USE; + message = "Audio capture device already in use"; + break; + default: + result = MediaStreamRequestResult::TRACK_START_FAILURE_AUDIO; + message = "Failed to access audio capture device"; } } else { result = MediaStreamRequestResult::TRACK_START_FAILURE_VIDEO;
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc index 034154f..926ed3b 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc +++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -48,6 +48,7 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/modules/mediastream/identifiability_metrics.h" #include "third_party/blink/renderer/modules/mediastream/media_constraints_impl.h" +#include "third_party/blink/renderer/modules/mediastream/media_error_state.h" #include "third_party/blink/renderer/modules/mediastream/media_stream.h" #include "third_party/blink/renderer/modules/mediastream/overconstrained_error.h" #include "third_party/blink/renderer/modules/mediastream/user_media_controller.h" @@ -279,6 +280,29 @@ } } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +MediaConstraints ParseOptions( + ExecutionContext* execution_context, + const V8UnionBooleanOrMediaTrackConstraints* options, + MediaErrorState& error_state) { + if (!options) + return MediaConstraints(); + switch (options->GetContentType()) { + case V8UnionBooleanOrMediaTrackConstraints::ContentType::kBoolean: + if (options->GetAsBoolean()) + return media_constraints_impl::Create(); + else + return MediaConstraints(); + case V8UnionBooleanOrMediaTrackConstraints::ContentType:: + kMediaTrackConstraints: + return media_constraints_impl::Create( + execution_context, options->GetAsMediaTrackConstraints(), + error_state); + } + NOTREACHED(); + return MediaConstraints(); +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) MediaConstraints ParseOptions(ExecutionContext* context, const BooleanOrMediaTrackConstraints& options, MediaErrorState& error_state) { @@ -298,6 +322,7 @@ return constraints; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace @@ -396,9 +421,14 @@ return nullptr; } if (audio.IsNull() && video.IsNull()) { - video = ParseOptions(context, - BooleanOrMediaTrackConstraints::FromBoolean(true), - error_state); + video = ParseOptions( + context, +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + MakeGarbageCollected<V8UnionBooleanOrMediaTrackConstraints>(true), +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + BooleanOrMediaTrackConstraints::FromBoolean(true), +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + error_state); if (error_state.HadException()) return nullptr; } @@ -604,6 +634,7 @@ exception_code = DOMExceptionCode::kAbortError; break; case Error::kTrackStart: + case Error::kDeviceInUse: exception_code = DOMExceptionCode::kNotReadableError; break; case Error::kNotSupported:
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.h b/third_party/blink/renderer/modules/mediastream/user_media_request.h index fa53e09..a466a3e 100644 --- a/third_party/blink/renderer/modules/mediastream/user_media_request.h +++ b/third_party/blink/renderer/modules/mediastream/user_media_request.h
@@ -66,7 +66,8 @@ kTrackStart, kFailedDueToShutdown, kKillSwitchOn, - kSystemPermissionDenied + kSystemPermissionDenied, + kDeviceInUse }; enum class MediaType {
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record.cc b/third_party/blink/renderer/modules/nfc/ndef_record.cc index 1c3bda9..87d5aac 100644 --- a/third_party/blink/renderer/modules/nfc/ndef_record.cc +++ b/third_party/blink/renderer/modules/nfc/ndef_record.cc
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h" #include "third_party/blink/renderer/core/typed_arrays/dom_data_view.h" #include "third_party/blink/renderer/modules/nfc/ndef_message.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -23,9 +24,6 @@ namespace blink { -using NDEFRecordDataSource = - StringOrArrayBufferOrArrayBufferViewOrNDEFMessageInit; - namespace { WTF::Vector<uint8_t> GetUTF8DataFromString(const String& string) { @@ -35,6 +33,37 @@ return data; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + +bool GetBytesOfBufferSource(const V8NDEFRecordDataSource* buffer_source, + WTF::Vector<uint8_t>* target, + ExceptionState& exception_state) { + DCHECK(buffer_source->IsV8BufferSource()); + DOMArrayPiece array_piece; + if (buffer_source->IsArrayBuffer()) { + array_piece = DOMArrayPiece(buffer_source->GetAsArrayBuffer()); + } else if (buffer_source->IsArrayBufferView()) { + array_piece = DOMArrayPiece(buffer_source->GetAsArrayBufferView().Get()); + } else { + NOTREACHED(); + return true; // true to be consistent with `exception_state`. + } + wtf_size_t checked_length; + if (!base::CheckedNumeric<wtf_size_t>(array_piece.ByteLength()) + .AssignIfValid(&checked_length)) { + exception_state.ThrowRangeError( + "The provided buffer source exceeds the maximum supported length"); + return false; + } + target->Append(array_piece.Bytes(), checked_length); + return true; +} + +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + +using NDEFRecordDataSource = + StringOrArrayBufferOrArrayBufferViewOrNDEFMessageInit; + bool IsBufferSource(const NDEFRecordDataSource& data) { return data.IsArrayBuffer() || data.IsArrayBufferView(); } @@ -69,6 +98,8 @@ return true; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + // https://w3c.github.io/web-nfc/#dfn-validate-external-type // Validates |input| as an external type. bool IsValidExternalType(const String& input) { @@ -152,8 +183,15 @@ const NDEFRecordInit& record, ExceptionState& exception_state) { // https://w3c.github.io/web-nfc/#mapping-string-to-ndef - if (!record.hasData() || - !(record.data().IsString() || IsBufferSource(record.data()))) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || + !(record.data()->IsString() || record.data()->IsV8BufferSource()) +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || + !(record.data().IsString() || IsBufferSource(record.data())) +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { exception_state.ThrowTypeError( "The data for 'text' NDEFRecords must be a String or a BufferSource."); return nullptr; @@ -176,8 +214,40 @@ return nullptr; } - auto& data = record.data(); - // TODO(crbug.com/1070871): Use encodingOr("utf-8"). +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto* data = record.data(); + const String& encoding_label = record.getEncodingOr("utf-8"); + WTF::Vector<uint8_t> bytes; + switch (data->GetContentType()) { + case V8NDEFRecordDataSource::ContentType::kArrayBuffer: + case V8NDEFRecordDataSource::ContentType::kArrayBufferView: + if (encoding_label != "utf-8" && encoding_label != "utf-16" && + encoding_label != "utf-16be" && encoding_label != "utf-16le") { + exception_state.ThrowTypeError( + "Encoding must be either \"utf-8\", \"utf-16\", \"utf-16be\", or " + "\"utf-16le\"."); + return nullptr; + } + if (!GetBytesOfBufferSource(data, &bytes, exception_state)) { + return nullptr; + } + break; + case V8NDEFRecordDataSource::ContentType::kNDEFMessageInit: + NOTREACHED(); + break; + case V8NDEFRecordDataSource::ContentType::kString: + if (encoding_label != "utf-8") { + exception_state.ThrowTypeError( + "A DOMString data source is always encoded as \"utf-8\" so other " + "encodings are not allowed."); + return nullptr; + } + StringUTF8Adaptor utf8_string(data->GetAsString()); + bytes.Append(utf8_string.data(), utf8_string.size()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto& data = record.data(); String encoding_label = record.hasEncoding() ? record.encoding() : "utf-8"; WTF::Vector<uint8_t> bytes; if (data.IsString()) { @@ -202,6 +272,7 @@ return nullptr; } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return MakeGarbageCollected<NDEFRecord>(id, encoding_label, language, std::move(bytes)); @@ -212,14 +283,24 @@ const NDEFRecordInit& record, ExceptionState& exception_state) { // https://w3c.github.io/web-nfc/#mapping-url-to-ndef - if (!record.hasData() || !record.data().IsString()) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !record.data()->IsString() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !record.data().IsString() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { exception_state.ThrowTypeError( "The data for url NDEFRecord must be a String."); return nullptr; } // No need to check mediaType according to the spec. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const String& url = record.data()->GetAsString(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) String url = record.data().GetAsString(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (!KURL(NullURL(), url).IsValid()) { exception_state.ThrowDOMException(DOMExceptionCode::kSyntaxError, "Cannot parse data for url record."); @@ -235,7 +316,13 @@ const NDEFRecordInit& record, ExceptionState& exception_state) { // https://w3c.github.io/web-nfc/#mapping-binary-data-to-ndef - if (!record.hasData() || !IsBufferSource(record.data())) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !record.data()->IsV8BufferSource() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !IsBufferSource(record.data()) +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { exception_state.ThrowTypeError( "The data for 'mime' NDEFRecord must be a BufferSource."); return nullptr; @@ -260,7 +347,13 @@ static NDEFRecord* CreateUnknownRecord(const String& id, const NDEFRecordInit& record, ExceptionState& exception_state) { - if (!record.hasData() || !IsBufferSource(record.data())) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !record.data()->IsV8BufferSource() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !IsBufferSource(record.data()) +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { exception_state.ThrowTypeError( "The data for 'unknown' NDEFRecord must be a BufferSource."); return nullptr; @@ -282,14 +375,26 @@ const NDEFRecordInit& record, ExceptionState& exception_state) { // https://w3c.github.io/web-nfc/#dfn-map-smart-poster-to-ndef - if (!record.hasData() || !record.data().IsNDEFMessageInit()) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !record.data()->IsNDEFMessageInit() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !record.hasData() || !record.data().IsNDEFMessageInit() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { exception_state.ThrowTypeError( "The data for 'smart-poster' NDEFRecord must be an NDEFMessageInit."); return nullptr; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + NDEFMessage* payload_message = NDEFMessage::CreateAsPayloadOfSmartPoster( + execution_context, record.data()->GetAsNDEFMessageInit(), + exception_state); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) NDEFMessage* payload_message = NDEFMessage::CreateAsPayloadOfSmartPoster( execution_context, record.data().GetAsNDEFMessageInit(), exception_state); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (exception_state.HadException()) return nullptr; DCHECK(payload_message); @@ -307,6 +412,35 @@ const String& record_type = record.recordType(); // https://w3c.github.io/web-nfc/#dfn-map-external-data-to-ndef +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (record.hasData()) { + switch (record.data()->GetContentType()) { + case V8NDEFRecordDataSource::ContentType::kArrayBuffer: + case V8NDEFRecordDataSource::ContentType::kArrayBufferView: { + Vector<uint8_t> bytes; + if (!GetBytesOfBufferSource(record.data(), &bytes, exception_state)) { + return nullptr; + } + return MakeGarbageCollected<NDEFRecord>( + device::mojom::blink::NDEFRecordTypeCategory::kExternal, + record_type, id, bytes); + } + case V8NDEFRecordDataSource::ContentType::kNDEFMessageInit: { + NDEFMessage* payload_message = NDEFMessage::Create( + execution_context, record.data()->GetAsNDEFMessageInit(), + exception_state, /*is_embedded=*/true); + if (exception_state.HadException()) + return nullptr; + DCHECK(payload_message); + return MakeGarbageCollected<NDEFRecord>( + device::mojom::blink::NDEFRecordTypeCategory::kExternal, + record_type, id, payload_message); + } + case V8NDEFRecordDataSource::ContentType::kString: + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (record.hasData() && IsBufferSource(record.data())) { WTF::Vector<uint8_t> bytes; if (!GetBytesOfBufferSource(record.data(), &bytes, exception_state)) { @@ -326,6 +460,7 @@ device::mojom::blink::NDEFRecordTypeCategory::kExternal, record_type, id, payload_message); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) exception_state.ThrowTypeError( "The data for external type NDEFRecord must be a BufferSource or an " @@ -340,6 +475,35 @@ const String& record_type = record.recordType(); // https://w3c.github.io/web-nfc/#dfn-map-local-type-to-ndef +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (record.hasData()) { + switch (record.data()->GetContentType()) { + case V8NDEFMessageSource::ContentType::kArrayBuffer: + case V8NDEFMessageSource::ContentType::kArrayBufferView: { + Vector<uint8_t> bytes; + if (!GetBytesOfBufferSource(record.data(), &bytes, exception_state)) { + return nullptr; + } + return MakeGarbageCollected<NDEFRecord>( + device::mojom::blink::NDEFRecordTypeCategory::kLocal, record_type, + id, bytes); + } + case V8NDEFMessageSource::ContentType::kNDEFMessageInit: { + NDEFMessage* payload_message = NDEFMessage::Create( + execution_context, record.data()->GetAsNDEFMessageInit(), + exception_state, /*is_embedded=*/true); + if (exception_state.HadException()) + return nullptr; + DCHECK(payload_message); + return MakeGarbageCollected<NDEFRecord>( + device::mojom::blink::NDEFRecordTypeCategory::kLocal, record_type, + id, payload_message); + } + case V8NDEFMessageSource::ContentType::kString: + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (record.hasData() && IsBufferSource(record.data())) { WTF::Vector<uint8_t> bytes; if (!GetBytesOfBufferSource(record.data(), &bytes, exception_state)) { @@ -359,6 +523,7 @@ device::mojom::blink::NDEFRecordTypeCategory::kLocal, record_type, id, payload_message); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) exception_state.ThrowTypeError( "The data for local type NDEFRecord must be a BufferSource or an "
diff --git a/third_party/blink/renderer/modules/notifications/notification_data_test.cc b/third_party/blink/renderer/modules/notifications/notification_data_test.cc index 319c4d0..6c31aff 100644 --- a/third_party/blink/renderer/modules/notifications/notification_data_test.cc +++ b/third_party/blink/renderer/modules/notifications/notification_data_test.cc
@@ -57,8 +57,14 @@ for (size_t i = 0; i < base::size(kNotificationVibration); ++i) vibration_pattern.push_back(kNotificationVibration[i]); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* vibration_sequence = + MakeGarbageCollected<V8UnionUnsignedLongOrUnsignedLongSequence>( + vibration_pattern); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnsignedLongOrUnsignedLongSequence vibration_sequence; vibration_sequence.SetUnsignedLongSequence(vibration_pattern); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) HeapVector<Member<NotificationAction>> actions; for (size_t i = 0; i < Notification::maxActions(); ++i) { @@ -144,8 +150,14 @@ for (size_t i = 0; i < base::size(kNotificationVibration); ++i) vibration_pattern.push_back(kNotificationVibration[i]); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* vibration_sequence = + MakeGarbageCollected<V8UnionUnsignedLongOrUnsignedLongSequence>( + std::move(vibration_pattern)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnsignedLongOrUnsignedLongSequence vibration_sequence; vibration_sequence.SetUnsignedLongSequence(vibration_pattern); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) NotificationOptions* options = NotificationOptions::Create(scope.GetIsolate()); @@ -243,8 +255,14 @@ for (size_t i = 0; i < base::size(kNotificationVibrationUnnormalized); ++i) unnormalized_pattern.push_back(kNotificationVibrationUnnormalized[i]); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* vibration_sequence = + MakeGarbageCollected<V8UnionUnsignedLongOrUnsignedLongSequence>( + unnormalized_pattern); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) UnsignedLongOrUnsignedLongSequence vibration_sequence; vibration_sequence.SetUnsignedLongSequence(unnormalized_pattern); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) NotificationOptions* options = NotificationOptions::Create(scope.GetIsolate());
diff --git a/third_party/blink/renderer/modules/payments/payment_event_data_conversion.cc b/third_party/blink/renderer/modules/payments/payment_event_data_conversion.cc index a7c77c06..6f9966d 100644 --- a/third_party/blink/renderer/modules/payments/payment_event_data_conversion.cc +++ b/third_party/blink/renderer/modules/payments/payment_event_data_conversion.cc
@@ -64,8 +64,10 @@ DCHECK(data); PaymentMethodData* method_data = PaymentMethodData::Create(); method_data->setSupportedMethod(data->supported_method); - method_data->setData( - StringDataToScriptValue(script_state, data->stringified_data)); + ScriptValue v8_data = + StringDataToScriptValue(script_state, data->stringified_data); + if (!v8_data.IsEmpty()) + method_data->setData(std::move(v8_data)); return method_data; }
diff --git a/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc b/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc index e0789ff..d0e9109 100644 --- a/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc +++ b/third_party/blink/renderer/modules/payments/payment_request_for_invalid_origin_or_ssl_test.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/modules/payments/payment_request.h" #include "third_party/blink/renderer/modules/payments/payment_test_helper.h" #include "third_party/blink/renderer/platform/bindings/exception_code.h" +#include "third_party/blink/renderer/platform/bindings/v8_binding.h" #include "third_party/blink/renderer/platform/heap/heap_allocator.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support.h" #include "third_party/googletest/src/googletest/include/gtest/gtest.h"
diff --git a/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc b/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc index 8056093..e6385cc 100644 --- a/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc +++ b/third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.cc
@@ -4,15 +4,32 @@ #include "third_party/blink/renderer/modules/payments/secure_payment_confirmation_type_converter.h" -#include <stdint.h> +#include <cstdint> #include "base/time/time.h" #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h" #include "third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h" #include "third_party/blink/renderer/platform/wtf/vector.h" namespace mojo { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +template <> +struct TypeConverter<Vector<Vector<uint8_t>>, + blink::HeapVector<blink::Member< + blink::V8UnionArrayBufferOrArrayBufferView>>> { + static Vector<Vector<uint8_t>> Convert( + const blink::HeapVector< + blink::Member<blink::V8UnionArrayBufferOrArrayBufferView>>& input) { + Vector<Vector<uint8_t>> result; + for (const auto& item : input) { + result.push_back(mojo::ConvertTo<Vector<uint8_t>>(item.Get())); + } + return result; + } +}; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) template <> struct TypeConverter<Vector<Vector<uint8_t>>, blink::HeapVector<blink::ArrayBufferOrArrayBufferView>> { @@ -25,6 +42,7 @@ return result; } }; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) payments::mojom::blink::SecurePaymentConfirmationRequestPtr TypeConverter<payments::mojom::blink::SecurePaymentConfirmationRequestPtr,
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc index dcf512a..4dbcf221 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/web/web_local_frame.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_string_stringsequence.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_gather_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_parameters.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_ice_server.h" @@ -224,11 +225,22 @@ // Prefer standardized 'urls' field over deprecated 'url' field. Vector<String> url_strings; if (ice_server->hasUrls()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (ice_server->urls()->GetContentType()) { + case V8UnionStringOrStringSequence::ContentType::kString: + url_strings.push_back(ice_server->urls()->GetAsString()); + break; + case V8UnionStringOrStringSequence::ContentType::kStringSequence: + url_strings = ice_server->urls()->GetAsStringSequence(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (ice_server->urls().IsString()) { url_strings.push_back(ice_server->urls().GetAsString()); } else if (ice_server->urls().IsStringSequence()) { url_strings = ice_server->urls().GetAsStringSequence(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } else if (ice_server->hasUrl()) { url_strings.push_back(ice_server->url()); }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc index f926807..3ee49525 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -46,6 +46,7 @@ #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_crypto_algorithm_params.h" #include "third_party/blink/public/web/web_local_frame.h" +#include "third_party/blink/renderer/bindings/core/v8/dictionary.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_object_string.h" @@ -75,6 +76,7 @@ #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/modules/crypto/crypto_result_impl.h" #include "third_party/blink/renderer/modules/mediastream/media_constraints_impl.h" +#include "third_party/blink/renderer/modules/mediastream/media_error_state.h" #include "third_party/blink/renderer/modules/mediastream/media_stream.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_event.h" #include "third_party/blink/renderer/modules/mediastream/user_media_controller.h" @@ -386,6 +388,16 @@ Vector<String> url_strings; if (ice_server->hasUrls()) { UseCounter::Count(context, WebFeature::kRTCIceServerURLs); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (ice_server->urls()->GetContentType()) { + case V8UnionStringOrStringSequence::ContentType::kString: + url_strings.push_back(ice_server->urls()->GetAsString()); + break; + case V8UnionStringOrStringSequence::ContentType::kStringSequence: + url_strings = ice_server->urls()->GetAsStringSequence(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const StringOrStringSequence& urls = ice_server->urls(); if (urls.IsString()) { url_strings.push_back(urls.GetAsString()); @@ -393,6 +405,7 @@ DCHECK(urls.IsStringSequence()); url_strings = urls.GetAsStringSequence(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } else if (ice_server->hasUrl()) { UseCounter::Count(context, WebFeature::kRTCIceServerURL); url_strings.push_back(ice_server->url()); @@ -1723,13 +1736,18 @@ for (const auto& webrtc_server : webrtc_configuration.servers) { auto* ice_server = RTCIceServer::Create(); - StringOrStringSequence urls; Vector<String> url_vector; url_vector.ReserveCapacity(SafeCast<wtf_size_t>(webrtc_server.urls.size())); for (const auto& url : webrtc_server.urls) { url_vector.emplace_back(url.c_str()); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* urls = MakeGarbageCollected<V8UnionStringOrStringSequence>( + std::move(url_vector)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + StringOrStringSequence urls; urls.SetStringSequence(std::move(url_vector)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ice_server->setUrls(urls); ice_server->setUsername(webrtc_server.username.c_str());
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_session_description_request_impl.cc b/third_party/blink/renderer/modules/peerconnection/rtc_session_description_request_impl.cc index 27e6fe4..61e8331f 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_session_description_request_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_session_description_request_impl.cc
@@ -31,11 +31,11 @@ #include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_request_impl.h" #include "base/memory/scoped_refptr.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_rtc_session_description_init.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_error_util.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_session_description.h" -#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_init.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_platform.h" namespace blink { @@ -74,7 +74,8 @@ requester_->NoteSessionDescriptionRequestCompleted(operation_, true); RTCSessionDescriptionInit* description = RTCSessionDescriptionInit::Create(); - description->setType(description_platform->GetType()); + if (description_platform->GetType()) + description->setType(description_platform->GetType()); description->setSdp(description_platform->Sdp()); requester_->NoteSdpCreated(
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc index b70f18f43b..b17df80 100644 --- a/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc
@@ -148,7 +148,8 @@ /*opener=*/nullptr, mojo::NullAssociatedReceiver(), *agent_group_scheduler_, - /*session_storage_namespace_id=*/base::EmptyString())), + /*session_storage_namespace_id=*/base::EmptyString(), + /*page_base_background_color=*/absl::nullopt)), web_local_frame_( blink::WebLocalFrame::CreateMainFrame(web_view_, &web_local_frame_client_,
diff --git a/third_party/blink/renderer/modules/push_messaging/push_event.cc b/third_party/blink/renderer/modules/push_messaging/push_event.cc index b75aaedc..279aed97 100644 --- a/third_party/blink/renderer/modules/push_messaging/push_event.cc +++ b/third_party/blink/renderer/modules/push_messaging/push_event.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_push_event_init.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink { @@ -20,6 +21,21 @@ ExceptionState& exception_state) : ExtendableEvent(type, initializer) { if (initializer->hasData()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto* message_data = initializer->data(); + if (message_data->IsArrayBuffer() || message_data->IsArrayBufferView()) { + DOMArrayPiece array_piece = + message_data->IsArrayBuffer() + ? DOMArrayPiece(message_data->GetAsArrayBuffer()) + : DOMArrayPiece(message_data->GetAsArrayBufferView().Get()); + if (!base::CheckedNumeric<uint32_t>(array_piece.ByteLength()).IsValid()) { + exception_state.ThrowRangeError( + "The provided ArrayBuffer exceeds the maximum supported size " + "(4294967295)"); + return; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const ArrayBufferOrArrayBufferViewOrUSVString& message_data = initializer->data(); if (message_data.IsArrayBuffer() || message_data.IsArrayBufferView()) { @@ -34,6 +50,7 @@ return; } } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) data_ = PushMessageData::Create(initializer->data()); } }
diff --git a/third_party/blink/renderer/modules/push_messaging/push_manager_test.cc b/third_party/blink/renderer/modules/push_messaging/push_manager_test.cc index 425d3ad2..3741369 100644 --- a/third_party/blink/renderer/modules/push_messaging/push_manager_test.cc +++ b/third_party/blink/renderer/modules/push_messaging/push_manager_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_push_subscription_options_init.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/modules/push_messaging/push_subscription_options.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/wtf/text/base64.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -48,10 +49,17 @@ TEST(PushManagerTest, ValidSenderKey) { PushSubscriptionOptionsInit* options = PushSubscriptionOptionsInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setApplicationServerKey( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrString>( + DOMArrayBuffer::Create(kApplicationServerKey, + kApplicationServerKeyLength))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setApplicationServerKey( ArrayBufferOrArrayBufferViewOrString::FromArrayBuffer( DOMArrayBuffer::Create(kApplicationServerKey, kApplicationServerKeyLength))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; PushSubscriptionOptions* output = @@ -74,8 +82,14 @@ WTF::Base64URLEncode(reinterpret_cast<const char*>(kApplicationServerKey), kApplicationServerKeyLength); base64_url = base64_url.RemoveCharacters(RemovePad); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setApplicationServerKey( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrString>( + base64_url)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setApplicationServerKey( ArrayBufferOrArrayBufferViewOrString::FromString(base64_url)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; PushSubscriptionOptions* output = @@ -89,9 +103,15 @@ uint8_t sender_key[kMaxKeyLength + 1]; memset(sender_key, 0, sizeof(sender_key)); PushSubscriptionOptionsInit* options = PushSubscriptionOptionsInit::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setApplicationServerKey( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrString>( + DOMArrayBuffer::Create(sender_key, kMaxKeyLength + 1))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setApplicationServerKey( ArrayBufferOrArrayBufferViewOrString::FromArrayBuffer( DOMArrayBuffer::Create(sender_key, kMaxKeyLength + 1))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; PushSubscriptionOptions* output = @@ -105,9 +125,15 @@ TEST(PushManagerTest, InvalidBase64SenderKey) { PushSubscriptionOptionsInit* options = MakeGarbageCollected<PushSubscriptionOptionsInit>(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setApplicationServerKey( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrString>( + Base64Encode(kApplicationServerKey))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setApplicationServerKey( ArrayBufferOrArrayBufferViewOrString::FromString( Base64Encode(kApplicationServerKey))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; PushSubscriptionOptions* output = @@ -122,10 +148,18 @@ TEST(PushManagerTest, InvalidBase64URLWithPaddingSenderKey) { PushSubscriptionOptionsInit* options = MakeGarbageCollected<PushSubscriptionOptionsInit>(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options->setApplicationServerKey( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrString>( + WTF::Base64URLEncode( + reinterpret_cast<const char*>(kApplicationServerKey), + kApplicationServerKeyLength))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) options->setApplicationServerKey( ArrayBufferOrArrayBufferViewOrString::FromString(WTF::Base64URLEncode( reinterpret_cast<const char*>(kApplicationServerKey), kApplicationServerKeyLength))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DummyExceptionStateForTesting exception_state; PushSubscriptionOptions* output =
diff --git a/third_party/blink/renderer/modules/push_messaging/push_message_data.cc b/third_party/blink/renderer/modules/push_messaging/push_message_data.cc index 24c865b..24d725d3 100644 --- a/third_party/blink/renderer/modules/push_messaging/push_message_data.cc +++ b/third_party/blink/renderer/modules/push_messaging/push_message_data.cc
@@ -7,6 +7,7 @@ #include <memory> #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview_usvstring.h" #include "third_party/blink/renderer/bindings/modules/v8/array_buffer_or_array_buffer_view_or_usv_string.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" @@ -26,10 +27,50 @@ // be set in the PushEvent. if (message_string.IsNull()) return nullptr; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + return PushMessageData::Create( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrUSVString>( + message_string)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return PushMessageData::Create( ArrayBufferOrArrayBufferViewOrUSVString::FromUSVString(message_string)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +PushMessageData* PushMessageData::Create( + const V8UnionArrayBufferOrArrayBufferViewOrUSVString* message_data) { + if (!message_data) + return nullptr; + switch (message_data->GetContentType()) { + case V8UnionArrayBufferOrArrayBufferViewOrUSVString::ContentType:: + kArrayBuffer: { + DOMArrayBuffer* buffer = message_data->GetAsArrayBuffer(); + return MakeGarbageCollected<PushMessageData>( + static_cast<const char*>(buffer->Data()), + base::checked_cast<wtf_size_t>(buffer->ByteLength())); + } + case V8UnionArrayBufferOrArrayBufferViewOrUSVString::ContentType:: + kArrayBufferView: { + DOMArrayBufferView* buffer_view = + message_data->GetAsArrayBufferView().Get(); + return MakeGarbageCollected<PushMessageData>( + static_cast<const char*>(buffer_view->BaseAddress()), + base::checked_cast<wtf_size_t>(buffer_view->byteLength())); + } + case V8UnionArrayBufferOrArrayBufferViewOrUSVString::ContentType:: + kUSVString: { + std::string encoded_string = UTF8Encoding().Encode( + message_data->GetAsUSVString(), WTF::kNoUnencodables); + return MakeGarbageCollected<PushMessageData>( + encoded_string.c_str(), + static_cast<unsigned>(encoded_string.length())); + } + } + NOTREACHED(); + return nullptr; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) PushMessageData* PushMessageData::Create( const ArrayBufferOrArrayBufferViewOrUSVString& message_data) { if (message_data.IsArrayBuffer()) { @@ -56,6 +97,7 @@ DCHECK(message_data.IsNull()); return nullptr; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) PushMessageData::PushMessageData(const char* data, unsigned bytes_size) { data_.Append(data, bytes_size);
diff --git a/third_party/blink/renderer/modules/push_messaging/push_message_data.h b/third_party/blink/renderer/modules/push_messaging/push_message_data.h index 1185601..65fceb2 100644 --- a/third_party/blink/renderer/modules/push_messaging/push_message_data.h +++ b/third_party/blink/renderer/modules/push_messaging/push_message_data.h
@@ -19,14 +19,20 @@ class DOMArrayBuffer; class ExceptionState; class ScriptState; +class V8UnionArrayBufferOrArrayBufferViewOrUSVString; class MODULES_EXPORT PushMessageData final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); public: static PushMessageData* Create(const String& data); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + static PushMessageData* Create( + const V8UnionArrayBufferOrArrayBufferViewOrUSVString* data); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) static PushMessageData* Create( const ArrayBufferOrArrayBufferViewOrUSVString& data); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) PushMessageData(const char* data, unsigned bytes_size); ~PushMessageData() override;
diff --git a/third_party/blink/renderer/modules/push_messaging/push_subscription_options.cc b/third_party/blink/renderer/modules/push_messaging/push_subscription_options.cc index 7511965..2ddf1c3 100644 --- a/third_party/blink/renderer/modules/push_messaging/push_subscription_options.cc +++ b/third_party/blink/renderer/modules/push_messaging/push_subscription_options.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/modules/push_messaging/push_subscription_options.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" #include "third_party/blink/renderer/bindings/modules/v8/array_buffer_or_array_buffer_view_or_string.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_push_subscription_options_init.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" @@ -19,7 +20,11 @@ const int kMaxApplicationServerKeyLength = 255; Vector<uint8_t> BufferSourceToVector( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const V8UnionBufferSourceOrString* application_server_key, +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const ArrayBufferOrArrayBufferViewOrString& application_server_key, +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ExceptionState& exception_state) { char* input; size_t length; @@ -27,6 +32,32 @@ Vector<uint8_t> result; // Convert the input array into a string of bytes. +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (application_server_key->GetContentType()) { + case V8UnionBufferSourceOrString::ContentType::kArrayBuffer: + input = static_cast<char*>( + application_server_key->GetAsArrayBuffer()->Data()); + length = application_server_key->GetAsArrayBuffer()->ByteLength(); + break; + case V8UnionBufferSourceOrString::ContentType::kArrayBufferView: + input = static_cast<char*>( + application_server_key->GetAsArrayBufferView()->BaseAddress()); + length = application_server_key->GetAsArrayBufferView()->byteLength(); + break; + case V8UnionBufferSourceOrString::ContentType::kString: + if (!Base64UnpaddedURLDecode(application_server_key->GetAsString(), + decoded_application_server_key)) { + exception_state.ThrowDOMException( + DOMExceptionCode::kInvalidCharacterError, + "The provided applicationServerKey is not encoded as base64url " + "without padding."); + return result; + } + input = reinterpret_cast<char*>(decoded_application_server_key.data()); + length = decoded_application_server_key.size(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (application_server_key.IsArrayBuffer()) { input = static_cast<char*>(application_server_key.GetAsArrayBuffer()->Data()); @@ -50,6 +81,7 @@ NOTREACHED(); return result; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // Check the validity of the sender info. It must either be a 65-byte // uncompressed VAPID key, which has the byte 0x04 as the first byte or a @@ -82,7 +114,12 @@ // has a default value, but we check |hasApplicationServerKey()| here for // backward compatibility. if (options_init->hasApplicationServerKey() && - !options_init->applicationServerKey().IsNull()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + options_init->applicationServerKey() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + !options_init->applicationServerKey().IsNull() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { application_server_key.AppendVector(BufferSourceToVector( options_init->applicationServerKey(), exception_state)); }
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config_impl.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config_impl.cc index dd433b7..e9b186e 100644 --- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config_impl.cc +++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config_impl.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/modules/sanitizer_api/sanitizer_config_impl.h" -#include "third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_sanitizer_config.h" #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h" #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
diff --git a/third_party/blink/renderer/modules/scheduler/dom_scheduler.cc b/third_party/blink/renderer/modules/scheduler/dom_scheduler.cc index 767862b..e6d71ee17 100644 --- a/third_party/blink/renderer/modules/scheduler/dom_scheduler.cc +++ b/third_party/blink/renderer/modules/scheduler/dom_scheduler.cc
@@ -65,7 +65,7 @@ "Current window is detached"); return ScriptPromise(); } - if (options->signal() && options->signal()->aborted()) { + if (options->hasSignal() && options->signal()->aborted()) { exception_state.ThrowDOMException(DOMExceptionCode::kAbortError, "The task was aborted"); return ScriptPromise(); @@ -73,7 +73,8 @@ // Always honor the priority and the task signal if given. DOMTaskSignal* task_signal = nullptr; - if (!options->hasPriority() && IsA<DOMTaskSignal>(options->signal())) { + if (!options->hasPriority() && options->hasSignal() && + IsA<DOMTaskSignal>(options->signal())) { // If only a signal is given, and it is a TaskSignal rather than an // basic AbortSignal, use it. task_signal = To<DOMTaskSignal>(options->signal()); @@ -95,7 +96,7 @@ IDLEnumAsString(options->priority()))) : kDefaultPriority; task_signal = CreateTaskSignalFor(priority); - if (options->signal()) + if (options->hasSignal()) task_signal->Follow(options->signal()); }
diff --git a/third_party/blink/renderer/modules/scheduler/dom_task_signal.cc b/third_party/blink/renderer/modules/scheduler/dom_task_signal.cc index 0c24499..7a17f27d 100644 --- a/third_party/blink/renderer/modules/scheduler/dom_task_signal.cc +++ b/third_party/blink/renderer/modules/scheduler/dom_task_signal.cc
@@ -7,10 +7,10 @@ #include <utility> #include "base/callback.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_task_priority_change_event_init.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/scheduler/task_priority_change_event.h" -#include "third_party/blink/renderer/modules/scheduler/task_priority_change_event_init.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/scheduler/task_priority_change_event.cc b/third_party/blink/renderer/modules/scheduler/task_priority_change_event.cc index b08d8cf..840a9b7 100644 --- a/third_party/blink/renderer/modules/scheduler/task_priority_change_event.cc +++ b/third_party/blink/renderer/modules/scheduler/task_priority_change_event.cc
@@ -28,8 +28,14 @@ return event_interface_names::kTaskPriorityChangeEvent; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +V8TaskPriority TaskPriorityChangeEvent::previousPriority() const { + return previous_priority_; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AtomicString TaskPriorityChangeEvent::previousPriority() const { return previous_priority_; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } // namespace blink
diff --git a/third_party/blink/renderer/modules/scheduler/task_priority_change_event.h b/third_party/blink/renderer/modules/scheduler/task_priority_change_event.h index c4d99fb..ff8ce27 100644 --- a/third_party/blink/renderer/modules/scheduler/task_priority_change_event.h +++ b/third_party/blink/renderer/modules/scheduler/task_priority_change_event.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_MODULES_SCHEDULER_TASK_PRIORITY_CHANGE_EVENT_H_ #include "base/macros.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_task_priority.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/modules/event_modules.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" @@ -27,10 +28,18 @@ const AtomicString& InterfaceName() const override; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + V8TaskPriority previousPriority() const; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AtomicString previousPriority() const; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) private: +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const V8TaskPriority previous_priority_; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const AtomicString previous_priority_; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DISALLOW_COPY_AND_ASSIGN(TaskPriorityChangeEvent); };
diff --git a/third_party/blink/renderer/modules/serial/serial_port.cc b/third_party/blink/renderer/modules/serial/serial_port.cc index 681820a..135e1da 100644 --- a/third_party/blink/renderer/modules/serial/serial_port.cc +++ b/third_party/blink/renderer/modules/serial/serial_port.cc
@@ -19,6 +19,7 @@ #include "third_party/blink/renderer/modules/serial/serial.h" #include "third_party/blink/renderer/modules/serial/serial_port_underlying_sink.h" #include "third_party/blink/renderer/modules/serial/serial_port_underlying_source.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/service_worker/extendable_message_event.cc b/third_party/blink/renderer/modules/service_worker/extendable_message_event.cc index 1d870b15..ff3e642 100644 --- a/third_party/blink/renderer/modules/service_worker/extendable_message_event.cc +++ b/third_party/blink/renderer/modules/service_worker/extendable_message_event.cc
@@ -135,6 +135,22 @@ origin_ = initializer->origin(); if (initializer->hasLastEventId()) last_event_id_ = initializer->lastEventId(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (initializer->hasSource() and initializer->source()) { + switch (initializer->source()->GetContentType()) { + case V8UnionClientOrMessagePortOrServiceWorker::ContentType::kClient: + source_as_client_ = initializer->source()->GetAsClient(); + break; + case V8UnionClientOrMessagePortOrServiceWorker::ContentType::kMessagePort: + source_as_message_port_ = initializer->source()->GetAsMessagePort(); + break; + case V8UnionClientOrMessagePortOrServiceWorker::ContentType:: + kServiceWorker: + source_as_service_worker_ = initializer->source()->GetAsServiceWorker(); + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (initializer->hasSource()) { if (initializer->source().IsClient()) source_as_client_ = initializer->source().GetAsClient(); @@ -143,6 +159,7 @@ else if (initializer->source().IsMessagePort()) source_as_message_port_ = initializer->source().GetAsMessagePort(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (initializer->hasPorts()) ports_ = MakeGarbageCollected<MessagePortArray>(initializer->ports()); }
diff --git a/third_party/blink/renderer/modules/url_pattern/url_pattern.cc b/third_party/blink/renderer/modules/url_pattern/url_pattern.cc index 4f568168..c07541f 100644 --- a/third_party/blink/renderer/modules/url_pattern/url_pattern.cc +++ b/third_party/blink/renderer/modules/url_pattern/url_pattern.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_regexp.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_urlpatterninit_usvstring.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_url_pattern_component_result.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_url_pattern_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_url_pattern_result.h" #include "third_party/blink/renderer/modules/url_pattern/url_pattern_canon.h" #include "third_party/blink/renderer/modules/url_pattern/url_pattern_component.h" @@ -417,69 +418,85 @@ String search(g_empty_string); String hash(g_empty_string); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + HeapVector<Member<V8URLPatternInput>> inputs; +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) HeapVector<USVStringOrURLPatternInit> inputs; +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) - if (input->GetContentType() == - V8URLPatternInput::ContentType::kURLPatternInit) { - if (base_url) { - exception_state.ThrowTypeError( - "Invalid second argument baseURL '" + base_url + - "' provided with a URLPatternInit input. Use the " - "URLPatternInit.baseURL property instead."); - return false; + switch (input->GetContentType()) { + case V8URLPatternInput::ContentType::kURLPatternInit: { + if (base_url) { + exception_state.ThrowTypeError( + "Invalid second argument baseURL '" + base_url + + "' provided with a URLPatternInit input. Use the " + "URLPatternInit.baseURL property instead."); + return false; + } + + URLPatternInit* init = input->GetAsURLPatternInit(); + +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + inputs.push_back(MakeGarbageCollected<V8URLPatternInput>(init)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + inputs.push_back(USVStringOrURLPatternInit::FromURLPatternInit(init)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + + // Layer the URLPatternInit values on top of the default empty strings. + ApplyInit(init, ValueType::kURL, protocol, username, password, hostname, + port, pathname, search, hash, exception_state); + if (exception_state.HadException()) { + // Treat exceptions simply as a failure to match. + exception_state.ClearException(); + return false; + } + break; } + case V8URLPatternInput::ContentType::kUSVString: { + KURL parsed_base_url(base_url); + if (base_url && !parsed_base_url.IsValid()) { + // Treat as failure to match, but don't throw an exception. + return false; + } - URLPatternInit* init = - input->GetAsURLPatternInit(); + const String& input_string = input->GetAsUSVString(); - inputs.push_back(USVStringOrURLPatternInit::FromURLPatternInit(init)); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + inputs.push_back(MakeGarbageCollected<V8URLPatternInput>(input_string)); + if (base_url) + inputs.push_back(MakeGarbageCollected<V8URLPatternInput>(base_url)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + inputs.push_back(USVStringOrURLPatternInit::FromUSVString(input_string)); + if (base_url) + inputs.push_back(USVStringOrURLPatternInit::FromUSVString(base_url)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) - // Layer the URLPatternInit values on top of the default empty strings. - ApplyInit(init, ValueType::kURL, protocol, username, password, hostname, - port, pathname, search, hash, exception_state); - if (exception_state.HadException()) { - // Treat exceptions simply as a failure to match. - exception_state.ClearException(); - return false; + // The compile the input string as a fully resolved URL. + KURL url(parsed_base_url, input_string); + if (!url.IsValid() || url.IsEmpty()) { + // Treat as failure to match, but don't throw an exception. + return false; + } + + // Apply the parsed URL components on top of our defaults. + if (url.Protocol()) + protocol = url.Protocol(); + if (url.User()) + username = url.User(); + if (url.Pass()) + password = url.Pass(); + if (url.Host()) + hostname = url.Host(); + if (url.Port() > 0) + port = String::Number(url.Port()); + if (url.GetPath()) + pathname = url.GetPath(); + if (url.Query()) + search = url.Query(); + if (url.FragmentIdentifier()) + hash = url.FragmentIdentifier(); + break; } - } else { - KURL parsed_base_url(base_url); - if (base_url && !parsed_base_url.IsValid()) { - // Treat as failure to match, but don't throw an exception. - return false; - } - - const String& input_string = - input->GetAsUSVString(); - - inputs.push_back(USVStringOrURLPatternInit::FromUSVString(input_string)); - if (base_url) - inputs.push_back(USVStringOrURLPatternInit::FromUSVString(base_url)); - - // The compile the input string as a fully resolved URL. - KURL url(parsed_base_url, input_string); - if (!url.IsValid() || url.IsEmpty()) { - // Treat as failure to match, but don't throw an exception. - return false; - } - - // Apply the parsed URL components on top of our defaults. - if (url.Protocol()) - protocol = url.Protocol(); - if (url.User()) - username = url.User(); - if (url.Pass()) - password = url.Pass(); - if (url.Host()) - hostname = url.Host(); - if (url.Port() > 0) - port = String::Number(url.Port()); - if (url.GetPath()) - pathname = url.GetPath(); - if (url.Query()) - search = url.Query(); - if (url.FragmentIdentifier()) - hash = url.FragmentIdentifier(); } Vector<String> protocol_group_list;
diff --git a/third_party/blink/renderer/modules/url_pattern/url_pattern.idl b/third_party/blink/renderer/modules/url_pattern/url_pattern.idl index 672fb5d..56a1cb0 100644 --- a/third_party/blink/renderer/modules/url_pattern/url_pattern.idl +++ b/third_party/blink/renderer/modules/url_pattern/url_pattern.idl
@@ -16,7 +16,7 @@ boolean test(URLPatternInput input, optional USVString baseURL); [RaisesException] - URLPatternResult exec(URLPatternInput input, optional USVString baseURL); + URLPatternResult? exec(URLPatternInput input, optional USVString baseURL); readonly attribute USVString protocol; readonly attribute USVString username;
diff --git a/third_party/blink/renderer/modules/url_pattern/url_pattern_parser.cc b/third_party/blink/renderer/modules/url_pattern/url_pattern_parser.cc index fc558682..81cd416 100644 --- a/third_party/blink/renderer/modules/url_pattern/url_pattern_parser.cc +++ b/third_party/blink/renderer/modules/url_pattern/url_pattern_parser.cc
@@ -5,8 +5,8 @@ #include "third_party/blink/renderer/modules/url_pattern/url_pattern_parser.h" #include "base/notreached.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_url_pattern_init.h" #include "third_party/blink/renderer/modules/url_pattern/url_pattern_component.h" -#include "third_party/blink/renderer/modules/url_pattern/url_pattern_init.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h" #include "third_party/liburlpattern/tokenize.h"
diff --git a/third_party/blink/renderer/modules/vibration/vibration_controller.cc b/third_party/blink/renderer/modules/vibration/vibration_controller.cc index 463b1d4..ceb91f5 100644 --- a/third_party/blink/renderer/modules/vibration/vibration_controller.cc +++ b/third_party/blink/renderer/modules/vibration/vibration_controller.cc
@@ -23,6 +23,7 @@ #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_union_unsignedlong_unsignedlongsequence.h" #include "third_party/blink/renderer/bindings/modules/v8/unsigned_long_or_unsigned_long_sequence.h" #include "third_party/blink/renderer/core/frame/intervention.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -102,6 +103,26 @@ } // static +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +VibrationController::VibrationPattern +VibrationController::SanitizeVibrationPattern( + const V8UnionUnsignedLongOrUnsignedLongSequence* input) { + switch (input->GetContentType()) { + case V8UnionUnsignedLongOrUnsignedLongSequence::ContentType:: + kUnsignedLong: { + VibrationPattern pattern; + pattern.push_back(input->GetAsUnsignedLong()); + return sanitizeVibrationPatternInternal(pattern); + } + case V8UnionUnsignedLongOrUnsignedLongSequence::ContentType:: + kUnsignedLongSequence: + return sanitizeVibrationPatternInternal( + input->GetAsUnsignedLongSequence()); + } + NOTREACHED(); + return {}; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) VibrationController::VibrationPattern VibrationController::SanitizeVibrationPattern( const UnsignedLongOrUnsignedLongSequence& input) { @@ -114,6 +135,7 @@ return sanitizeVibrationPatternInternal(pattern); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // static VibrationController& VibrationController::From(Navigator& navigator) {
diff --git a/third_party/blink/renderer/modules/vibration/vibration_controller.h b/third_party/blink/renderer/modules/vibration/vibration_controller.h index 2e1fbf8c..8da6318 100644 --- a/third_party/blink/renderer/modules/vibration/vibration_controller.h +++ b/third_party/blink/renderer/modules/vibration/vibration_controller.h
@@ -36,6 +36,7 @@ class Navigator; class UnsignedLongOrUnsignedLongSequence; +class V8UnionUnsignedLongOrUnsignedLongSequence; class MODULES_EXPORT VibrationController final : public GarbageCollected<VibrationController>, @@ -54,8 +55,13 @@ explicit VibrationController(Navigator&); ~VibrationController() override; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + static VibrationPattern SanitizeVibrationPattern( + const V8UnionUnsignedLongOrUnsignedLongSequence* input); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) static VibrationPattern SanitizeVibrationPattern( const UnsignedLongOrUnsignedLongSequence&); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) void DoVibrate(TimerBase*); void DidVibrate();
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc index 7466cefb..689adb4 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_context.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -103,6 +103,26 @@ WebFeature::kAudioContextCrossOriginIframe); WebAudioLatencyHint latency_hint(WebAudioLatencyHint::kCategoryInteractive); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (context_options->latencyHint()->GetContentType()) { + case V8UnionAudioContextLatencyCategoryOrDouble::ContentType:: + kAudioContextLatencyCategory: + latency_hint = + WebAudioLatencyHint(context_options->latencyHint() + ->GetAsAudioContextLatencyCategory() + .AsString()); + break; + case V8UnionAudioContextLatencyCategoryOrDouble::ContentType::kDouble: + // This should be the requested output latency in seconds, without taking + // into account double buffering (same as baseLatency). + latency_hint = + WebAudioLatencyHint(context_options->latencyHint()->GetAsDouble()); + + base::UmaHistogramTimes( + "WebAudio.AudioContext.latencyHintMilliSeconds", + base::TimeDelta::FromSecondsD(latency_hint.Seconds())); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (context_options->latencyHint().IsAudioContextLatencyCategory()) { latency_hint = WebAudioLatencyHint( context_options->latencyHint().GetAsAudioContextLatencyCategory()); @@ -116,6 +136,7 @@ "WebAudio.AudioContext.latencyHintMilliSeconds", base::TimeDelta::FromSecondsD(latency_hint.Seconds())); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) base::UmaHistogramEnumeration( "WebAudio.AudioContext.latencyHintCategory", latency_hint.Category(),
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context_test.cc b/third_party/blink/renderer/modules/webaudio/audio_context_test.cc index b7e88eb..ceae7d3 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_context_test.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_context_test.cc
@@ -114,33 +114,60 @@ TEST_F(AudioContextTest, AudioContextOptions_WebAudioLatencyHint) { AudioContextOptions* interactive_options = AudioContextOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + interactive_options->setLatencyHint( + MakeGarbageCollected<V8UnionAudioContextLatencyCategoryOrDouble>( + V8AudioContextLatencyCategory( + V8AudioContextLatencyCategory::Enum::kInteractive))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) interactive_options->setLatencyHint( AudioContextLatencyCategoryOrDouble::FromAudioContextLatencyCategory( "interactive")); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AudioContext* interactive_context = AudioContext::Create( GetDocument(), interactive_options, ASSERT_NO_EXCEPTION); AudioContextOptions* balanced_options = AudioContextOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + balanced_options->setLatencyHint( + MakeGarbageCollected<V8UnionAudioContextLatencyCategoryOrDouble>( + V8AudioContextLatencyCategory( + V8AudioContextLatencyCategory::Enum::kBalanced))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) balanced_options->setLatencyHint( AudioContextLatencyCategoryOrDouble::FromAudioContextLatencyCategory( "balanced")); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AudioContext* balanced_context = AudioContext::Create( GetDocument(), balanced_options, ASSERT_NO_EXCEPTION); EXPECT_GT(balanced_context->baseLatency(), interactive_context->baseLatency()); AudioContextOptions* playback_options = AudioContextOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + playback_options->setLatencyHint( + MakeGarbageCollected<V8UnionAudioContextLatencyCategoryOrDouble>( + V8AudioContextLatencyCategory( + V8AudioContextLatencyCategory::Enum::kPlayback))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) playback_options->setLatencyHint( AudioContextLatencyCategoryOrDouble::FromAudioContextLatencyCategory( "playback")); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AudioContext* playback_context = AudioContext::Create( GetDocument(), playback_options, ASSERT_NO_EXCEPTION); EXPECT_GT(playback_context->baseLatency(), balanced_context->baseLatency()); AudioContextOptions* exact_too_small_options = AudioContextOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + exact_too_small_options->setLatencyHint( + MakeGarbageCollected<V8UnionAudioContextLatencyCategoryOrDouble>( + interactive_context->baseLatency() / 2)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) exact_too_small_options->setLatencyHint( AudioContextLatencyCategoryOrDouble::FromDouble( interactive_context->baseLatency() / 2)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AudioContext* exact_too_small_context = AudioContext::Create( GetDocument(), exact_too_small_options, ASSERT_NO_EXCEPTION); EXPECT_EQ(exact_too_small_context->baseLatency(), @@ -150,16 +177,28 @@ (interactive_context->baseLatency() + playback_context->baseLatency()) / 2; AudioContextOptions* exact_ok_options = AudioContextOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + exact_ok_options->setLatencyHint( + MakeGarbageCollected<V8UnionAudioContextLatencyCategoryOrDouble>( + exact_latency_sec)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) exact_ok_options->setLatencyHint( AudioContextLatencyCategoryOrDouble::FromDouble(exact_latency_sec)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AudioContext* exact_ok_context = AudioContext::Create( GetDocument(), exact_ok_options, ASSERT_NO_EXCEPTION); EXPECT_EQ(exact_ok_context->baseLatency(), exact_latency_sec); AudioContextOptions* exact_too_big_options = AudioContextOptions::Create(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + exact_too_big_options->setLatencyHint( + MakeGarbageCollected<V8UnionAudioContextLatencyCategoryOrDouble>( + playback_context->baseLatency() * 2)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) exact_too_big_options->setLatencyHint( AudioContextLatencyCategoryOrDouble::FromDouble( playback_context->baseLatency() * 2)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) AudioContext* exact_too_big_context = AudioContext::Create( GetDocument(), exact_too_big_options, ASSERT_NO_EXCEPTION); EXPECT_EQ(exact_too_big_context->baseLatency(),
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_data.cc b/third_party/blink/renderer/modules/webcodecs/audio_data.cc index 21e9675..40c66f9c 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_data.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_data.cc
@@ -8,6 +8,7 @@ #include "media/base/audio_bus.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data_init.h" #include "third_party/blink/renderer/modules/webaudio/audio_buffer.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc b/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc index 458d13b..9082b92 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc
@@ -63,8 +63,12 @@ DOMArrayPiece buffer(config.description()); DOMArrayBuffer* buffer_copy = DOMArrayBuffer::Create(buffer.Data(), buffer.ByteLength()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + copy->setDescription(MakeGarbageCollected<V8BufferSource>(buffer_copy)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) copy->setDescription( ArrayBufferOrArrayBufferView::FromArrayBuffer(buffer_copy)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } return copy; }
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc index 22494f0..efd27bb 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc
@@ -17,6 +17,7 @@ #include "media/base/mime_util.h" #include "media/base/offloading_audio_encoder.h" #include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_decoder_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_encoder_config.h" @@ -24,6 +25,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_encoded_audio_chunk_metadata.h" #include "third_party/blink/renderer/modules/webaudio/audio_buffer.h" #include "third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" namespace blink { @@ -328,8 +330,13 @@ if (codec_desc.has_value()) { auto* desc_array_buf = DOMArrayBuffer::Create(codec_desc.value().data(), codec_desc.value().size()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + decoder_config->setDescription( + MakeGarbageCollected<V8BufferSource>(desc_array_buf)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) decoder_config->setDescription( ArrayBufferOrArrayBufferView::FromArrayBuffer(desc_array_buf)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } metadata->setDecoderConfig(decoder_config); }
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc index 72b49721..ddba04d 100644 --- a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc +++ b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc
@@ -286,8 +286,9 @@ DCHECK_EQ(request->type, Request::Type::kConfigure); DCHECK(request->media_config); - if (decoder_ && pending_decodes_.size() + 1 > - size_t{Traits::GetMaxDecodeRequests(*decoder_)}) { + if (decoder_ && + pending_decodes_.size() + 1 > + static_cast<size_t>(Traits::GetMaxDecodeRequests(*decoder_))) { // Try again after OnDecodeDone(). return false; } @@ -366,7 +367,7 @@ } if (pending_decodes_.size() + 1 > - size_t{Traits::GetMaxDecodeRequests(*decoder_)}) { + static_cast<size_t>(Traits::GetMaxDecodeRequests(*decoder_))) { // Try again after OnDecodeDone(). return false; } @@ -417,7 +418,7 @@ DCHECK(decoder_); if (pending_decodes_.size() + 1 > - size_t{Traits::GetMaxDecodeRequests(*decoder_)}) { + static_cast<size_t>(Traits::GetMaxDecodeRequests(*decoder_))) { // Try again after OnDecodeDone(). return false; }
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc b/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc index 0bcf7de..f56b122 100644 --- a/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc +++ b/third_party/blink/renderer/modules/webcodecs/decoder_template_test.cc
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_function.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_audio_data_output_callback.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_decoder_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_decoder_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_decoder_config.h"
diff --git a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc index 4ab072ec..75474298 100644 --- a/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc +++ b/third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_test.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_encoded_video_chunk_init.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -14,11 +15,18 @@ class EncodedVideoChunkTest : public testing::Test { public: +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + V8BufferSource* StringToBuffer(std::string data) { + return MakeGarbageCollected<V8BufferSource>( + DOMArrayBuffer::Create(data.data(), data.size())); + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ArrayBufferOrArrayBufferView StringToBuffer(std::string data) { ArrayBufferOrArrayBufferView result; result.SetArrayBuffer(DOMArrayBuffer::Create(data.data(), data.size())); return result; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) std::string BufferToString(DOMArrayBuffer* buffer) { return std::string(static_cast<char*>(buffer->Data()),
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc index c633cab..fd5baa6 100644 --- a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc +++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
@@ -56,8 +56,12 @@ config->setCodec(proto.codec().c_str()); DOMArrayBuffer* data_copy = DOMArrayBuffer::Create( proto.description().data(), proto.description().size()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + config->setDescription(MakeGarbageCollected<V8BufferSource>(data_copy)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) config->setDescription( ArrayBufferOrArrayBufferView::FromArrayBuffer(data_copy)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return config; } @@ -70,8 +74,12 @@ DOMArrayBuffer* data_copy = DOMArrayBuffer::Create( proto.description().data(), proto.description().size()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + config->setDescription(MakeGarbageCollected<V8BufferSource>(data_copy)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) config->setDescription( ArrayBufferOrArrayBufferView::FromArrayBuffer(data_copy)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return config; } @@ -126,9 +134,14 @@ EncodedVideoChunk* MakeEncodedVideoChunk( const wc_fuzzer::EncodedVideoChunk& proto) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* data = MakeGarbageCollected<V8BufferSource>( + DOMArrayBuffer::Create(proto.data().data(), proto.data().size())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ArrayBufferOrArrayBufferView data; data.SetArrayBuffer( DOMArrayBuffer::Create(proto.data().data(), proto.data().size())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* init = EncodedVideoChunkInit::Create(); init->setTimestamp(proto.timestamp()); @@ -140,9 +153,14 @@ EncodedAudioChunk* MakeEncodedAudioChunk( const wc_fuzzer::EncodedAudioChunk& proto) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + auto* data = MakeGarbageCollected<V8BufferSource>( + DOMArrayBuffer::Create(proto.data().data(), proto.data().size())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ArrayBufferOrArrayBufferView data; data.SetArrayBuffer( DOMArrayBuffer::Create(proto.data().data(), proto.data().size())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* init = EncodedAudioChunkInit::Create(); init->setTimestamp(proto.timestamp());
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc index 1eee849a..af778b05 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
@@ -19,6 +19,7 @@ #include "third_party/blink/renderer/modules/webcodecs/image_track_list.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame.h" #include "third_party/blink/renderer/platform/bindings/exception_code.h" +#include "third_party/blink/renderer/platform/bindings/exception_messages.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/graphics/bitmap_image_metrics.h" @@ -122,7 +123,11 @@ // |data| is a required field. DCHECK(init->hasData()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + DCHECK(init->data()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) DCHECK(!init->data().IsNull()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) constexpr char kNoneOption[] = "none"; auto color_behavior = ColorBehavior::Tag(); @@ -152,9 +157,22 @@ {base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); - if (init->data().IsReadableStream()) { - if (init->data().GetAsReadableStream()->IsLocked() || - init->data().GetAsReadableStream()->IsDisturbed()) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->data()->IsReadableStream() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->data().IsReadableStream() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { + if ( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->data()->GetAsReadableStream()->IsLocked() || + init->data()->GetAsReadableStream()->IsDisturbed() +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->data().GetAsReadableStream()->IsLocked() || + init->data().GetAsReadableStream()->IsDisturbed() +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + ) { exception_state.ThrowTypeError( "ImageDecoder can only accept readable streams that are not yet " "locked to a reader"); @@ -166,8 +184,13 @@ /*data_complete=*/false, alpha_option, color_behavior, desired_size, animation_option_); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + consumer_ = MakeGarbageCollected<ReadableStreamBytesConsumer>( + script_state, init->data()->GetAsReadableStream()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) consumer_ = MakeGarbageCollected<ReadableStreamBytesConsumer>( script_state, init->data().GetAsReadableStream()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) construction_succeeded_ = true; @@ -179,6 +202,19 @@ } DOMArrayPiece buffer; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (init->data()->GetContentType()) { + case V8ImageBufferSource::ContentType::kArrayBuffer: + buffer = DOMArrayPiece(init->data()->GetAsArrayBuffer()); + break; + case V8ImageBufferSource::ContentType::kArrayBufferView: + buffer = DOMArrayPiece(init->data()->GetAsArrayBufferView().Get()); + break; + case V8ImageBufferSource::ContentType::kReadableStream: + NOTREACHED(); + return; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (init->data().IsArrayBuffer()) { buffer = DOMArrayPiece(init->data().GetAsArrayBuffer()); } else if (init->data().IsArrayBufferView()) { @@ -187,6 +223,7 @@ NOTREACHED(); return; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (!buffer.ByteLength()) { exception_state.ThrowDOMException(DOMExceptionCode::kConstraintError,
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc index d752b66..6de6adb 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external_test.cc
@@ -45,8 +45,14 @@ auto data = ReadFile(file_name); DCHECK(!data->IsEmpty()) << "Missing file: " << file_name; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData(MakeGarbageCollected< + V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + DOMArrayBuffer::Create(std::move(data)))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData(ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer( DOMArrayBuffer::Create(std::move(data)))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return ImageDecoderExternal::Create(v8_scope->GetScriptState(), init, v8_scope->GetExceptionState()); } @@ -119,8 +125,14 @@ auto* init = MakeGarbageCollected<ImageDecoderInit>(); init->setType("image/png"); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + DOMArrayBuffer::Create(SharedBuffer::Create()))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData(ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer( DOMArrayBuffer::Create(SharedBuffer::Create()))); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* decoder = ImageDecoderExternal::Create(v8_scope.GetScriptState(), init, v8_scope.GetExceptionState()); EXPECT_FALSE(decoder); @@ -134,8 +146,14 @@ auto* buffer = DOMArrayBuffer::Create(SharedBuffer::Create()); init->setType("image/png"); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + buffer)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer(buffer)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ArrayBufferContents contents; ASSERT_TRUE(buffer->Transfer(v8_scope.GetIsolate(), contents)); @@ -161,8 +179,14 @@ auto* buffer = DOMArrayBuffer::Create(std::move(data)); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + buffer)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer(buffer)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* decoder = ImageDecoderExternal::Create(v8_scope.GetScriptState(), init, v8_scope.GetExceptionState()); @@ -449,8 +473,14 @@ auto* init = MakeGarbageCollected<ImageDecoderInit>(); init->setType(kImageType); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + stream)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromReadableStream(stream)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Persistent<ImageDecoderExternal> decoder = ImageDecoderExternal::Create( v8_scope.GetScriptState(), init, IGNORE_EXCEPTION_FOR_TESTING); @@ -550,8 +580,14 @@ auto* init = MakeGarbageCollected<ImageDecoderInit>(); init->setType(kImageType); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + stream)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromReadableStream(stream)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Persistent<ImageDecoderExternal> decoder = ImageDecoderExternal::Create( v8_scope.GetScriptState(), init, IGNORE_EXCEPTION_FOR_TESTING); @@ -618,8 +654,14 @@ auto* init = MakeGarbageCollected<ImageDecoderInit>(); init->setType(kImageType); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + stream)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromReadableStream(stream)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Persistent<ImageDecoderExternal> decoder = ImageDecoderExternal::Create( v8_scope.GetScriptState(), init, IGNORE_EXCEPTION_FOR_TESTING); @@ -685,8 +727,14 @@ auto* array_buffer = DOMArrayBuffer::Create(128, 1); ASSERT_TRUE(data->GetBytes(array_buffer->Data(), array_buffer->ByteLength())); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + array_buffer)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData(ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer( array_buffer)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* decoder = ImageDecoderExternal::Create(v8_scope.GetScriptState(), init, v8_scope.GetExceptionState()); ASSERT_TRUE(decoder); @@ -731,8 +779,14 @@ auto* init = MakeGarbageCollected<ImageDecoderInit>(); init->setType(kImageType); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + stream)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromReadableStream(stream)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Persistent<ImageDecoderExternal> decoder = ImageDecoderExternal::Create( v8_scope.GetScriptState(), init, IGNORE_EXCEPTION_FOR_TESTING); @@ -779,8 +833,14 @@ auto* init = MakeGarbageCollected<ImageDecoderInit>(); init->setType(kImageType); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setData( + MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferViewOrReadableStream>( + stream)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromReadableStream(stream)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) Persistent<ImageDecoderExternal> decoder = ImageDecoderExternal::Create( v8_scope.GetScriptState(), init, IGNORE_EXCEPTION_FOR_TESTING);
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc index a608974..e55e7fc 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
@@ -124,9 +124,15 @@ image_decoder_init->setType(proto.config().type().c_str()); Persistent<DOMArrayBuffer> data_copy = DOMArrayBuffer::Create( proto.config().data().data(), proto.config().data().size()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + image_decoder_init->setData( + MakeGarbageCollected< + V8UnionArrayBufferOrArrayBufferViewOrReadableStream>(data_copy)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) image_decoder_init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromArrayBuffer( data_copy)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) image_decoder_init->setPremultiplyAlpha( ToPremultiplyAlpha(proto.config().options().premultiply_alpha())); image_decoder_init->setColorSpaceConversion(ToColorSpaceConversion( @@ -161,9 +167,15 @@ ReadableStream::CreateWithCountQueueingStrategy(script_state, underlying_source, 0); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + image_decoder_init->setData( + MakeGarbageCollected< + V8UnionArrayBufferOrArrayBufferViewOrReadableStream>(stream)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) image_decoder_init->setData( ArrayBufferOrArrayBufferViewOrReadableStream::FromReadableStream( stream)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) image_decoder = ImageDecoderExternal::Create( script_state, image_decoder_init, IGNORE_EXCEPTION_FOR_TESTING); image_decoder_init = nullptr;
diff --git a/third_party/blink/renderer/modules/webcodecs/parsed_read_into_options.cc b/third_party/blink/renderer/modules/webcodecs/parsed_read_into_options.cc index 8506ebb..045f37e 100644 --- a/third_party/blink/renderer/modules/webcodecs/parsed_read_into_options.cc +++ b/third_party/blink/renderer/modules/webcodecs/parsed_read_into_options.cc
@@ -7,9 +7,9 @@ #include <algorithm> #include "base/numerics/checked_math.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_plane_layout.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_video_frame_read_into_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_frame_region.h" -#include "third_party/blink/renderer/modules/webcodecs/plane_layout.h" -#include "third_party/blink/renderer/modules/webcodecs/video_frame_read_into_options.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" namespace blink {
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc index d72f7c7..85f9c56 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
@@ -171,8 +171,12 @@ DOMArrayPiece buffer(config.description()); DOMArrayBuffer* buffer_copy = DOMArrayBuffer::Create(buffer.Data(), buffer.ByteLength()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + copy->setDescription(MakeGarbageCollected<V8BufferSource>(buffer_copy)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) copy->setDescription( ArrayBufferOrArrayBufferView::FromArrayBuffer(buffer_copy)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } if (config.hasCodedWidth())
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index c671f32..6d441ce 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -125,7 +125,7 @@ } double max_supported_framerate = - double{supported_profile.max_framerate_numerator} / + static_cast<double>(supported_profile.max_framerate_numerator) / supported_profile.max_framerate_denominator; if (options.framerate.has_value() && options.framerate.value() > max_supported_framerate) { @@ -331,7 +331,7 @@ if (config.hasHardwareAcceleration()) result->setHardwareAcceleration(config.hardwareAcceleration()); - if (config.hasAvc() && config.avc()->format()) { + if (config.hasAvc() && config.avc()->hasFormat()) { auto* avc = AvcEncoderConfig::Create(); avc->setFormat(config.avc()->format()); result->setAvc(avc); @@ -718,8 +718,13 @@ if (codec_desc.has_value()) { auto* desc_array_buf = DOMArrayBuffer::Create(codec_desc.value().data(), codec_desc.value().size()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + decoder_config->setDescription( + MakeGarbageCollected<V8BufferSource>(desc_array_buf)); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) decoder_config->setDescription( ArrayBufferOrArrayBufferView::FromArrayBuffer(desc_array_buf)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } metadata->setDecoderConfig(decoder_config); }
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame.cc b/third_party/blink/renderer/modules/webcodecs/video_frame.cc index 7ecbe71d..d97b1eb 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
@@ -18,6 +18,7 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_plane_init.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_plane_layout.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_cssimagevalue_htmlcanvaselement_htmlimageelement_htmlvideoelement_imagebitmap_offscreencanvas_svgimageelement_videoframe.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_frame_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_frame_plane_init.h" @@ -29,7 +30,6 @@ #include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h" #include "third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h" #include "third_party/blink/renderer/modules/webcodecs/parsed_read_into_options.h" -#include "third_party/blink/renderer/modules/webcodecs/plane_layout.h" #include "third_party/blink/renderer/modules/webcodecs/webcodecs_logger.h" #include "third_party/blink/renderer/platform/graphics/image.h" #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h" @@ -546,7 +546,7 @@ DOMExceptionCode::kConstraintError, String::Format("Invalid number of planes for format %s; expected %zu, " "received %u.", - init->format().Ascii().c_str(), + IDLEnumAsString(init->format()).Ascii().c_str(), media::VideoFrame::NumPlanes(media_fmt), planes.size())); return nullptr; }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_multi_draw_common.cc b/third_party/blink/renderer/modules/webgl/webgl_multi_draw_common.cc index 060c251..beb3d10 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_multi_draw_common.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_multi_draw_common.cc
@@ -48,7 +48,7 @@ case V8UnionInt32ArrayAllowSharedOrLongSequence::ContentType:: kInt32ArrayAllowShared: return base::span<const int32_t>( - array->GetAsInt32ArrayAllowShared()->Data(), + array->GetAsInt32ArrayAllowShared()->DataMaybeShared(), array->GetAsInt32ArrayAllowShared()->length()); case V8UnionInt32ArrayAllowSharedOrLongSequence::ContentType::kLongSequence: return base::span<const int32_t>(array->GetAsLongSequence().data(), @@ -66,7 +66,7 @@ case V8UnionUint32ArrayAllowSharedOrUnsignedLongSequence::ContentType:: kUint32ArrayAllowShared: return base::span<const uint32_t>( - array->GetAsUint32ArrayAllowShared()->Data(), + array->GetAsUint32ArrayAllowShared()->DataMaybeShared(), array->GetAsUint32ArrayAllowShared()->length()); case V8UnionUint32ArrayAllowSharedOrUnsignedLongSequence::ContentType:: kUnsignedLongSequence:
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 5fadb9c7..47ad7a3 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -1385,26 +1385,14 @@ if (layout_box && settings->GetAcceleratedCompositingEnabled()) layout_box->ContentChanged(change_type); } - IntSize canvas_size = ClampedCanvasSize(); - DidDraw(SkIRect::MakeXYWH(0, 0, canvas_size.Width(), canvas_size.Height())); + DidDraw(); } } - scoped_refptr<base::SingleThreadTaskRunner> WebGLRenderingContextBase::GetContextTaskRunner() { return task_runner_; } -void WebGLRenderingContextBase::DidDraw(const SkIRect& dirty_rect) { - MarkContextChanged(kCanvasChanged); - CanvasRenderingContext::DidDraw(dirty_rect); -} - -void WebGLRenderingContextBase::DidDraw() { - MarkContextChanged(kCanvasChanged); - CanvasRenderingContext::DidDraw(); -} - bool WebGLRenderingContextBase::PushFrame() { TRACE_EVENT0("blink", "WebGLRenderingContextBase::PushFrame"); DCHECK(Host());
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index c5be16fb..f5ed265 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -705,8 +705,6 @@ SourceDrawingBuffer) override; cc::Layer* CcLayer() const override; void Stop() override; - void DidDraw(const SkIRect&) override; - void DidDraw() override; void FinalizeFrame() override; bool PushFrame() override;
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc index b1444ea..ed60c55 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc +++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
@@ -15,7 +15,6 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_programmable_stage.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_doublesequence_gpucolordict.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_union_gpuextent3ddict_unsignedlongenforcerangesequence.h" -#include "third_party/blink/renderer/modules/webgpu/gpu_device.h" #include "third_party/blink/renderer/modules/webgpu/gpu_shader_module.h" #include "third_party/blink/renderer/modules/webgpu/gpu_texture.h" @@ -59,7 +58,7 @@ return WGPUColor{}; } -WGPUExtent3D AsDawnType(const V8GPUExtent3D* webgpu_extent, GPUDevice* device) { +WGPUExtent3D AsDawnType(const V8GPUExtent3D* webgpu_extent) { DCHECK(webgpu_extent); // Set all extents to their default value of 1. @@ -108,6 +107,50 @@ return dawn_extent; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + +WGPUOrigin3D AsDawnType(const V8GPUOrigin3D* webgpu_origin) { + DCHECK(webgpu_origin); + + WGPUOrigin3D dawn_origin = {0, 0, 0}; + + switch (webgpu_origin->GetContentType()) { + case V8GPUOrigin3D::ContentType::kGPUOrigin3DDict: { + const GPUOrigin3DDict* webgpu_origin_3d_dict = + webgpu_origin->GetAsGPUOrigin3DDict(); + dawn_origin.x = webgpu_origin_3d_dict->x(); + dawn_origin.y = webgpu_origin_3d_dict->y(); + dawn_origin.z = webgpu_origin_3d_dict->z(); + break; + } + case V8GPUOrigin3D::ContentType::kUnsignedLongEnforceRangeSequence: { + const Vector<uint32_t>& webgpu_origin_sequence = + webgpu_origin->GetAsUnsignedLongEnforceRangeSequence(); + + // The WebGPU spec states that if the sequence isn't big enough then the + // default values of 0 are used (which are set above). + switch (webgpu_origin_sequence.size()) { + default: + dawn_origin.z = webgpu_origin_sequence[2]; + FALLTHROUGH; + case 2: + dawn_origin.y = webgpu_origin_sequence[1]; + FALLTHROUGH; + case 1: + dawn_origin.x = webgpu_origin_sequence[0]; + FALLTHROUGH; + case 0: + break; + } + break; + } + } + + return dawn_origin; +} + +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + WGPUExtent3D AsDawnType( const UnsignedLongEnforceRangeSequenceOrGPUExtent3DDict* webgpu_extent, GPUDevice* device) { @@ -197,6 +240,8 @@ return dawn_origin; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + WGPUTextureCopyView AsDawnType(const GPUImageCopyTexture* webgpu_view, GPUDevice* device) { DCHECK(webgpu_view); @@ -205,7 +250,11 @@ WGPUTextureCopyView dawn_view = {}; dawn_view.texture = webgpu_view->texture()->GetHandle(); dawn_view.mipLevel = webgpu_view->mipLevel(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + dawn_view.origin = AsDawnType(webgpu_view->origin()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_view.origin = AsDawnType(&webgpu_view->origin()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_view.aspect = AsDawnEnum<WGPUTextureAspect>(webgpu_view->aspect()); return dawn_view;
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h index 7d1f776..5434011 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h +++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h
@@ -34,13 +34,16 @@ WGPUColor AsDawnColor(const Vector<double>&); WGPUColor AsDawnType(const GPUColorDict*); WGPUColor AsDawnType(const V8GPUColor* webgpu_color); -WGPUExtent3D AsDawnType(const V8GPUExtent3D* webgpu_extent, GPUDevice* device); -// TODO(crbug.com/1181288): Remove the old IDL union version. +WGPUExtent3D AsDawnType(const V8GPUExtent3D* webgpu_extent); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +WGPUOrigin3D AsDawnType(const V8GPUOrigin3D* webgpu_extent); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) WGPUExtent3D AsDawnType( const UnsignedLongEnforceRangeSequenceOrGPUExtent3DDict*, GPUDevice* device); WGPUOrigin3D AsDawnType( const UnsignedLongEnforceRangeSequenceOrGPUOrigin3DDict*); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) WGPUTextureCopyView AsDawnType(const GPUImageCopyTexture* webgpu_view, GPUDevice* device); const char* ValidateTextureDataLayout(const GPUImageDataLayout* webgpu_layout,
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_bind_group.cc b/third_party/blink/renderer/modules/webgpu/gpu_bind_group.cc index c329580..9f6d0560 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_bind_group.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_bind_group.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_bind_group_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_bind_group_entry.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_buffer_binding.h" #include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h" #include "third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.h" #include "third_party/blink/renderer/modules/webgpu/gpu_buffer.h" @@ -21,6 +22,26 @@ dawn_binding.binding = webgpu_binding->binding(); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (webgpu_binding->resource()->GetContentType()) { + case V8GPUBindingResource::ContentType::kGPUBufferBinding: { + GPUBufferBinding* buffer = + webgpu_binding->resource()->GetAsGPUBufferBinding(); + dawn_binding.offset = buffer->offset(); + dawn_binding.size = buffer->hasSize() ? buffer->size() : WGPU_WHOLE_SIZE; + dawn_binding.buffer = AsDawnType(buffer->buffer()); + break; + } + case V8GPUBindingResource::ContentType::kGPUSampler: + dawn_binding.sampler = + AsDawnType(webgpu_binding->resource()->GetAsGPUSampler()); + break; + case V8GPUBindingResource::ContentType::kGPUTextureView: + dawn_binding.textureView = + AsDawnType(webgpu_binding->resource()->GetAsGPUTextureView()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (webgpu_binding->resource().IsGPUBufferBinding()) { GPUBufferBinding* buffer = webgpu_binding->resource().GetAsGPUBufferBinding(); @@ -40,6 +61,7 @@ } else { NOTREACHED(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) return dawn_binding; } @@ -72,7 +94,8 @@ GPUBindGroup* bind_group = MakeGarbageCollected<GPUBindGroup>( device, device->GetProcs().deviceCreateBindGroup(device->GetHandle(), &dawn_desc)); - bind_group->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + bind_group->setLabel(webgpu_desc->label()); return bind_group; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.cc b/third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.cc index f755b454..cb62791 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_bind_group_layout.cc
@@ -102,7 +102,8 @@ GPUBindGroupLayout* layout = MakeGarbageCollected<GPUBindGroupLayout>( device, device->GetProcs().deviceCreateBindGroupLayout( device->GetHandle(), &dawn_desc)); - layout->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + layout->setLabel(webgpu_desc->label()); return layout; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc b/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc index 16aeac0..4cf2fd74 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
@@ -73,7 +73,8 @@ GPUBuffer* buffer = MakeGarbageCollected<GPUBuffer>( device, dawn_desc.size, device->GetProcs().deviceCreateBuffer(device->GetHandle(), &dawn_desc)); - buffer->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + buffer->setLabel(webgpu_desc->label()); return buffer; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc index f067687..3396967 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -198,8 +198,12 @@ // deprecated behavior of resizing to match the canvas size each frame. size = IntSize(-1, -1); } else if (descriptor->hasSize()) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + WGPUExtent3D dawn_extent = AsDawnType(descriptor->size()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) WGPUExtent3D dawn_extent = AsDawnType(&descriptor->size(), descriptor->device()); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) size = IntSize(dawn_extent.width, dawn_extent.height); if (dawn_extent.depthOrArrayLayers != 1) { @@ -215,7 +219,8 @@ swapchain_ = MakeGarbageCollected<GPUSwapChain>( this, descriptor->device(), usage, format, filter_quality_, size); swapchain_->CcLayer()->SetContentsOpaque(!CreationAttributes().alpha); - swapchain_->setLabel(descriptor->label()); + if (descriptor->hasLabel()) + swapchain_->setLabel(descriptor->label()); // If we don't notify the host that something has changed it may never check // for the new cc::Layer.
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc b/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc index 32eedb7..69cb4a5 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_command_encoder.cc
@@ -36,10 +36,28 @@ // Deprecated path dawn_desc.view = webgpu_desc->attachment()->GetHandle(); } - dawn_desc.resolveTarget = webgpu_desc->resolveTarget() + dawn_desc.resolveTarget = webgpu_desc->hasResolveTarget() ? webgpu_desc->resolveTarget()->GetHandle() : nullptr; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (webgpu_desc->loadValue()->GetContentType()) { + case V8UnionGPUColorOrGPULoadOp::ContentType::kGPULoadOp: + dawn_desc.loadOp = + AsDawnEnum<WGPULoadOp>(webgpu_desc->loadValue()->GetAsGPULoadOp()); + break; + case V8UnionGPUColorOrGPULoadOp::ContentType::kGPUColorDict: + dawn_desc.loadOp = WGPULoadOp_Clear; + dawn_desc.clearColor = + AsDawnType(webgpu_desc->loadValue()->GetAsGPUColorDict()); + break; + case V8UnionGPUColorOrGPULoadOp::ContentType::kDoubleSequence: + dawn_desc.loadOp = WGPULoadOp_Clear; + dawn_desc.clearColor = + AsDawnColor(webgpu_desc->loadValue()->GetAsDoubleSequence()); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (webgpu_desc->loadValue().IsGPULoadOp()) { const WTF::String& gpuLoadOp = webgpu_desc->loadValue().GetAsGPULoadOp(); dawn_desc.loadOp = AsDawnEnum<WGPULoadOp>(gpuLoadOp); @@ -58,8 +76,10 @@ } else { NOTREACHED(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) - dawn_desc.storeOp = AsDawnEnum<WGPUStoreOp>(webgpu_desc->storeOp()); + if (webgpu_desc->hasStoreOp()) + dawn_desc.storeOp = AsDawnEnum<WGPUStoreOp>(webgpu_desc->storeOp()); return dawn_desc; } @@ -78,6 +98,19 @@ dawn_desc.view = webgpu_desc->attachment()->GetHandle(); } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (webgpu_desc->depthLoadValue()->GetContentType()) { + case V8UnionFloatOrGPULoadOp::ContentType::kGPULoadOp: + dawn_desc.depthLoadOp = AsDawnEnum<WGPULoadOp>( + webgpu_desc->depthLoadValue()->GetAsGPULoadOp()); + dawn_desc.clearDepth = 1.0f; + break; + case V8UnionFloatOrGPULoadOp::ContentType::kFloat: + dawn_desc.depthLoadOp = WGPULoadOp_Clear; + dawn_desc.clearDepth = webgpu_desc->depthLoadValue()->GetAsFloat(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (webgpu_desc->depthLoadValue().IsGPULoadOp()) { const WTF::String& gpuLoadOp = webgpu_desc->depthLoadValue().GetAsGPULoadOp(); @@ -91,9 +124,24 @@ } else { NOTREACHED(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_desc.depthStoreOp = AsDawnEnum<WGPUStoreOp>(webgpu_desc->depthStoreOp()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + switch (webgpu_desc->stencilLoadValue()->GetContentType()) { + case V8UnionGPULoadOpOrGPUStencilValue::ContentType::kGPULoadOp: + dawn_desc.stencilLoadOp = AsDawnEnum<WGPULoadOp>( + webgpu_desc->stencilLoadValue()->GetAsGPULoadOp()); + dawn_desc.clearStencil = 0; + break; + case V8UnionGPULoadOpOrGPUStencilValue::ContentType::kV8GPUStencilValue: + dawn_desc.stencilLoadOp = WGPULoadOp_Clear; + dawn_desc.clearStencil = + webgpu_desc->stencilLoadValue()->GetAsV8GPUStencilValue(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (webgpu_desc->stencilLoadValue().IsGPULoadOp()) { const WTF::String& gpuLoadOp = webgpu_desc->stencilLoadValue().GetAsGPULoadOp(); @@ -108,6 +156,7 @@ } else { NOTREACHED(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_desc.stencilStoreOp = AsDawnEnum<WGPUStoreOp>(webgpu_desc->stencilStoreOp()); @@ -153,20 +202,15 @@ const GPUCommandEncoderDescriptor* webgpu_desc) { DCHECK(device); DCHECK(webgpu_desc); - ALLOW_UNUSED_LOCAL(webgpu_desc); std::string label; - WGPUCommandEncoderDescriptor dawn_desc = {}; - const WGPUCommandEncoderDescriptor* dawn_desc_ptr = nullptr; - if (webgpu_desc) { - dawn_desc = AsDawnType(webgpu_desc, &label); - dawn_desc_ptr = &dawn_desc; - } + WGPUCommandEncoderDescriptor dawn_desc = AsDawnType(webgpu_desc, &label); GPUCommandEncoder* encoder = MakeGarbageCollected<GPUCommandEncoder>( device, device->GetProcs().deviceCreateCommandEncoder(device->GetHandle(), - dawn_desc_ptr)); - encoder->setLabel(webgpu_desc->label()); + &dawn_desc)); + if (webgpu_desc->hasLabel()) + encoder->setLabel(webgpu_desc->label()); return encoder; } @@ -199,6 +243,13 @@ return nullptr; } +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + if (color_attachment->loadValue()->IsDoubleSequence() && + color_attachment->loadValue()->GetAsDoubleSequence().size() != 4) { + exception_state.ThrowRangeError("loadValue color size must be 4"); + return nullptr; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const GPULoadOpOrDoubleSequenceOrGPUColorDict load_value = color_attachment->loadValue(); @@ -207,6 +258,7 @@ exception_state.ThrowRangeError("loadValue color size must be 4"); return nullptr; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } std::string label; @@ -251,7 +303,8 @@ GPURenderPassEncoder* encoder = MakeGarbageCollected<GPURenderPassEncoder>( device_, GetProcs().commandEncoderBeginRenderPass(GetHandle(), &dawn_desc)); - encoder->setLabel(descriptor->label()); + if (descriptor->hasLabel()) + encoder->setLabel(descriptor->label()); return encoder; } @@ -267,14 +320,15 @@ GPUComputePassEncoder* encoder = MakeGarbageCollected<GPUComputePassEncoder>( device_, GetProcs().commandEncoderBeginComputePass(GetHandle(), &dawn_desc)); - encoder->setLabel(descriptor->label()); + if (descriptor->hasLabel()) + encoder->setLabel(descriptor->label()); return encoder; } void GPUCommandEncoder::copyBufferToTexture(GPUImageCopyBuffer* source, GPUImageCopyTexture* destination, const V8GPUExtent3D* copy_size) { - WGPUExtent3D dawn_copy_size = AsDawnType(copy_size, device_); + WGPUExtent3D dawn_copy_size = AsDawnType(copy_size); WGPUTextureCopyView dawn_destination = AsDawnType(destination, device_); const char* error = nullptr; @@ -292,7 +346,7 @@ void GPUCommandEncoder::copyTextureToBuffer(GPUImageCopyTexture* source, GPUImageCopyBuffer* destination, const V8GPUExtent3D* copy_size) { - WGPUExtent3D dawn_copy_size = AsDawnType(copy_size, device_); + WGPUExtent3D dawn_copy_size = AsDawnType(copy_size); WGPUTextureCopyView dawn_source = AsDawnType(source, device_); const char* error = nullptr; @@ -312,7 +366,7 @@ const V8GPUExtent3D* copy_size) { WGPUTextureCopyView dawn_source = AsDawnType(source, device_); WGPUTextureCopyView dawn_destination = AsDawnType(destination, device_); - WGPUExtent3D dawn_copy_size = AsDawnType(copy_size, device_); + WGPUExtent3D dawn_copy_size = AsDawnType(copy_size); GetProcs().commandEncoderCopyTextureToTexture( GetHandle(), &dawn_source, &dawn_destination, &dawn_copy_size);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc b/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc index 39ad724..6389af91 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.cc
@@ -60,7 +60,8 @@ GPUComputePipeline* pipeline = MakeGarbageCollected<GPUComputePipeline>( device, device->GetProcs().deviceCreateComputePipeline( device->GetHandle(), &dawn_desc)); - pipeline->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + pipeline->setLabel(webgpu_desc->label()); return pipeline; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.cc b/third_party/blink/renderer/modules/webgpu/gpu_device.cc index e44e2b2..b714267 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_device.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_device.cc
@@ -98,7 +98,8 @@ lost_callback_->UnboundCallback(), lost_callback_->AsUserdata()); - setLabel(descriptor->label()); + if (descriptor->hasLabel()) + setLabel(descriptor->label()); } void GPUDevice::InjectError(WGPUErrorType type, const char* message) { @@ -134,14 +135,26 @@ GPUUncapturedErrorEventInit* init = GPUUncapturedErrorEventInit::Create(); if (errorType == WGPUErrorType_Validation) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setError( + MakeGarbageCollected<V8UnionGPUOutOfMemoryErrorOrGPUValidationError>( + MakeGarbageCollected<GPUValidationError>(message))); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto* error = MakeGarbageCollected<GPUValidationError>(message); init->setError( GPUOutOfMemoryErrorOrGPUValidationError::FromGPUValidationError(error)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } else if (errorType == WGPUErrorType_OutOfMemory) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + init->setError( + MakeGarbageCollected<V8UnionGPUOutOfMemoryErrorOrGPUValidationError>( + GPUOutOfMemoryError::Create())); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) GPUOutOfMemoryError* error = GPUOutOfMemoryError::Create(); init->setError( GPUOutOfMemoryErrorOrGPUValidationError::FromGPUOutOfMemoryError( error)); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } else { return; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout.cc b/third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout.cc index dace784..4c8ee81 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_pipeline_layout.cc
@@ -38,7 +38,8 @@ GPUPipelineLayout* layout = MakeGarbageCollected<GPUPipelineLayout>( device, device->GetProcs().deviceCreatePipelineLayout(device->GetHandle(), &dawn_desc)); - layout->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + layout->setLabel(webgpu_desc->label()); return layout; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_query_set.cc b/third_party/blink/renderer/modules/webgpu/gpu_query_set.cc index afdd9bf80..69b18ff 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_query_set.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_query_set.cc
@@ -40,7 +40,8 @@ GPUQuerySet* query_set = MakeGarbageCollected<GPUQuerySet>( device, device->GetProcs().deviceCreateQuerySet(device->GetHandle(), &dawn_desc)); - query_set->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + query_set->setLabel(webgpu_desc->label()); return query_set; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc index 7bea16c..ecf907f 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
@@ -13,8 +13,12 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_external_image.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_image_bitmap.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_texture.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_origin_2d_dict.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" +#include "third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h" +#include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h" #include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h" +#include "third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h" #include "third_party/blink/renderer/modules/webgpu/gpu_buffer.h" @@ -29,6 +33,47 @@ namespace { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) +WGPUOrigin3D GPUOrigin2DToWGPUOrigin3D(const V8GPUOrigin2D* webgpu_origin) { + DCHECK(webgpu_origin); + + WGPUOrigin3D dawn_origin = { + 0, + 0, + 0, + }; + + switch (webgpu_origin->GetContentType()) { + case V8GPUOrigin2D::ContentType::kGPUOrigin2DDict: { + const GPUOrigin2DDict* webgpu_origin_2d_dict = + webgpu_origin->GetAsGPUOrigin2DDict(); + dawn_origin.x = webgpu_origin_2d_dict->x(); + dawn_origin.y = webgpu_origin_2d_dict->y(); + break; + } + case V8GPUOrigin2D::ContentType::kUnsignedLongEnforceRangeSequence: { + const Vector<uint32_t>& webgpu_origin_sequence = + webgpu_origin->GetAsUnsignedLongEnforceRangeSequence(); + // The WebGPU spec states that if the sequence isn't big enough then the + // default values of 0 are used (which are set above). + switch (webgpu_origin_sequence.size()) { + default: + // This is a 2D origin and the depth should be 0 always. + dawn_origin.y = webgpu_origin_sequence[1]; + FALLTHROUGH; + case 1: + dawn_origin.x = webgpu_origin_sequence[0]; + FALLTHROUGH; + case 0: + break; + } + break; + } + } + + return dawn_origin; +} +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) WGPUOrigin3D GPUOrigin2DToWGPUOrigin3D( const UnsignedLongEnforceRangeSequenceOrGPUOrigin2DDict* webgpu_origin) { DCHECK(webgpu_origin); @@ -66,6 +111,7 @@ return dawn_origin; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) bool IsValidExternalImageDestinationFormat( WGPUTextureFormat dawn_texture_format) { @@ -129,9 +175,33 @@ } scoped_refptr<Image> GetImageFromExternalImage( +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const V8UnionHTMLCanvasElementOrImageBitmapOrOffscreenCanvas* + external_image, +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const ImageBitmapOrHTMLCanvasElementOrOffscreenCanvas& external_image, +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) ExceptionState& exception_state) { CanvasImageSource* source = nullptr; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + CanvasRenderingContextHost* canvas = nullptr; + switch (external_image->GetContentType()) { + case V8UnionHTMLCanvasElementOrImageBitmapOrOffscreenCanvas::ContentType:: + kHTMLCanvasElement: + source = external_image->GetAsHTMLCanvasElement(); + canvas = external_image->GetAsHTMLCanvasElement(); + break; + case V8UnionHTMLCanvasElementOrImageBitmapOrOffscreenCanvas::ContentType:: + kImageBitmap: + source = external_image->GetAsImageBitmap(); + break; + case V8UnionHTMLCanvasElementOrImageBitmapOrOffscreenCanvas::ContentType:: + kOffscreenCanvas: + source = external_image->GetAsOffscreenCanvas(); + canvas = external_image->GetAsOffscreenCanvas(); + break; + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (external_image.IsImageBitmap()) { source = external_image.GetAsImageBitmap(); } else { @@ -155,6 +225,18 @@ } source = canvas; } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + // The rendering context is 2d or webgl/webgl2. + if (canvas && !(canvas->Is3d() || canvas->IsRenderingContext2D())) { + exception_state.ThrowDOMException( + DOMExceptionCode::kOperationError, + "CopyExternalImageToTexture doesn't support canvas without 2d, webgl " + "or webgl2 conext"); + return nullptr; + } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // Neutered external image. if (source->IsNeutered()) { @@ -195,7 +277,7 @@ return image; } -} // anonymous namespace +} // namespace GPUQueue::GPUQueue(GPUDevice* device, WGPUQueue queue) : DawnObject<WGPUQueue>(device, queue) { @@ -368,7 +450,7 @@ GPUImageDataLayout* data_layout, const V8GPUExtent3D* write_size, ExceptionState& exception_state) { - WGPUExtent3D dawn_write_size = AsDawnType(write_size, device_); + WGPUExtent3D dawn_write_size = AsDawnType(write_size); WGPUTextureCopyView dawn_destination = AsDawnType(destination, device_); WGPUTextureDataLayout dawn_data_layout = {}; @@ -405,11 +487,16 @@ // TODO(crbug.com/1197369): Extract alpha info and config the following // CopyContentFromCPU() and CopyContentFromGPU(). - WGPUExtent3D dawn_copy_size = AsDawnType(copy_size, device_); + WGPUExtent3D dawn_copy_size = AsDawnType(copy_size); // Extract source origin +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + WGPUOrigin3D origin_in_external_image = + GPUOrigin2DToWGPUOrigin3D(copyImage->origin()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) WGPUOrigin3D origin_in_external_image = GPUOrigin2DToWGPUOrigin3D(&(copyImage->origin())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // Validate origin value const bool copyRectOutOfBounds = @@ -528,11 +615,16 @@ // appropriate format. Now only support texture format exactly the same. The // compatible formats need to be defined in WebGPU spec. - WGPUExtent3D dawn_copy_size = AsDawnType(copy_size, device_); + WGPUExtent3D dawn_copy_size = AsDawnType(copy_size); // Extract imageBitmap attributes +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + WGPUOrigin3D origin_in_image_bitmap = + GPUOrigin2DToWGPUOrigin3D(source->origin()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) WGPUOrigin3D origin_in_image_bitmap = GPUOrigin2DToWGPUOrigin3D(&(source->origin())); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) // Validate copy depth if (dawn_copy_size.depthOrArrayLayers > 1) { @@ -579,7 +671,7 @@ exception_state.ThrowTypeError("Failed to copy content from imageBitmap."); return; } -} // namespace blink +} bool GPUQueue::CopyContentFromCPU(StaticBitmapImage* image, const WGPUOrigin3D& origin,
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_bundle_encoder.cc b/third_party/blink/renderer/modules/webgpu/gpu_render_bundle_encoder.cc index cde508d..5221cc34 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_render_bundle_encoder.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_render_bundle_encoder.cc
@@ -48,7 +48,8 @@ MakeGarbageCollected<GPURenderBundleEncoder>( device, device->GetProcs().deviceCreateRenderBundleEncoder( device->GetHandle(), &dawn_desc)); - encoder->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + encoder->setLabel(webgpu_desc->label()); return encoder; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc b/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc index 367a9cf..8835c91 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_render_pipeline.cc
@@ -126,8 +126,10 @@ dawn_state->dawn_desc.nextInChain = nullptr; dawn_state->dawn_desc.topology = AsDawnEnum<WGPUPrimitiveTopology>(webgpu_desc->topology()); - dawn_state->dawn_desc.stripIndexFormat = - AsDawnEnum<WGPUIndexFormat>(webgpu_desc->stripIndexFormat()); + if (webgpu_desc->hasStripIndexFormat()) { + dawn_state->dawn_desc.stripIndexFormat = + AsDawnEnum<WGPUIndexFormat>(webgpu_desc->stripIndexFormat()); + } dawn_state->dawn_desc.frontFace = AsDawnEnum<WGPUFrontFace>(webgpu_desc->frontFace()); dawn_state->dawn_desc.cullMode = @@ -136,7 +138,12 @@ if (webgpu_desc->hasClampDepth()) { auto* clamp_state = &dawn_state->depth_clamping_state; clamp_state->chain.sType = WGPUSType_PrimitiveDepthClampingState; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + clamp_state->clampDepth = webgpu_desc->clampDepth().has_value() && + webgpu_desc->clampDepth().value(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) clamp_state->clampDepth = webgpu_desc->clampDepth(); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_state->dawn_desc.nextInChain = reinterpret_cast<WGPUChainedStruct*>(clamp_state); } @@ -375,7 +382,8 @@ pipeline = MakeGarbageCollected<GPURenderPipeline>( device, device->GetProcs().deviceCreateRenderPipeline2( device->GetHandle(), &dawn_desc_info.dawn_desc)); - pipeline->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + pipeline->setLabel(webgpu_desc->label()); return pipeline; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_sampler.cc b/third_party/blink/renderer/modules/webgpu/gpu_sampler.cc index aebb8e6..785ad6da 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_sampler.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_sampler.cc
@@ -55,7 +55,8 @@ GPUSampler* sampler = MakeGarbageCollected<GPUSampler>( device, device->GetProcs().deviceCreateSampler(device->GetHandle(), &dawn_desc)); - sampler->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + sampler->setLabel(webgpu_desc->label()); return sampler; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc b/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc index 2c448a2..09bbd66 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_module.cc
@@ -32,6 +32,34 @@ std::string label; WGPUShaderModuleDescriptor dawn_desc = {}; +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + const auto* wgsl_or_spirv = webgpu_desc->code(); + switch (wgsl_or_spirv->GetContentType()) { + case V8UnionUSVStringOrUint32Array::ContentType::kUSVString: { + wgsl_code = wgsl_or_spirv->GetAsUSVString().Utf8(); + wgsl_desc.chain.sType = WGPUSType_ShaderModuleWGSLDescriptor; + wgsl_desc.source = wgsl_code.c_str(); + dawn_desc.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&wgsl_desc); + break; + } + case V8UnionUSVStringOrUint32Array::ContentType::kUint32Array: { + NotShared<DOMUint32Array> code = wgsl_or_spirv->GetAsUint32Array(); + uint32_t length_words = 0; + if (!base::CheckedNumeric<uint32_t>(code->length()) + .AssignIfValid(&length_words)) { + exception_state.ThrowRangeError( + "The provided ArrayBuffer exceeds the maximum supported size " + "(4294967295)"); + return nullptr; + } + spirv_desc.chain.sType = WGPUSType_ShaderModuleSPIRVDescriptor; + spirv_desc.code = code->Data(); + spirv_desc.codeSize = length_words; + dawn_desc.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&spirv_desc); + break; + } + } +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) auto wgsl_or_spirv = webgpu_desc->code(); if (wgsl_or_spirv.IsUSVString()) { wgsl_code = wgsl_or_spirv.GetAsUSVString().Utf8(); @@ -57,6 +85,7 @@ spirv_desc.codeSize = length_words; dawn_desc.nextInChain = reinterpret_cast<WGPUChainedStruct*>(&spirv_desc); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) if (webgpu_desc->hasLabel()) { label = webgpu_desc->label().Utf8(); @@ -66,7 +95,8 @@ GPUShaderModule* shader = MakeGarbageCollected<GPUShaderModule>( device, device->GetProcs().deviceCreateShaderModule(device->GetHandle(), &dawn_desc)); - shader->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + shader->setLabel(webgpu_desc->label()); return shader; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc index f5cb122..93d0ae7 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
@@ -38,7 +38,11 @@ dawn_desc.usage = static_cast<WGPUTextureUsage>(webgpu_desc->usage()); dawn_desc.dimension = AsDawnEnum<WGPUTextureDimension>(webgpu_desc->dimension()); +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + dawn_desc.size = AsDawnType(webgpu_desc->size()); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_desc.size = AsDawnType(&webgpu_desc->size(), device); +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) dawn_desc.format = AsDawnEnum<WGPUTextureFormat>(webgpu_desc->format()); dawn_desc.mipLevelCount = webgpu_desc->mipLevelCount(); dawn_desc.sampleCount = webgpu_desc->sampleCount(); @@ -59,9 +63,13 @@ WGPUTextureViewDescriptor dawn_desc = {}; dawn_desc.nextInChain = nullptr; - dawn_desc.format = AsDawnEnum<WGPUTextureFormat>(webgpu_desc->format()); - dawn_desc.dimension = - AsDawnEnum<WGPUTextureViewDimension>(webgpu_desc->dimension()); + if (webgpu_desc->hasFormat()) { + dawn_desc.format = AsDawnEnum<WGPUTextureFormat>(webgpu_desc->format()); + } + if (webgpu_desc->hasDimension()) { + dawn_desc.dimension = + AsDawnEnum<WGPUTextureViewDimension>(webgpu_desc->dimension()); + } dawn_desc.baseMipLevel = webgpu_desc->baseMipLevel(); dawn_desc.mipLevelCount = webgpu_desc->mipLevelCount(); dawn_desc.baseArrayLayer = webgpu_desc->baseArrayLayer(); @@ -112,7 +120,8 @@ device, device->GetProcs().deviceCreateTexture(device->GetHandle(), &dawn_desc), dawn_desc.format, static_cast<WGPUTextureUsage>(dawn_desc.usage)); - texture->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + texture->setLabel(webgpu_desc->label()); return texture; } @@ -329,7 +338,8 @@ WGPUTextureViewDescriptor dawn_desc = AsDawnType(webgpu_desc, &label); GPUTextureView* view = MakeGarbageCollected<GPUTextureView>( device_, GetProcs().textureCreateView(GetHandle(), &dawn_desc)); - view->setLabel(webgpu_desc->label()); + if (webgpu_desc->hasLabel()) + view->setLabel(webgpu_desc->label()); return view; }
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_uncaptured_error_event.cc b/third_party/blink/renderer/modules/webgpu/gpu_uncaptured_error_event.cc index 832ef8e..c2921c8 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_uncaptured_error_event.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_uncaptured_error_event.cc
@@ -21,6 +21,9 @@ const AtomicString& type, const GPUUncapturedErrorEventInit* gpuUncapturedErrorEventInitDict) : Event(type, Bubbles::kNo, Cancelable::kYes) { +#if defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) + error_ = gpuUncapturedErrorEventInitDict->error(); +#else // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) const auto& old_union = gpuUncapturedErrorEventInitDict->error(); if (old_union.IsGPUOutOfMemoryError()) { error_ = @@ -31,6 +34,7 @@ } else { NOTREACHED(); } +#endif // defined(USE_BLINK_V8_BINDING_NEW_IDL_DICTIONARY) } void GPUUncapturedErrorEvent::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/websockets/websocket_common_test.cc b/third_party/blink/renderer/modules/websockets/websocket_common_test.cc index c368c11..ffa1d36 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_common_test.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_common_test.cc
@@ -38,7 +38,7 @@ static_cast<char>(i)) != kValidCharacters + length) { continue; } - char to_check = char{i}; + char to_check = static_cast<char>(i); String s(&to_check, 1u); EXPECT_FALSE(WebSocketCommon::IsValidSubprotocolString(s)); }
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 7238be1..5f62d99 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -2128,6 +2128,7 @@ "media/webaudiosourceprovider_impl_test.cc", "mediastream/media_stream_audio_processor_options_test.cc", "mediastream/media_stream_audio_test.cc", + "mediastream/media_stream_source_test.cc", "mediastream/webrtc_uma_histograms_test.cc", "mhtml/mhtml_parser_test.cc", "mojo/big_string_mojom_traits_test.cc",
diff --git a/third_party/blink/renderer/platform/audio/dynamics_compressor_kernel.cc b/third_party/blink/renderer/platform/audio/dynamics_compressor_kernel.cc index 5e3862d2..25b7760 100644 --- a/third_party/blink/renderer/platform/audio/dynamics_compressor_kernel.cc +++ b/third_party/blink/renderer/platform/audio/dynamics_compressor_kernel.cc
@@ -63,8 +63,8 @@ Reset(); metering_release_k_ = - float{audio_utilities::DiscreteTimeConstantForSampleRate( - kMeteringReleaseTimeConstant, sample_rate)}; + static_cast<float>(audio_utilities::DiscreteTimeConstantForSampleRate( + kMeteringReleaseTimeConstant, sample_rate)); } void DynamicsCompressorKernel::SetNumberOfChannels(
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index 9e1702e0..bd0f7d82 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -258,7 +258,7 @@ // Calling to DidDraw because GetOrCreateResourceProvider created a new // provider and cleared it // TODO crbug/1090081: Check possibility to move DidDraw inside Clear. - DidDraw(FloatRect(0.f, 0.f, size_.Width(), size_.Height())); + DidDraw(); if (IsAccelerated() && !layer_) { layer_ = cc::TextureLayer::CreateForMailbox(this); @@ -637,7 +637,7 @@ return layer_.get(); } -void Canvas2DLayerBridge::DidDraw(const FloatRect& /* rect */) { +void Canvas2DLayerBridge::DidDraw() { if (ResourceProvider() && ResourceProvider()->needs_flush()) FinalizeFrame(); have_recorded_draw_commands_ = true; @@ -669,9 +669,9 @@ rate_limiter_->Tick(); } -void Canvas2DLayerBridge::DoPaintInvalidation(const FloatRect& dirty_rect) { +void Canvas2DLayerBridge::DoPaintInvalidation(const IntRect& dirty_rect) { if (layer_ && raster_mode_ == RasterMode::kGPU) - layer_->SetNeedsDisplayRect(EnclosingIntRect(dirty_rect)); + layer_->SetNeedsDisplayRect(dirty_rect); } scoped_refptr<StaticBitmapImage> Canvas2DLayerBridge::NewImageSnapshot() {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h index 175b8e2..e76cdcd5 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
@@ -89,8 +89,8 @@ void SetIsInHiddenPage(bool); void SetIsBeingDisplayed(bool); void SetFilterQuality(SkFilterQuality filter_quality); - void DidDraw(const FloatRect&); - void DoPaintInvalidation(const FloatRect& dirty_rect); + void DidDraw(); + void DoPaintInvalidation(const IntRect& dirty_rect); cc::Layer* Layer(); bool Restore();
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc index aef5382..5c74435 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge_test.cc
@@ -341,7 +341,7 @@ } void DrawSomething(Canvas2DLayerBridge* bridge) { - bridge->DidDraw(FloatRect(0, 0, 1, 1)); + bridge->DidDraw(); bridge->FinalizeFrame(); // Grabbing an image forces a flush bridge->NewImageSnapshot(); @@ -979,7 +979,7 @@ 5); // Drawline so WritePixels has something to flush bridge->GetPaintCanvas()->drawLine(0, 0, 2, 2, flags); - bridge->DidDraw(FloatRect(0, 0, 1, 1)); + bridge->DidDraw(); // WritePixels flushes recording. Post flush, a new drawing canvas is created // that should have the matrix restored onto it.
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc index bd320ffe..0ffcbd49 100644 --- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc +++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
@@ -197,7 +197,7 @@ avifGetPixelFormatInfo(image->yuvFormat, &format_info); gfx::Point3F pixel; const int max_channel_i = (1 << image->depth) - 1; - const float max_channel = float{max_channel_i}; + const float max_channel = static_cast<float>(max_channel_i); for (uint32_t j = 0; j < image->height; ++j) { const int uv_j = j >> format_info.chromaShiftY;
diff --git a/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder.cc index c2fa20b0..3262a62c 100644 --- a/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder.cc +++ b/third_party/blink/renderer/platform/image-decoders/bmp/bmp_image_decoder.cc
@@ -141,7 +141,8 @@ return false; file_header = fast_reader.GetConsecutiveData(decoded_offset_, kSizeOfFileHeader, buffer); - file_type = (uint16_t{file_header[0]} << 8) | uint8_t{file_header[1]}; + file_type = (static_cast<uint16_t>(file_header[0]) << 8) | + static_cast<uint8_t>(file_header[1]); return true; }
diff --git a/third_party/blink/renderer/platform/media/cdm_session_adapter.cc b/third_party/blink/renderer/platform/media/cdm_session_adapter.cc index ca88441..d5e94ee 100644 --- a/third_party/blink/renderer/platform/media/cdm_session_adapter.cc +++ b/third_party/blink/renderer/platform/media/cdm_session_adapter.cc
@@ -246,14 +246,14 @@ } void CdmSessionAdapter::OnSessionClosed(const std::string& session_id, - CdmSessionClosedReason /*reason*/) { + CdmSessionClosedReason reason) { WebContentDecryptionModuleSessionImpl* session = GetSession(session_id); - DLOG_IF(WARNING, !session) << __func__ << " for unknown session " - << session_id; + DLOG_IF(WARNING, !session) + << __func__ << " for unknown session " << session_id; if (session) { - DVLOG(2) << __func__ << ": session_id = " << session_id; - // TODO(crbug.com/1208618): Plumb `reason` to blink. - session->OnSessionClosed(); + DVLOG(2) << __func__ << ": session_id = " << session_id + << ", reason = " << static_cast<int>(reason); + session->OnSessionClosed(reason); } }
diff --git a/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.cc b/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.cc index 67a8af9..fc742c9 100644 --- a/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.cc +++ b/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.cc
@@ -43,29 +43,7 @@ const char kUpdateSessionUMAName[] = "UpdateSession"; const char kKeyStatusSystemCodeUMAName[] = "KeyStatusSystemCode"; -blink::WebContentDecryptionModuleSession::Client::MessageType -convertMessageType(CdmMessageType message_type) { - switch (message_type) { - case CdmMessageType::LICENSE_REQUEST: - return blink::WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRequest; - case CdmMessageType::LICENSE_RENEWAL: - return blink::WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRenewal; - case CdmMessageType::LICENSE_RELEASE: - return blink::WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRelease; - case CdmMessageType::INDIVIDUALIZATION_REQUEST: - return blink::WebContentDecryptionModuleSession::Client::MessageType:: - kIndividualizationRequest; - } - - NOTREACHED(); - return blink::WebContentDecryptionModuleSession::Client::MessageType:: - kLicenseRequest; -} - -CdmSessionType convertSessionType( +CdmSessionType ConvertSessionType( blink::WebEncryptedMediaSessionType session_type) { switch (session_type) { case blink::WebEncryptedMediaSessionType::kTemporary: @@ -210,7 +188,7 @@ const scoped_refptr<CdmSessionAdapter>& adapter, blink::WebEncryptedMediaSessionType session_type) : adapter_(adapter), - session_type_(convertSessionType(session_type)), + session_type_(ConvertSessionType(session_type)), has_close_been_called_(false), is_closed_(false) {} @@ -430,8 +408,7 @@ const std::vector<uint8_t>& message) { DCHECK(client_) << "Client not set before message event"; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - client_->OnSessionMessage(convertMessageType(message_type), message.data(), - message.size()); + client_->OnSessionMessage(message_type, message.data(), message.size()); } void WebContentDecryptionModuleSessionImpl::OnSessionKeysChange( @@ -466,7 +443,8 @@ : new_expiry_time.ToJsTime()); } -void WebContentDecryptionModuleSessionImpl::OnSessionClosed() { +void WebContentDecryptionModuleSessionImpl::OnSessionClosed( + CdmSessionClosedReason reason) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); // Only send one closed event to blink. @@ -474,7 +452,7 @@ return; is_closed_ = true; - client_->OnSessionClosed(); + client_->OnSessionClosed(reason); } void WebContentDecryptionModuleSessionImpl::OnSessionInitialized(
diff --git a/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.h b/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.h index fd64162..b66454a2 100644 --- a/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.h +++ b/third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.h
@@ -57,7 +57,7 @@ void OnSessionKeysChange(bool has_additional_usable_key, CdmKeysInfo keys_info); void OnSessionExpirationUpdate(base::Time new_expiry_time); - void OnSessionClosed(); + void OnSessionClosed(CdmSessionClosedReason reason); private: // Called when a new session is created or loaded. |status| is set as
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_source.cc b/third_party/blink/renderer/platform/mediastream/media_stream_source.cc index 04d1a34..10f18aa 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_source.cc +++ b/third_party/blink/renderer/platform/mediastream/media_stream_source.cc
@@ -100,39 +100,23 @@ media::SampleFormatToBitsPerChannel(media::kSampleFormatS16); } -class ConsumerWrapper final : public AudioDestinationConsumer { - USING_FAST_MALLOC(ConsumerWrapper); +} // namespace - public: - static ConsumerWrapper* Create(WebAudioDestinationConsumer* consumer) { - return new ConsumerWrapper(consumer); - } +MediaStreamSource::ConsumerWrapper::ConsumerWrapper( + WebAudioDestinationConsumer* consumer) + : consumer_(consumer) { + // To avoid reallocation in ConsumeAudio, reserve initial capacity for most + // common known layouts. + bus_vector_.ReserveInitialCapacity(8); +} - void SetFormat(size_t number_of_channels, float sample_rate) override; - void ConsumeAudio(AudioBus*, size_t number_of_frames) override; - - WebAudioDestinationConsumer* Consumer() { return consumer_; } - - private: - explicit ConsumerWrapper(WebAudioDestinationConsumer* consumer) - : consumer_(consumer) { - // To avoid reallocation in ConsumeAudio, reserve initial capacity for most - // common known layouts. - bus_vector_.ReserveInitialCapacity(8); - } - - // m_consumer is not owned by this class. - WebAudioDestinationConsumer* consumer_; - // bus_vector_ must only be used in ConsumeAudio. The only reason it's a - // member variable is to not have to reallocate it for each call. - Vector<const float*> bus_vector_; -}; - -void ConsumerWrapper::SetFormat(size_t number_of_channels, float sample_rate) { +void MediaStreamSource::ConsumerWrapper::SetFormat(size_t number_of_channels, + float sample_rate) { consumer_->SetFormat(number_of_channels, sample_rate); } -void ConsumerWrapper::ConsumeAudio(AudioBus* bus, size_t number_of_frames) { +void MediaStreamSource::ConsumerWrapper::ConsumeAudio(AudioBus* bus, + size_t number_of_frames) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("mediastream"), "ConsumerWrapper::ConsumeAudio"); @@ -150,8 +134,6 @@ consumer_->ConsumeAudio(bus_vector_, number_of_frames); } -} // namespace - MediaStreamSource::MediaStreamSource(const String& id, StreamType type, const String& name, @@ -245,19 +227,18 @@ void MediaStreamSource::AddAudioConsumer( WebAudioDestinationConsumer* consumer) { DCHECK(requires_consumer_); - auto* consumer_wrapper = ConsumerWrapper::Create(consumer); + auto consumer_wrapper = std::make_unique<ConsumerWrapper>(consumer); MutexLocker locker(audio_consumers_lock_); - audio_consumers_.insert(consumer_wrapper); + audio_consumers_.insert(consumer, std::move(consumer_wrapper)); } bool MediaStreamSource::RemoveAudioConsumer( WebAudioDestinationConsumer* consumer) { DCHECK(requires_consumer_); - auto* consumer_wrapper = ConsumerWrapper::Create(consumer); MutexLocker locker(audio_consumers_lock_); - auto it = audio_consumers_.find(consumer_wrapper); + auto it = audio_consumers_.find(consumer); if (it == audio_consumers_.end()) return false; audio_consumers_.erase(it); @@ -313,7 +294,7 @@ .Utf8()); DCHECK(requires_consumer_); MutexLocker locker(audio_consumers_lock_); - for (AudioDestinationConsumer* consumer : audio_consumers_) + for (auto&& consumer : audio_consumers_.Values()) consumer->SetFormat(number_of_channels, sample_rate); } @@ -323,7 +304,7 @@ DCHECK(requires_consumer_); MutexLocker locker(audio_consumers_lock_); - for (AudioDestinationConsumer* consumer : audio_consumers_) + for (auto&& consumer : audio_consumers_.Values()) consumer->ConsumeAudio(bus, number_of_frames); }
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_source.h b/third_party/blink/renderer/platform/mediastream/media_stream_source.h index cbf6778e..949924c 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_source.h +++ b/third_party/blink/renderer/platform/mediastream/media_stream_source.h
@@ -142,9 +142,6 @@ bool RequiresAudioConsumer() const { return requires_consumer_; } void AddAudioConsumer(WebAudioDestinationConsumer*); bool RemoveAudioConsumer(WebAudioDestinationConsumer*); - const HashSet<AudioDestinationConsumer*>& AudioConsumers() { - return audio_consumers_; - } void OnDeviceCaptureHandleChange(const MediaStreamDevice& device); @@ -153,6 +150,23 @@ void Dispose(); private: + class PLATFORM_EXPORT ConsumerWrapper final + : public AudioDestinationConsumer { + USING_FAST_MALLOC(ConsumerWrapper); + + public: + explicit ConsumerWrapper(WebAudioDestinationConsumer* consumer); + + void SetFormat(size_t number_of_channels, float sample_rate) override; + void ConsumeAudio(AudioBus* bus, size_t number_of_frames) override; + + // m_consumer is not owned by this class. + WebAudioDestinationConsumer* consumer_; + // bus_vector_ must only be used in ConsumeAudio. The only reason it's a + // member variable is to not have to reallocate it for each call. + Vector<const float*> bus_vector_; + }; + String id_; StreamType type_; String name_; @@ -162,8 +176,8 @@ bool requires_consumer_; HeapHashSet<WeakMember<Observer>> observers_; Mutex audio_consumers_lock_; - HashSet<AudioDestinationConsumer*> audio_consumers_ - GUARDED_BY(audio_consumers_lock_); + HashMap<WebAudioDestinationConsumer*, std::unique_ptr<ConsumerWrapper>> + audio_consumers_ GUARDED_BY(audio_consumers_lock_); std::unique_ptr<WebPlatformMediaStreamSource> platform_source_; MediaConstraints constraints_; Capabilities capabilities_;
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_source_test.cc b/third_party/blink/renderer/platform/mediastream/media_stream_source_test.cc new file mode 100644 index 0000000..4b126e3 --- /dev/null +++ b/third_party/blink/renderer/platform/mediastream/media_stream_source_test.cc
@@ -0,0 +1,73 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/platform/mediastream/media_stream_source.h" + +#include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/platform/audio/audio_bus.h" +#include "third_party/blink/renderer/platform/mediastream/webaudio_destination_consumer.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" + +using ::testing::_; +using ::testing::StrictMock; + +namespace blink { + +class MockWebAudioDestinationConsumer : public WebAudioDestinationConsumer { + public: + MOCK_METHOD2(SetFormat, void(size_t, float)); + MOCK_METHOD2(ConsumeAudio, void(const Vector<const float*>&, size_t)); +}; + +class MediaStreamSourceTest : public testing::Test { + public: + void SetUp() override { + source = MakeGarbageCollected<MediaStreamSource>( + String::FromUTF8("audio_id"), MediaStreamSource::kTypeAudio, + String::FromUTF8("audio_track"), false /* remote */, + MediaStreamSource::kReadyStateLive, true /* requires_consumer */); + bus = AudioBus::Create(2, 10); + } + ~MediaStreamSourceTest() override = default; + + protected: + StrictMock<MockWebAudioDestinationConsumer> consumer; + Persistent<MediaStreamSource> source; + scoped_refptr<AudioBus> bus; +}; + +TEST_F(MediaStreamSourceTest, AddAudioConsumer) { + source->AddAudioConsumer(&consumer); + + EXPECT_CALL(consumer, ConsumeAudio(_, 10)); + + source->ConsumeAudio(bus.get(), 10); +} + +TEST_F(MediaStreamSourceTest, AddAudioConsumer_MultipleTimes) { + // Add the same consumer multiple times. + source->AddAudioConsumer(&consumer); + source->AddAudioConsumer(&consumer); + source->AddAudioConsumer(&consumer); + + // Should still only get one call. + EXPECT_CALL(consumer, ConsumeAudio(_, 10)).Times(1); + + source->ConsumeAudio(bus.get(), 10); +} + +TEST_F(MediaStreamSourceTest, RemoveAudioConsumer) { + source->AddAudioConsumer(&consumer); + EXPECT_TRUE(source->RemoveAudioConsumer(&consumer)); + + // The consumer should get no calls. + EXPECT_CALL(consumer, ConsumeAudio(_, 10)).Times(0); + + source->ConsumeAudio(bus.get(), 10); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 7ee985f..8b421a9 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -844,12 +844,8 @@ status: "stable", }, { - name: "EncryptedMediaEncryptionSchemeQuery", - status: "stable", - }, - { - name: "EncryptedMediaHdcpPolicyCheck", - status: "stable", + name: "EncryptedMediaSessionClosedReason", + status: "test", }, { name: "EnterKeyHintAttribute", @@ -1224,10 +1220,6 @@ status: "stable", }, { - name: "ManagedInterface", - "implied_by": ["DeviceAttributes", "ManagedConfiguration"], - }, - { name: "MathMLCore", status:"experimental", depends_on: ["LayoutNG"],
diff --git a/third_party/blink/renderer/platform/weborigin/security_policy.cc b/third_party/blink/renderer/platform/weborigin/security_policy.cc index cd783a4..42210764 100644 --- a/third_party/blink/renderer/platform/weborigin/security_policy.cc +++ b/third_party/blink/renderer/platform/weborigin/security_policy.cc
@@ -92,9 +92,6 @@ if (!referrer_url.IsValid()) return Referrer(Referrer::NoReferrer(), referrer_policy_no_default); - if (SecurityOrigin::ShouldUseInnerURL(url)) - return Referrer(Referrer::NoReferrer(), referrer_policy_no_default); - // 5. Let referrerOrigin be the result of stripping referrerSource for use as // a referrer, with the origin-only flag set to true. KURL referrer_origin = referrer_url;
diff --git a/third_party/blink/renderer/platform/weborigin/security_policy_test.cc b/third_party/blink/renderer/platform/weborigin/security_policy_test.cc index d0d788f..0580698 100644 --- a/third_party/blink/renderer/platform/weborigin/security_policy_test.cc +++ b/third_party/blink/renderer/platform/weborigin/security_policy_test.cc
@@ -147,6 +147,10 @@ kInsecureURLB, kInsecureOriginA}, {network::mojom::ReferrerPolicy::kSameOrigin, kInsecureURLA, kInsecureURLB, nullptr}, + {network::mojom::ReferrerPolicy::kSameOrigin, kInsecureURLB, + kFilesystemURL, nullptr}, + {network::mojom::ReferrerPolicy::kSameOrigin, kInsecureURLB, kBlobURL, + nullptr}, {network::mojom::ReferrerPolicy::kStrictOrigin, kInsecureURLA, kInsecureURLB, kInsecureOriginA}, {network::mojom::ReferrerPolicy::kStrictOriginWhenCrossOrigin, @@ -234,11 +238,11 @@ // blob, filesystem, and invalid URL handling {network::mojom::ReferrerPolicy::kAlways, kInsecureURLA, kBlobURL, - nullptr}, + kInsecureURLA}, {network::mojom::ReferrerPolicy::kAlways, kBlobURL, kInsecureURLA, nullptr}, {network::mojom::ReferrerPolicy::kAlways, kInsecureURLA, kFilesystemURL, - nullptr}, + kInsecureURLA}, {network::mojom::ReferrerPolicy::kAlways, kFilesystemURL, kInsecureURLA, nullptr}, {network::mojom::ReferrerPolicy::kAlways, kInsecureURLA, kInvalidURL,
diff --git a/third_party/blink/tools/blinkpy/common/net/web_mock.py b/third_party/blink/tools/blinkpy/common/net/web_mock.py index bb0671c..85c5074da 100644 --- a/third_party/blink/tools/blinkpy/common/net/web_mock.py +++ b/third_party/blink/tools/blinkpy/common/net/web_mock.py
@@ -26,7 +26,7 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import urllib2 +from six.moves.urllib.error import HTTPError class MockWeb(object): @@ -55,12 +55,12 @@ self._info = MockInfo(values.get('headers', {})) if int(self.status_code) >= 400: - raise urllib2.HTTPError( - url=self.url, - code=self.status_code, - msg='Received error status code: {}'.format(self.status_code), - hdrs={}, - fp=None) + raise HTTPError(url=self.url, + code=self.status_code, + msg='Received error status code: {}'.format( + self.status_code), + hdrs={}, + fp=None) def getcode(self): return self.status_code
diff --git a/third_party/blink/tools/blinkpy/common/read_checksum_from_png_unittest.py b/third_party/blink/tools/blinkpy/common/read_checksum_from_png_unittest.py index 091426d..8e3ea17 100644 --- a/third_party/blink/tools/blinkpy/common/read_checksum_from_png_unittest.py +++ b/third_party/blink/tools/blinkpy/common/read_checksum_from_png_unittest.py
@@ -21,24 +21,25 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import StringIO import unittest from blinkpy.common import read_checksum_from_png +from six import StringIO + class ReadChecksumFromPngTest(unittest.TestCase): def test_read_checksum(self): # pylint: disable=line-too-long # Test a file with the comment. - filehandle = StringIO.StringIO( + filehandle = StringIO( '''\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 \x00\x00\x02X\x08\x02\x00\x00\x00\x15\x14\x15'\x00\x00\x00)tEXtchecksum\x003c4134fe2739880353f91c5b84cadbaaC\xb8?\xec\x00\x00\x16\xfeIDATx\x9c\xed\xdd[\x8cU\xe5\xc1\xff\xf15T\x18\x0ea,)\xa6\x80XZ<\x10\n\xd6H\xc4V\x88}\xb5\xa9\xd6r\xd5\x0bki0\xa6\xb5ih\xd2\xde\x98PHz\xd1\x02=\\q#\x01\x8b\xa5rJ\x8b\x88i\xacM\xc5h\x8cbMk(\x1ez@!\x0c\xd5\xd2\xc2\xb44\x1c\x848\x1dF(\xeb\x7f\xb1\xff\xd9\xef~g\xd6\xde3\xe0o\x10\xec\xe7sa6{\xd6z\xd6\xb3\xd7\xf3\xa8_7\xdbM[Y\x96\x05\x00\x009\xc3\xde\xeb\t\x00\x00\xbc\xdf\x08,\x00\x800\x81\x05\x00\x10&\xb0\x00\x00\xc2\x04\x16\x00@\x98\xc0\x02\x00\x08\x13X\x00\x00a\x02\x0b\x00 Lx01\x00\x84\t,\x00\x800\x81\x05\x00\x10\xd64\xb0\xda\x9a\xdb\xb6m\xdb\xb4i\xd3\xfa\x9fr\xf3\xcd7\x0f\xe5T\x07\xe5\xd4\xa9''' ) checksum = read_checksum_from_png.read_checksum(filehandle) self.assertEqual('3c4134fe2739880353f91c5b84cadbaa', checksum) # Test a file without the comment. - filehandle = StringIO.StringIO( + filehandle = StringIO( '''\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 \x00\x00\x02X\x08\x02\x00\x00\x00\x15\x14\x15'\x00\x00\x16\xfeIDATx\x9c\xed\xdd[\x8cU\xe5\xc1\xff\xf15T\x18\x0ea,)\xa6\x80XZ<\x10\n\xd6H\xc4V\x88}\xb5\xa9\xd6r\xd5\x0bki0\xa6\xb5ih\xd2\xde\x98PHz\xd1\x02=\\q#\x01\x8b\xa5rJ\x8b\x88i\xacM\xc5h\x8cbMk(\x1ez@!\x0c\xd5\xd2\xc2\xb44\x1c\x848\x1dF(\xeb\x7f\xb1\xff\xd9\xef~g\xd6\xde3\xe0o\x10\xec\xe7sa6{\xd6z\xd6\xb3\xd7\xf3\xa8_7\xdbM[Y\x96\x05\x00\x009\xc3\xde\xeb\t\x00\x00\xbc\xdf\x08,\x00\x800\x81\x05\x00\x10&\xb0\x00\x00\xc2\x04\x16\x00@\x98\xc0\x02\x00\x08\x13X\x00\x00a\x02\x0b\x00 Lx01\x00\x84\t,\x00\x800\x81\x05\x00\x10\xd64\xb0\xda\x9a\xdb\xb6m\xdb\xb4i\xd3\xfa\x9fr\xf3\xcd7\x0f\xe5T\x07\xe5\xd4\xa9S\x8b\x17/\x1e?~\xfc\xf8\xf1\xe3\xef\xbf\xff\xfe\xf7z:M5\xbb\x87\x17\xcbUZ\x8f|V\xd7\xbd\x10\xb6\xcd{b\x88\xf6j\xb3\x9b?\x14\x9b\xa1>\xe6\xf9\xd9\xcf\x00\x17\x93''' ) checksum = read_checksum_from_png.read_checksum(filehandle)
diff --git a/third_party/blink/tools/blinkpy/common/system/executive_mock.py b/third_party/blink/tools/blinkpy/common/system/executive_mock.py index 628f0fa..8fbf54c 100644 --- a/third_party/blink/tools/blinkpy/common/system/executive_mock.py +++ b/third_party/blink/tools/blinkpy/common/system/executive_mock.py
@@ -29,19 +29,20 @@ import collections import logging import os -import StringIO from blinkpy.common.system.executive import ScriptError +from six import StringIO + _log = logging.getLogger(__name__) class MockProcess(object): def __init__(self, stdout='MOCK STDOUT\n', stderr='', returncode=0): self.pid = 42 - self.stdout = StringIO.StringIO(stdout) - self.stderr = StringIO.StringIO(stderr) - self.stdin = StringIO.StringIO() + self.stdout = StringIO(stdout) + self.stderr = StringIO(stderr) + self.stdin = StringIO() self.returncode = returncode def wait(self):
diff --git a/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py b/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py index 4313fcc..fb35049e 100644 --- a/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py +++ b/third_party/blink/tools/blinkpy/common/system/filesystem_mock.py
@@ -30,11 +30,12 @@ import hashlib import os import re -import StringIO import unittest from blinkpy.common.system.filesystem import _remove_contents, _sanitize_filename +from six import StringIO + class MockFileSystem(object): # pylint: disable=unused-argument @@ -527,8 +528,8 @@ class ReadableTextFileObject(ReadableBinaryFileObject): def __init__(self, fs, path, data): - super(ReadableTextFileObject, self).__init__( - fs, path, StringIO.StringIO(data.decode('utf-8'))) + super(ReadableTextFileObject, + self).__init__(fs, path, StringIO(data.decode('utf-8'))) def close(self): self.data.close()
diff --git a/third_party/blink/tools/blinkpy/common/system/output_capture.py b/third_party/blink/tools/blinkpy/common/system/output_capture.py index 4dfbf01..ab43592 100644 --- a/third_party/blink/tools/blinkpy/common/system/output_capture.py +++ b/third_party/blink/tools/blinkpy/common/system/output_capture.py
@@ -31,7 +31,7 @@ import logging import sys -from StringIO import StringIO +from six import StringIO class OutputCapture(object):
diff --git a/third_party/blink/tools/blinkpy/common/system/system_host_mock.py b/third_party/blink/tools/blinkpy/common/system/system_host_mock.py index b28baf5..cc983c0 100644 --- a/third_party/blink/tools/blinkpy/common/system/system_host_mock.py +++ b/third_party/blink/tools/blinkpy/common/system/system_host_mock.py
@@ -26,13 +26,13 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from StringIO import StringIO - from blinkpy.common.system.executive_mock import MockExecutive from blinkpy.common.system.filesystem_mock import MockFileSystem from blinkpy.common.system.platform_info_mock import MockPlatformInfo from blinkpy.common.system.user_mock import MockUser +from six import StringIO + class MockSystemHost(object): def __init__(self,
diff --git a/third_party/blink/tools/blinkpy/common/system/user_mock.py b/third_party/blink/tools/blinkpy/common/system/user_mock.py index 53715f5..db682ba 100644 --- a/third_party/blink/tools/blinkpy/common/system/user_mock.py +++ b/third_party/blink/tools/blinkpy/common/system/user_mock.py
@@ -41,14 +41,14 @@ list_title, list_items, can_choose_multiple=False, - raw_input=raw_input): + input_func=input): pass def __init__(self): self.opened_urls = [] self._canned_responses = ['Mock user response'] - def prompt(self, message, repeat=1, raw_input=raw_input): + def prompt(self, message, repeat=1, input_func=input): return self._canned_responses.pop(0) def set_canned_responses(self, responses):
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py index f22f28b..0e72fa8 100644 --- a/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py +++ b/third_party/blink/tools/blinkpy/web_tests/controllers/web_test_finder.py
@@ -203,7 +203,7 @@ @staticmethod def _strip_comments(line): commentIndex = line.find('//') - if commentIndex is -1: + if commentIndex == -1: commentIndex = len(line) line = re.sub(r'\s+', ' ', line[:commentIndex].strip())
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py index a8987d4..8da0582 100644 --- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
@@ -26,7 +26,6 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import StringIO import optparse import unittest @@ -38,6 +37,8 @@ from blinkpy.web_tests.port.base import VirtualTestSuite from blinkpy.web_tests.port.test import WEB_TEST_DIR +from six import StringIO + class FakePort(object): def __init__(self, host, name, path): @@ -486,7 +487,7 @@ self.orig_lint_fn = lint_test_expectations.lint self.orig_check_fn = lint_test_expectations.check_virtual_test_suites lint_test_expectations.check_virtual_test_suites = lambda host, options: [] - self.stderr = StringIO.StringIO() + self.stderr = StringIO() def tearDown(self): lint_test_expectations.lint = self.orig_lint_fn
diff --git a/third_party/blink/tools/blinkpy/web_tests/merge_results_unittest.py b/third_party/blink/tools/blinkpy/web_tests/merge_results_unittest.py index 5d8a8729..b5c5d38 100644 --- a/third_party/blink/tools/blinkpy/web_tests/merge_results_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/merge_results_unittest.py
@@ -10,13 +10,12 @@ import types import unittest -import cStringIO as StringIO - -from collections import OrderedDict - from blinkpy.common.system.filesystem_mock import FileSystemTestCase, MockFileSystem from blinkpy.web_tests import merge_results +from collections import OrderedDict +from six import StringIO + class JSONMergerTests(unittest.TestCase): def test_type_match(self): @@ -625,7 +624,7 @@ self.assertEqual(expected_after, after) def assertDump(self, before, json_data, after): - fd = StringIO.StringIO() + fd = StringIO() merge_results.MergeFilesJSONP.dump_jsonp(fd, before, json_data, after) merged_str = fd.getvalue() self.assertTrue(self.check_before_after(merged_str, before, after)) @@ -644,7 +643,7 @@ return json_str def test_load(self): - fdcls = StringIO.StringIO + fdcls = StringIO self.assertLoad(fdcls('{"a": 1}'), '', {'a': 1}, '') self.assertLoad(fdcls('f({"a": 1});'), 'f(', {'a': 1}, ');') self.assertLoad(fdcls('var o = {"a": 1}'), 'var o = ', {'a': 1}, '')
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py b/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py index dab220fb..0a923a4 100644 --- a/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py
@@ -31,7 +31,6 @@ import json import os import re -import StringIO import sys import unittest @@ -51,6 +50,8 @@ from blinkpy.web_tests.port import test from blinkpy.web_tests.views.printing import Printer +from six import StringIO + import mock # pylint: disable=wrong-import-position @@ -84,7 +85,7 @@ if shared_port: port_obj.host.port_factory.get = lambda *args, **kwargs: port_obj - printer = Printer(host, options, StringIO.StringIO()) + printer = Printer(host, options, StringIO()) run_details = run_web_tests.run(port_obj, options, parsed_args, printer) return run_details.exit_code == 0 @@ -109,7 +110,7 @@ def run_and_capture(port_obj, options, parsed_args, shared_port=True): if shared_port: port_obj.host.port_factory.get = lambda *args, **kwargs: port_obj - logging_stream = StringIO.StringIO() + logging_stream = StringIO() printer = Printer(port_obj.host, options, logging_stream) run_details = run_web_tests.run(port_obj, options, parsed_args, printer) return (run_details, logging_stream) @@ -142,7 +143,7 @@ port_obj = port_obj or host.port_factory.get( port_name=options.platform, options=options) - printer = Printer(host, options, StringIO.StringIO()) + printer = Printer(host, options, StringIO()) run_details = run_web_tests.run(port_obj, options, parsed_args, printer) all_results = [] @@ -183,7 +184,7 @@ '/tmp/json_failing_test_results.json' ], tests_included=True) - logging_stream = StringIO.StringIO() + logging_stream = StringIO() host = MockHost() port_obj = host.port_factory.get(options.platform, options) printer = Printer(host, options, logging_stream) @@ -2216,7 +2217,7 @@ any(path.endswith('-wdiff.html') for path in written_files)) def test_unsupported_platform(self): - stderr = StringIO.StringIO() + stderr = StringIO() res = run_web_tests.main(['--platform', 'foo'], stderr) self.assertEqual(res, exit_codes.UNEXPECTED_ERROR_EXIT_STATUS) @@ -2236,7 +2237,7 @@ host = MockHost() port_obj = host.port_factory.get( port_name=options.platform, options=options) - logging_stream = StringIO.StringIO() + logging_stream = StringIO() printer = Printer(host, options, logging_stream) run_web_tests.run(port_obj, options, parsed_args, printer) self.assertTrue('text.html passed' in logging_stream.getvalue()) @@ -2866,7 +2867,7 @@ def exception_raising_run(port, options, args, printer): assert False - stderr = StringIO.StringIO() + stderr = StringIO() try: run_web_tests.run = interrupting_run res = run_web_tests.main([], stderr)
diff --git a/third_party/blink/tools/blinkpy/web_tests/views/metered_stream_unittest.py b/third_party/blink/tools/blinkpy/web_tests/views/metered_stream_unittest.py index 94680a5..e096943 100644 --- a/third_party/blink/tools/blinkpy/web_tests/views/metered_stream_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/views/metered_stream_unittest.py
@@ -26,20 +26,21 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import StringIO import logging import re import unittest from blinkpy.web_tests.views.metered_stream import MeteredStream +from six import StringIO + class RegularTest(unittest.TestCase): verbose = False isatty = False def setUp(self): - self.stream = StringIO.StringIO() + self.stream = StringIO() self.buflist = self.stream.buflist self.stream.isatty = lambda: self.isatty @@ -65,7 +66,7 @@ def test_logging_not_included(self): # This tests that if we don't hand a logger to the MeteredStream, # nothing is logged. - logging_stream = StringIO.StringIO() + logging_stream = StringIO() handler = logging.StreamHandler(logging_stream) root_logger = logging.getLogger() orig_level = root_logger.level
diff --git a/third_party/blink/tools/blinkpy/web_tests/views/printing_unittest.py b/third_party/blink/tools/blinkpy/web_tests/views/printing_unittest.py index c284d9f..4b5509d 100644 --- a/third_party/blink/tools/blinkpy/web_tests/views/printing_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/views/printing_unittest.py
@@ -28,7 +28,6 @@ """Unit tests for printing.py.""" import optparse -import StringIO import sys import unittest @@ -39,6 +38,8 @@ from blinkpy.web_tests.models.typ_types import ResultType from blinkpy.web_tests.views import printing +from six import StringIO + def get_options(args): print_options = printing.print_options() @@ -96,7 +97,7 @@ host = MockHost() self._port = host.port_factory.get('test', options) - regular_output = StringIO.StringIO() + regular_output = StringIO() printer = printing.Printer(host, options, regular_output) return printer, regular_output
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 5d120df..8e76ee2 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -565,7 +565,6 @@ crbug.com/678346 [ Debug ] fast/dom/shadow/selections-in-shadow.html [ Slow ] crbug.com/678346 [ Mac Debug ] storage/indexeddb/index-cursor.html [ Slow ] crbug.com/678346 [ Win7 Debug ] storage/indexeddb/index-cursor.html [ Slow ] -crbug.com/725542 [ Debug ] editing/selection/doubleclick-beside-cr-span.html [ Slow ] crbug.com/757955 [ Win7 Debug ] http/tests/devtools/sources/debugger-pause/pause-on-elements-panel.js [ Slow ] crbug.com/799619 [ Debug ] http/tests/devtools/profiler/heap-snapshot-inspect-dom-wrapper.js [ Slow ] ###crbug.com/849979 media/video-layer-crash.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 9f55a64..859f0f2 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1650,6 +1650,14 @@ crbug.com/805756 external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Pass Timeout ] crbug.com/666993 [ Debug ] external/wpt/requestidlecallback/callback-idle-periods.html [ Pass Timeout ] +# crbug.com/1218716: These fail when TrustTokenOriginTrial is enabled. +crbug.com/1218716 external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html [ Failure ] +crbug.com/1218716 external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html [ Failure ] +crbug.com/1218716 webexposed/element-instance-property-listing.html [ Failure ] +crbug.com/1218716 webexposed/feature-policy-features.html [ Failure ] +crbug.com/1218716 webexposed/global-interface-listing-dedicated-worker.html [ Failure ] +crbug.com/1218716 webexposed/global-interface-listing-shared-worker.html [ Failure ] +crbug.com/1218716 webexposed/global-interface-listing.html [ Failure ] # crbug.com/1095379: These three time out 100% of the time across all platforms: crbug.com/919789 images/image-click-scale-restore-zoomed-image.html [ Timeout ] @@ -1673,6 +1681,10 @@ crbug.com/1005518 external/wpt/css/css-writing-modes/direction-upright-001.html [ Failure ] crbug.com/1005518 external/wpt/css/css-writing-modes/direction-upright-002.html [ Failure ] +# crbug.com/1218721: These tests fail when libvpx_for_vp8 is enabled. +crbug.com/1218721 fast/borders/border-radius-mask-video-shadow.html [ Failure ] +crbug.com/1218721 fast/borders/border-radius-mask-video.html [ Failure ] + crbug.com/637055 fast/css/outline-offset-large.html [ Skip ] # Either "combo" or split should run: http://testthewebforward.org/docs/css-naming.html @@ -1708,6 +1720,9 @@ crbug.com/377696 printing/setPrinting.html [ Failure ] +# crbug.com/1218723 This test fails when SplitCacheByNetworkIsolationKey is enabled. +crbug.com/1218723 http/tests/devtools/network/network-prefetch.js [ Failure ] + # No support for WPT print-reftests: crbug.com/1090628 external/wpt/infrastructure/reftest/reftest_match-print.html [ Failure ] crbug.com/1090628 external/wpt/infrastructure/reftest/reftest_match_fail-print.html [ Failure ] @@ -1789,6 +1804,10 @@ crbug.com/770028 external/wpt/pointerevents/pointerlock/pointerevent_getPredictedEvents_when_pointerlocked-manual.html [ Skip ] crbug.com/770028 external/wpt/pointerevents/pointerevent_predicted_events_attributes-manual.html [ Skip ] +# crbug.com/1218729 These tests fail when InterestCohortAPIOriginTrial is enabled. +crbug.com/1218729 http/tests/origin_trials/webexposed/interest-cohort-origin-trial-interfaces.html [ Failure ] +crbug.com/1218729 virtual/stable/webexposed/feature-policy-features.html [ Failure ] + # This test relies on racy should_send_resource_timing_info_to_parent() flag being sent between processes. crbug.com/957181 external/wpt/resource-timing/nested-context-navigations-iframe.html [ Pass Failure ] @@ -2486,6 +2505,18 @@ crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Mac11.0 ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/popups/opener-no-openee-yes-same.sub.https.html [ Failure Timeout ] +crbug.com/626703 [ Mac11.0 ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/2-iframes/parent-yes-child1-yes-subdomain-child2-no-port.sub.https.html [ Failure Timeout ] +crbug.com/626703 external/wpt/fetch/api/request/request-bad-port.any.worker.html [ Timeout ] +crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/api/request/request-bad-port.any.worker.html [ Timeout ] +crbug.com/626703 [ Win ] external/wpt/websockets/Create-blocked-port.any.html?wpt_flags=h2 [ Failure Timeout ] +crbug.com/626703 external/wpt/fetch/api/request/request-bad-port.any.sharedworker.html [ Timeout ] +crbug.com/626703 [ Win ] external/wpt/websockets/Create-blocked-port.any.worker.html?wpt_flags=h2 [ Failure Timeout ] +crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/api/request/request-bad-port.any.sharedworker.html [ Timeout ] +crbug.com/626703 external/wpt/fetch/api/request/request-bad-port.any.html [ Timeout ] +crbug.com/626703 virtual/plz-dedicated-worker/external/wpt/fetch/api/request/request-bad-port.any.html [ Timeout ] +crbug.com/626703 external/wpt/css/css-text/tab-size/tab-size-spacing-002.html [ Failure ] +crbug.com/626703 external/wpt/css/css-text/tab-size/tab-size-spacing-003.html [ Failure ] crbug.com/626703 [ Linux ] virtual/layout_ng_svg_text/external/wpt/svg/path/property/mpath.svg [ Failure ] crbug.com/626703 [ Mac10.15 ] virtual/layout_ng_svg_text/external/wpt/svg/path/property/mpath.svg [ Failure ] crbug.com/626703 [ Win10 ] virtual/layout_ng_svg_text/external/wpt/svg/path/property/mpath.svg [ Failure ] @@ -4089,7 +4120,6 @@ crbug.com/1179585 virtual/layout_ng_svg_text/paint/invalidation/svg/text-match-svg.html [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/paint/invalidation/svg/text-rescale.html [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/paint/invalidation/svg/text-viewbox-rescale.html [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/paint/invalidation/svg/transform-text-element.html [ Pass Failure ] crbug.com/1179585 [ Mac ] virtual/layout_ng_svg_text/paint/invalidation/svg/tspan-dynamic-positioning.svg [ Failure ] @@ -4120,7 +4150,6 @@ crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/pointer-events-text.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/pointer-events-text-css-transform.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/svg-root-with-opacity.html [ Pass Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-dom-01-f.svg [ Failure Crash ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-hit-test.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/text-match-highlight.html [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/custom/transformed-outlines.svg [ Failure ] @@ -4193,29 +4222,9 @@ crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-outline-2.html [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/textPathBoundsBug.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/textpath-outline.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-deco-01-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t.svg [ Failure Timeout ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-path-01-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-text-03-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/text-with-geometric-precision.svg [ Skip ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/tspan-multiple-outline.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/text/tspan-multiple-outline-vertical.svg [ Failure ] @@ -4225,7 +4234,6 @@ crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/masking-path-04-b.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-deco-01-b.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-text-03-b.svg [ Failure ] -crbug.com/1179585 virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f.svg [ Failure ] crbug.com/1179585 virtual/layout_ng_svg_text/svg/zoom/page/zoom-zoom-coords.xhtml [ Failure ] # Ignore older OSes during SVGTextNG development crbug.com/1179585 [ Mac10.12 ] virtual/layout_ng_svg_text/* [ Skip ] @@ -5426,9 +5434,6 @@ # Sheriff 2020-01-23 crbug.com/1044505 http/tests/devtools/tracing-session-id.js [ Pass Failure Timeout ] -crbug.com/1045472 external/wpt/WebCryptoAPI/wrapKey_unwrapKey/test_wrapKey_unwrapKey.https.html [ Pass Failure ] -crbug.com/1045472 external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.html [ Pass Failure ] - crbug.com/1046784 http/tests/devtools/oopif/oopif-storage.js [ Pass Failure ] crbug.com/1046784 http/tests/inspector-protocol/service-worker/target-reloaded-after-crash.js [ Pass Failure Timeout ] @@ -6591,7 +6596,6 @@ # Failing css-transforms-2 web platform tests. crbug.com/753080 external/wpt/css/css-transforms/transform3d-sorting-002.html [ Failure ] -crbug.com/753080 external/wpt/css/css-transforms/transform3d-sorting-006.html [ Failure ] external/wpt/css/css-transforms/2d-rotate-001.html [ Failure ] external/wpt/css/css-transforms/css-skew-002.html [ Failure ]
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations index 757131192..31a511f6 100644 --- a/third_party/blink/web_tests/WebGPUExpectations +++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -98,23 +98,17 @@ crbug.com/dawn/812 wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="StencilTest";format="depth24plus-stencil8";* [ Failure Crash Timeout ] # Only on Mac Intel -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="depth32float";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="r8unorm";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="rg8unorm";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="depth32float";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="r8unorm";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="rg8unorm";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="r8unorm";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rg8unorm";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:readMethod="CopyToBuffer";format="depth32float";mipLevelCount=5;layerCount=7;* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:readMethod="CopyToTexture";format="depth32float";mipLevelCount=5;layerCount=7;* [ Failure ] # Only on Mac Intel # Note: On some hardware, "Sample" fails _all_ cases for numerous formats (getting values with a single bit set?). -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:readMethod="Sample";format="r8unorm";mipLevelCount=5;sliceCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:readMethod="Sample";format="rg8unorm";mipLevelCount=5;sliceCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="r8unorm";mipLevelCount=5;sliceCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="rg8unorm";mipLevelCount=5;sliceCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="r8unorm";mipLevelCount=5;sliceCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] -[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="rg8unorm";mipLevelCount=5;sliceCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:readMethod="Sample";format="r8unorm";mipLevelCount=5;layerCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:readMethod="Sample";format="rg8unorm";mipLevelCount=5;layerCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="r8unorm";mipLevelCount=5;layerCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="rg8unorm";mipLevelCount=5;layerCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="r8unorm";mipLevelCount=5;layerCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] +[ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="rg8unorm";mipLevelCount=5;layerCount=1;nonPowerOfTwo=false;uninitializeMethod="StoreOpClear";* [ Failure ] [ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="depth32float";mipLevelCount=5;uninitializeMethod="StoreOpClear";* [ Failure ] [ Mac ] wpt_internal/webgpu/cts.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="depth32float";mipLevelCount=5;uninitializeMethod="StoreOpClear";* [ Failure ] @@ -290,8 +284,8 @@ wpt_internal/webgpu/cts.html?q=webgpu:api,validation,query_set,create:count:* [ Failure Crash ] # Unimplemented validation in Tint. Skipped because it causes test timeouts -crbug.com/tint/480 wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0033:* [ Skip ] -crbug.com/tint/481 wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0038:* [ Skip ] +crbug.com/tint/480 wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:initializer_type:* [ Skip ] +crbug.com/tint/481 wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:io_shareable_type:* [ Skip ] # Validation rules and supported texture format changed for CopyExternalImageToTexture/CopyImageBitmapToTexture crbug.com/1197369 wpt_internal/webgpu/cts.html?q=webgpu:api,validation,queue,copyToTexture,ImageBitmap,* [ Skip ]
diff --git a/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations b/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations index 6453f92..3772473 100644 --- a/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations +++ b/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations
@@ -802,6 +802,10 @@ crbug.com/1050754 external/wpt/external/wpt/css/css-color-adjust/print-color-adjust-parsing.html [ Failure ] crbug.com/1050754 external/wpt/external/wpt/fetch/api/basic/scheme-data.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/external/wpt/fetch/api/basic/stream-safe-creation.any.sharedworker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/fetch/api/request/request-bad-port.any.html [ Timeout ] +crbug.com/1050754 external/wpt/external/wpt/fetch/api/request/request-bad-port.any.sharedworker.html [ Failure ] +crbug.com/1050754 external/wpt/external/wpt/fetch/api/request/request-bad-port.any.worker.html [ Timeout ] +crbug.com/1050754 external/wpt/external/wpt/inert/inert-retargeting-iframe.tentative.html [ Failure ] crbug.com/1050754 external/wpt/external/wpt/infrastructure/server/context.any.serviceworker-module.html [ Failure ] crbug.com/1050754 external/wpt/external/wpt/infrastructure/server/context.any.sharedworker-module.html [ Failure ] crbug.com/1050754 external/wpt/external/wpt/infrastructure/server/context.any.sharedworker.html [ Failure ]
diff --git a/third_party/blink/web_tests/animations/web-animations/keyframe-exceptions.html b/third_party/blink/web_tests/animations/web-animations/keyframe-exceptions.html index f1522da..c561d02 100644 --- a/third_party/blink/web_tests/animations/web-animations/keyframe-exceptions.html +++ b/third_party/blink/web_tests/animations/web-animations/keyframe-exceptions.html
@@ -29,7 +29,7 @@ {offset: 'a donkey'} ]); }, - "Failed to execute 'animate' on 'Element': The provided double value is non-finite." + "Failed to execute 'animate' on 'Element': Failed to read the 'offset' property from 'BaseKeyframe': The provided double value is non-finite." ); assert_throws_with_message('TypeError',
diff --git a/third_party/blink/web_tests/bindings/idl-dictionary-unittest-expected.txt b/third_party/blink/web_tests/bindings/idl-dictionary-unittest-expected.txt index 72b47a1..3404f1c 100644 --- a/third_party/blink/web_tests/bindings/idl-dictionary-unittest-expected.txt +++ b/third_party/blink/web_tests/bindings/idl-dictionary-unittest-expected.txt
@@ -5,7 +5,7 @@ Test for setting an empty dictionary PASS dict.longMember is undefined. PASS dict.longMemberWithDefault is 42 -PASS dict.longOrNullMember is null +PASS dict.longOrNullMember is undefined. PASS dict.longOrNullMemberWithDefault is null PASS dict.booleanMember is undefined. PASS dict.doubleMember is undefined. @@ -16,12 +16,12 @@ PASS dict.usvStringMember is undefined. PASS dict.stringSequenceMember is undefined. PASS dict.stringSequenceMemberWithDefault is [] -PASS dict.stringSequenceOrNullMember is null +PASS dict.stringSequenceOrNullMember is undefined. PASS dict.elementMember is undefined. PASS dict.elementOrNullMember is undefined. PASS dict.enumMember is undefined. PASS dict.enumMemberWithDefault is "foo" -PASS dict.enumOrNullMember is null +PASS dict.enumOrNullMember is undefined. PASS dict.objectMember is undefined. PASS dict.objectOrNullMemberWithDefault is null PASS dict.doubleOrStringMember is undefined. @@ -34,7 +34,7 @@ Test for setting undefined PASS dict.longMember is undefined. PASS dict.longMemberWithDefault is 42 -PASS dict.longOrNullMember is null +PASS dict.longOrNullMember is undefined. PASS dict.longOrNullMemberWithDefault is null PASS dict.booleanMember is undefined. PASS dict.doubleMember is undefined. @@ -45,7 +45,7 @@ PASS dict.stringMemberWithDefault is "defaultStringValue" PASS dict.stringSequenceMember is undefined. PASS dict.stringSequenceMemberWithDefault is [] -PASS dict.stringSequenceOrNullMember is null +PASS dict.stringSequenceOrNullMember is undefined. PASS dict.elementMember is undefined. PASS dict.elementOrNullMember is undefined. PASS dict.objectMember is undefined. @@ -98,9 +98,9 @@ PASS dict.enumOrNullMember is null PASS dict.longMember is undefined. PASS dict.longMemberWithDefault is 0 -PASS dict.longOrNullMember is null +PASS dict.longOrNullMember is undefined. PASS dict.longOrNullMemberWithDefault is null -PASS dictionaryTest.set({enumMember: null}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided value 'null' is not a valid enum value of type InternalEnum.. +PASS dictionaryTest.set({enumMember: null}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'enumMember' property from 'InternalDictionary': The provided value 'null' is not a valid enum value of type InternalEnum.. Test for different values for the any type @@ -116,66 +116,66 @@ Test for setting invalid double value -PASS dictionaryTest.set({doubleMember: NaN}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided double value is non-finite.. -PASS dictionaryTest.set({doubleMember: Infinity}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided double value is non-finite.. -PASS dictionaryTest.set({doubleMember: -Infinity}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided double value is non-finite.. -PASS dictionaryTest.set({doubleMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided double value is non-finite.. +PASS dictionaryTest.set({doubleMember: NaN}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'doubleMember' property from 'InternalDictionary': The provided double value is non-finite.. +PASS dictionaryTest.set({doubleMember: Infinity}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'doubleMember' property from 'InternalDictionary': The provided double value is non-finite.. +PASS dictionaryTest.set({doubleMember: -Infinity}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'doubleMember' property from 'InternalDictionary': The provided double value is non-finite.. +PASS dictionaryTest.set({doubleMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'doubleMember' property from 'InternalDictionary': The provided double value is non-finite.. Test for setting invalid ByteString value -PASS dictionaryTest.set({byteStringMember: 'Ā'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Value is not a valid ByteString.. +PASS dictionaryTest.set({byteStringMember: 'Ā'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'byteStringMember' property from 'InternalDictionary': String contains non ISO-8859-1 code point.. Test for setting invalid USVString value PASS dict.usvStringMember is "_�_�_��_" Test for setting invalid enum value -PASS dictionaryTest.set({enumMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided value 'invalid' is not a valid enum value of type InternalEnum.. +PASS dictionaryTest.set({enumMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'enumMember' property from 'InternalDictionary': The provided value 'invalid' is not a valid enum value of type InternalEnum.. Test for setting invalid enum value in union sequence -PASS dictionaryTest.set({internalEnumOrInternalEnumSequenceMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided value 'invalid' is not a valid enum value of type InternalEnum.. -PASS dictionaryTest.set({internalEnumOrInternalEnumSequenceMember: ['invalid']}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided value 'invalid' is not a valid enum value of type InternalEnum.. +PASS dictionaryTest.set({internalEnumOrInternalEnumSequenceMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'internalEnumOrInternalEnumSequenceMember' property from 'InternalDictionary': The provided value 'invalid' is not a valid enum value of type InternalEnum.. +PASS dictionaryTest.set({internalEnumOrInternalEnumSequenceMember: ['invalid']}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'internalEnumOrInternalEnumSequenceMember' property from 'InternalDictionary': The provided value 'invalid' is not a valid enum value of type InternalEnum.. Test for setting invalid object value -PASS dictionaryTest.set({objectMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to convert value to 'object'.. -PASS dictionaryTest.set({objectMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to convert value to 'object'.. +PASS dictionaryTest.set({objectMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'objectMember' property from 'InternalDictionary': Failed to convert value to 'object'.. +PASS dictionaryTest.set({objectMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'objectMember' property from 'InternalDictionary': Failed to convert value to 'object'.. Test for setting invalid Element value -PASS dictionaryTest.set({elementMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member elementMember is not of type Element.. -PASS dictionaryTest.set({elementMember: testObject1}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member elementMember is not of type Element.. -PASS dictionaryTest.set({elementMember: []}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member elementMember is not of type Element.. -PASS dictionaryTest.set({elementMember: document}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member elementMember is not of type Element.. +PASS dictionaryTest.set({elementMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'elementMember' property from 'InternalDictionary': Failed to convert value to 'Element'.. +PASS dictionaryTest.set({elementMember: testObject1}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'elementMember' property from 'InternalDictionary': Failed to convert value to 'Element'.. +PASS dictionaryTest.set({elementMember: []}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'elementMember' property from 'InternalDictionary': Failed to convert value to 'Element'.. +PASS dictionaryTest.set({elementMember: document}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'elementMember' property from 'InternalDictionary': Failed to convert value to 'Element'.. Test for setting invalid callback function value -PASS dictionaryTest.set({callbackFunctionMember: {}}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member callbackFunctionMember is not a function.. +PASS dictionaryTest.set({callbackFunctionMember: {}}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'callbackFunctionMember' property from 'InternalDictionary': The given value is not a function.. Test for passing invalid dictionary values -PASS dictionaryTest.set(42) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': cannot convert to dictionary.. -PASS dictionaryTest.set('string') threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': cannot convert to dictionary.. +PASS dictionaryTest.set(42) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided value is not of type 'InternalDictionary'.. +PASS dictionaryTest.set('string') threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': The provided value is not of type 'InternalDictionary'.. Test for [Clamp] and [EnforceRange] member PASS dict.longMember is -2147483648 PASS dict.longMemberWithClamp is 2147483647 -PASS dictionaryTest.set({ longMemberWithEnforceRange: 2147483648 }) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Value is outside the 'long' value range.. +PASS dictionaryTest.set({ longMemberWithEnforceRange: 2147483648 }) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'longMemberWithEnforceRange' property from 'InternalDictionary': Value is outside the 'long' value range.. Test for passing EventTarget PASS dict.eventTargetOrNullMember is window PASS dict.eventTargetOrNullMember is null PASS dict.eventTargetOrNullMember is null -PASS dictionaryTest.set({eventTargetOrNullMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget.. -PASS dictionaryTest.set({eventTargetOrNullMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget.. -PASS dictionaryTest.set({eventTargetOrNullMember: []}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget.. -PASS dictionaryTest.set({eventTargetOrNullMember: {}}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': member eventTargetOrNullMember is not of type EventTarget.. +PASS dictionaryTest.set({eventTargetOrNullMember: 'invalid'}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'eventTargetOrNullMember' property from 'InternalDictionary': Failed to convert value to 'EventTarget'.. +PASS dictionaryTest.set({eventTargetOrNullMember: 42}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'eventTargetOrNullMember' property from 'InternalDictionary': Failed to convert value to 'EventTarget'.. +PASS dictionaryTest.set({eventTargetOrNullMember: []}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'eventTargetOrNullMember' property from 'InternalDictionary': Failed to convert value to 'EventTarget'.. +PASS dictionaryTest.set({eventTargetOrNullMember: {}}) threw exception TypeError: Failed to execute 'set' on 'DictionaryTest': Failed to read the 'eventTargetOrNullMember' property from 'InternalDictionary': Failed to convert value to 'EventTarget'.. Test for derived dictionary PASS derived.longMember is undefined. PASS derived.longMemberWithDefault is 42 -PASS derived.longOrNullMember is null +PASS derived.longOrNullMember is undefined. PASS derived.longOrNullMemberWithDefault is null PASS derived.booleanMember is undefined. PASS derived.doubleMember is undefined. @@ -183,12 +183,12 @@ PASS derived.stringMemberWithDefault is "defaultStringValue" PASS derived.stringSequenceMember is undefined. PASS derived.stringSequenceMemberWithDefault is [] -PASS derived.stringSequenceOrNullMember is null +PASS derived.stringSequenceOrNullMember is undefined. PASS derived.elementMember is undefined. PASS derived.elementOrNullMember is undefined. PASS derived.enumMember is undefined. PASS derived.enumMemberWithDefault is "foo" -PASS derived.enumOrNullMember is null +PASS derived.enumOrNullMember is undefined. PASS derived.objectMember is undefined. PASS derived.objectOrNullMemberWithDefault is null PASS derived.derivedStringMember is undefined. @@ -212,8 +212,8 @@ Test for passing invalid values as derived dictionary -PASS dictionaryTest.setDerived({objectMember: 42, requiredBooleanMember: false }) threw exception TypeError: Failed to execute 'setDerived' on 'DictionaryTest': Failed to convert value to 'object'.. -PASS dictionaryTest.setDerived({}) threw exception TypeError: Failed to execute 'setDerived' on 'DictionaryTest': required member requiredBooleanMember is undefined.. +PASS dictionaryTest.setDerived({objectMember: 42, requiredBooleanMember: false }) threw exception TypeError: Failed to execute 'setDerived' on 'DictionaryTest': Failed to read the 'objectMember' property from 'InternalDictionary': Failed to convert value to 'object'.. +PASS dictionaryTest.setDerived({}) threw exception TypeError: Failed to execute 'setDerived' on 'DictionaryTest': Failed to read the 'requiredBooleanMember' property from 'InternalDictionaryDerived': Failed to read the 'requiredBooleanMember' property from 'InternalDictionaryDerived': Required member is undefined.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/bindings/idl-dictionary-unittest.html b/third_party/blink/web_tests/bindings/idl-dictionary-unittest.html index a671d561..b0d3ad54 100644 --- a/third_party/blink/web_tests/bindings/idl-dictionary-unittest.html +++ b/third_party/blink/web_tests/bindings/idl-dictionary-unittest.html
@@ -14,7 +14,7 @@ dict = dictionaryTest.get(); shouldBeUndefined('dict.longMember'); shouldBe('dict.longMemberWithDefault', '42'); - shouldBeNull('dict.longOrNullMember'); + shouldBeUndefined('dict.longOrNullMember'); shouldBeNull('dict.longOrNullMemberWithDefault'); shouldBeUndefined('dict.booleanMember'); shouldBeUndefined('dict.doubleMember'); @@ -25,12 +25,12 @@ shouldBeUndefined('dict.usvStringMember'); shouldBeUndefined('dict.stringSequenceMember'); shouldBe('dict.stringSequenceMemberWithDefault', '[]'); - shouldBeNull('dict.stringSequenceOrNullMember'); + shouldBeUndefined('dict.stringSequenceOrNullMember'); shouldBeUndefined('dict.elementMember'); shouldBeUndefined('dict.elementOrNullMember'); shouldBeUndefined('dict.enumMember'); shouldBeEqualToString('dict.enumMemberWithDefault', 'foo'); - shouldBeNull('dict.enumOrNullMember'); + shouldBeUndefined('dict.enumOrNullMember'); shouldBeUndefined('dict.objectMember'); shouldBeNull('dict.objectOrNullMemberWithDefault'); shouldBeUndefined('dict.doubleOrStringMember'); @@ -45,7 +45,7 @@ dict = dictionaryTest.get(); shouldBeUndefined('dict.longMember'); shouldBe('dict.longMemberWithDefault', '42'); - shouldBeNull('dict.longOrNullMember'); + shouldBeUndefined('dict.longOrNullMember'); shouldBeNull('dict.longOrNullMemberWithDefault'); shouldBeUndefined('dict.booleanMember'); shouldBeUndefined('dict.doubleMember'); @@ -56,7 +56,7 @@ shouldBeEqualToString('dict.stringMemberWithDefault', 'defaultStringValue'); shouldBeUndefined('dict.stringSequenceMember'); shouldBe('dict.stringSequenceMemberWithDefault', '[]'); - shouldBeNull('dict.stringSequenceOrNullMember'); + shouldBeUndefined('dict.stringSequenceOrNullMember'); shouldBeUndefined('dict.elementMember'); shouldBeUndefined('dict.elementOrNullMember'); shouldBeUndefined('dict.objectMember'); @@ -176,7 +176,7 @@ // ToNumber(null) results in 0. shouldBe('dict.longMemberWithDefault', '0'); // Passing undefined shouldn't invoke any conversion. - shouldBeNull('dict.longOrNullMember'); + shouldBeUndefined('dict.longOrNullMember'); // Nullable and its default value is null shouldBeNull('dict.longOrNullMemberWithDefault'); // A non-nullable enum must throw when passed null. @@ -300,7 +300,7 @@ derived = dictionaryTest.getDerived(); shouldBeUndefined('derived.longMember'); shouldBe('derived.longMemberWithDefault', '42'); - shouldBeNull('derived.longOrNullMember'); + shouldBeUndefined('derived.longOrNullMember'); shouldBeNull('derived.longOrNullMemberWithDefault'); shouldBeUndefined('derived.booleanMember'); shouldBeUndefined('derived.doubleMember'); @@ -308,12 +308,12 @@ shouldBeEqualToString('derived.stringMemberWithDefault', 'defaultStringValue'); shouldBeUndefined('derived.stringSequenceMember'); shouldBe('derived.stringSequenceMemberWithDefault', '[]'); - shouldBeNull('derived.stringSequenceOrNullMember'); + shouldBeUndefined('derived.stringSequenceOrNullMember'); shouldBeUndefined('derived.elementMember'); shouldBeUndefined('derived.elementOrNullMember'); shouldBeUndefined('derived.enumMember'); shouldBeEqualToString('derived.enumMemberWithDefault', 'foo'); - shouldBeNull('derived.enumOrNullMember'); + shouldBeUndefined('derived.enumOrNullMember'); shouldBeUndefined('derived.objectMember'); shouldBeNull('derived.objectOrNullMemberWithDefault'); shouldBeUndefined('derived.derivedStringMember');
diff --git a/third_party/blink/web_tests/editing/input/edit-context-dom-mutation.html b/third_party/blink/web_tests/editing/input/edit-context-dom-mutation.html index 8c39c44..013e94c8 100644 --- a/third_party/blink/web_tests/editing/input/edit-context-dom-mutation.html +++ b/third_party/blink/web_tests/editing/input/edit-context-dom-mutation.html
@@ -5,6 +5,51 @@ </head> <body> <script> + test(() => { + let div = document.createElement("div"); + document.body.appendChild(div); + let divText = "Hello World"; + div.innerText = divText; + div.editContext = new EditContext(); + div.focus(); + + let got_delete_by_drag = false; + let got_insert_from_drop = false; + div.addEventListener('beforeinput', (event) => { + if (event.inputType == 'deleteByDrag') { + got_delete_by_drag = true; + } else if (event.inputType == 'insertFromDrop') { + got_insert_from_drop = true; + assert_equals(event.dataTransfer.getData('text/plain'), 'Hello'); + } + }); + + // select 'Hello' + textNode = div.childNodes[0]; + let range = document.createRange(); + range.setStart(textNode, 0); + range.setEnd(textNode, 5); + let selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + // drag 'hello' + x = div.offsetLeft + 10; + y = div.offsetTop + div.offsetHeight / 2; + eventSender.mouseMoveTo(x, y); + eventSender.mouseDown(); + // and drop it off to the right + eventSender.leapForward(500); + eventSender.mouseMoveTo(div.offsetLeft + + div.offsetWidth - 20, y); + eventSender.mouseUp(); + + assert_equals(div.innerText, divText, "DOM shouldn't be modified."); + assert_equals(got_delete_by_drag, true, "The beforeinput event, deleteByDrag, should be fired."); + assert_equals(got_insert_from_drop, true, "The beforeinput event, insertFromDrop, should be fired."); + + document.body.removeChild(div); + }, "EditContext should disable DOM mutation from Drag and Drop"); + let onMacPlatform = navigator.userAgent.search(/\bMac OS X\b/) != -1; if (onMacPlatform) { formatCommands = [{'modifier': 'metaKey', 'key': 'b', 'command': 'formatBold'}, @@ -35,7 +80,7 @@ }); window.getSelection().selectAllChildren(div); - eventSender.keyDown(testcase['key'], [testcase['modifier']]); + eventSender.keyDown(testcase['key'], testcase['modifier']); assert_equals(div.childNodes[0].nodeType, Node.TEXT_NODE, "DOM shouldn't be modified, i.e. no extra <b>, <i> or <u>"); assert_equals(got_before_input_event, true, "The beforeinput event should be fired."); @@ -80,6 +125,7 @@ formatCommands = [{'modifier': 'shiftKey', 'key': 'Insert', 'command': 'insertFromPaste'}]; } else { formatCommands = [{'modifier': 'shiftKey', 'key': 'Insert', 'command': 'insertFromPaste'}, + {'modifier': ['shiftKey', 'ctrlKey'], 'key': 'v', 'command': 'insertFromPaste'}, {'modifier': 'ctrlKey', 'key': 'v', 'command': 'insertFromPaste'}]; } @@ -106,12 +152,36 @@ eventSender.keyDown('c', ['ctrlKey']); window.getSelection().collapse(div); // paste 'abc' at the begining. - eventSender.keyDown(testcase['key'], [testcase['modifier']]); + eventSender.keyDown(testcase['key'], testcase['modifier']); assert_equals(div.innerText, myText, "DOM shouldn't be modified"); assert_equals(got_before_input_event, true, "The beforeinput event should be fired."); document.body.removeChild(div); }, "EditContext should disable DOM mutation from " + testcase['modifier'] + " + " + testcase['key']); }); + + test(() => { + let editContext = new EditContext(); + let div = document.createElement("div"); + document.body.appendChild(div); + let myText = "appla"; + div.innerHTML = myText; + div.editContext = editContext; + div.focus(); + + // The beforeinput event should be fired as usual. + div.addEventListener('beforeinput', (event) => { + assert_equals(event.inputType, 'insertReplacementText'); + assert_equals(event.dataTransfer.getData('text/plain'), 'apple'); + assert_equals(event.getTargetRanges().length, 1); + }); + + let selection = window.getSelection(); + selection.collapse(div, 0); + selection.extend(div, 1); + internals.setMarker(document, selection.getRangeAt(0), 'Spelling'); + internals.replaceMisspelled(document, 'apple'); + assert_equals(div.innerText, myText, "DOM shouldn't be modified"); + }, "EditContext should disable DOM mutation from spellcheck"); </script> </body>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index b45e01e2..f4b92657 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -124,6 +124,15 @@ ] }, "css-backgrounds": { + "animations": { + "background-color-animation-removed-element-crash.html": [ + "f8408fb5a176c74acc8e5ceea0dd9d5e8f135918", + [ + null, + {} + ] + ] + }, "linear-gradient-calc-crash.html": [ "5ae6104a7941b836ab700ca50b5dbe20914afcf6", [ @@ -426,6 +435,13 @@ ] ], "crashtests": { + "multicol-dynamic-contain-crash.html": [ + "e20a6e70e32c911856b2ef44cc4c1e8ac1694d18", + [ + null, + {} + ] + ], "multicol-dynamic-transform-crash.html": [ "993bd1eddd857f07f8a00459bd256068a1f9daa8", [ @@ -1599,6 +1615,13 @@ null, {} ] + ], + "scrollbar-caching-assert.html": [ + "3f972ef70d827f6b5749896e9c3a19a9408b301a", + [ + null, + {} + ] ] } }, @@ -137695,6 +137718,19 @@ {} ] ], + "select-element-001.html": [ + "7f1626ccccdf938b98101db39a5632f9554e1de0", + [ + null, + [ + [ + "/css/css-sizing/aspect-ratio/select-element-001-ref.html", + "==" + ] + ], + {} + ] + ], "table-element-001.html": [ "51daf00957ee4a36ea5564831df4ea365233fa90", [ @@ -146925,6 +146961,32 @@ ], {} ] + ], + "tab-size-spacing-002.html": [ + "01bc6cafad5b9e126076ceaf9587553f677e02b4", + [ + null, + [ + [ + "/css/css-text/tab-size/tab-size-spacing-002-ref.html", + "==" + ] + ], + {} + ] + ], + "tab-size-spacing-003.html": [ + "767cc5924453c98095824490361aa2530910a95d", + [ + null, + [ + [ + "/css/css-text/tab-size/tab-size-spacing-003-ref.html", + "==" + ] + ], + {} + ] ] }, "text-align": { @@ -165680,7 +165742,7 @@ ] ], "transform3d-sorting-006.html": [ - "966549adc5d05b292ddd905654b20edd827eab21", + "bea736fa6710eafac35d472936732b7f45547e35", [ null, [ @@ -165689,7 +165751,23 @@ "==" ] ], - {} + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 100 + ], + [ + 0, + 500 + ] + ] + ] + ] + } ] ], "transform3d-translate3d-001.html": [ @@ -191876,6 +191954,32 @@ ], {} ] + ], + "forced-colors-mode-48.html": [ + "feb3fc0876a3acc90693f1e004c38ece63a1ab46", + [ + null, + [ + [ + "/forced-colors-mode/forced-colors-mode-48-ref.html", + "==" + ] + ], + {} + ] + ], + "forced-colors-mode-49.html": [ + "e96c3790fbb9e4bd37acaa83f5e3fa571da336dc", + [ + null, + [ + [ + "/forced-colors-mode/forced-colors-mode-49-ref.html", + "==" + ] + ], + {} + ] ] }, "html": { @@ -207660,15 +207764,17 @@ [] ] }, - "digest": { - "digest.js": [ - "ea341d36fb6652cfb4618c31f5ddf63a10ab5eb0", - [] - ] - }, "encrypt_decrypt": { "aes.js": [ - "e064353b88a135a422b4685559e205744e7eec23", + "fdeb7963f761e91545373df5846ff4be583deb8a", + [] + ], + "aes_cbc.https.any-expected.txt": [ + "e20dce859db1c7d5ace36eb8142808e811cdb114", + [] + ], + "aes_cbc.https.any.worker-expected.txt": [ + "e20dce859db1c7d5ace36eb8142808e811cdb114", [] ], "aes_cbc.https.worker-expected.txt": [ @@ -207679,6 +207785,14 @@ "96445a96325a557e53438b8f9dfd280d9c694bb6", [] ], + "aes_ctr.https.any-expected.txt": [ + "a91298b2a24a0fbeace0823681eb744a07877ad3", + [] + ], + "aes_ctr.https.any.worker-expected.txt": [ + "a91298b2a24a0fbeace0823681eb744a07877ad3", + [] + ], "aes_ctr.https.worker-expected.txt": [ "09aa98fce3e2f8854c17d8d4e3d46f09f33717f4", [] @@ -207687,6 +207801,14 @@ "201dff83ce9cacbd3f61f6a0b16eeb3105fa9ab2", [] ], + "aes_gcm.https.any-expected.txt": [ + "878a3d1c23f0a4792ddc0b0e67d1d5628acbd7f6", + [] + ], + "aes_gcm.https.any.worker-expected.txt": [ + "878a3d1c23f0a4792ddc0b0e67d1d5628acbd7f6", + [] + ], "aes_gcm.https.worker-expected.txt": [ "697b885c8c69da10529d40fa5a88497f0970863f", [] @@ -207696,7 +207818,7 @@ [] ], "rsa.js": [ - "e9c2265b11ef911ea2866e67c538cc6093c1e9b7", + "5eae06e474564af6721fd2f9e92620b339d7bde2", [] ], "rsa_vectors.js": [ @@ -207827,22 +207949,18 @@ [] ], "import_export": { - "ec_importKey.js": [ - "277851d01012da816e8004c32321685a3847be62", + "symmetric_importKey.https.any-expected.txt": [ + "c864d227f16c940b274671df92b0c3fa945ab44b", [] ], - "rsa_importKey.js": [ - "1d80f1cadbdfbefe0746cf904f6aabae7434c16b", + "symmetric_importKey.https.any.worker-expected.txt": [ + "c864d227f16c940b274671df92b0c3fa945ab44b", [] ], "symmetric_importKey.https.worker-expected.txt": [ "c864d227f16c940b274671df92b0c3fa945ab44b", [] ], - "symmetric_importKey.js": [ - "1221c60c25aa3b337ac0c7a80fe09299d67812c2", - [] - ], "test_symmetric_importKey.https-expected.txt": [ "c864d227f16c940b274671df92b0c3fa945ab44b", [] @@ -207850,7 +207968,7 @@ }, "sign_verify": { "ecdsa.js": [ - "208b81c45ea10fded7f24c7c99b288a914c8fe66", + "6133a7ecba290c8e799ced180ab53af9358f4add", [] ], "ecdsa_vectors.js": [ @@ -207858,7 +207976,7 @@ [] ], "hmac.js": [ - "e8f9ec5815287fc9c2ab0eb039edf806f3a8f613", + "8df4b042f54cf68599b5d59feb8a7794205dc007", [] ], "hmac_vectors.js": [ @@ -207866,7 +207984,7 @@ [] ], "rsa.js": [ - "251f57e8bbcfffa179390fc7efab266393a27f3e", + "7a38089ec36343f312d53ee2621a86c2722dba2f", [] ], "rsa_pkcs_vectors.js": [ @@ -207902,10 +208020,6 @@ "wrapKey_unwrapKey.https.worker-expected.txt": [ "2910210ee2ad454db1dcd26a1b55e2c59ee93f0b", [] - ], - "wrapKey_unwrapKey.js": [ - "8f1a60287c205ef3bd529442d7f706806c2b4bb3", - [] ] } }, @@ -240892,6 +241006,10 @@ [] ] }, + "select-element-001-ref.html": [ + "c3de58e158ebb8eecf2ba7d864c5644e88f73a51", + [] + ], "support": { "100x100-green.png": [ "25b76c3c6f216793a36b1f29287dafd993898c67", @@ -243669,11 +243787,11 @@ [] ], "tab-size-inline-001-ref.html": [ - "36347454947367e8fd4a00825e216ad294a4cc1b", + "0f412e26dfae845e1b08ff06f633289d0436fad9", [] ], "tab-size-inline-002-ref.html": [ - "b595b3f9a5d120af3a521cefc7838cdfb52065d7", + "ade76fea77fbe6c8b32cb4fe88cdc5933c96e24d", [] ], "tab-size-integer-001-ref.html": [ @@ -243691,6 +243809,14 @@ "tab-size-spacing-001-ref.html": [ "2711617476d49f030d45c0a3169412c38c2390e6", [] + ], + "tab-size-spacing-002-ref.html": [ + "65621a0ec1e37d83b6781c405716b39147e9c53a", + [] + ], + "tab-size-spacing-003-ref.html": [ + "b8a7bc105cd8af42d82938dbc63e6d1462b8e6e8", + [] ] }, "text-align": { @@ -261050,6 +261176,14 @@ "827cf86b238a33eb71781936927ba1e94d7f8615", [] ], + "forced-colors-mode-48-ref.html": [ + "53f72c1259e9498f4b9337049455a20f35674d53", + [] + ], + "forced-colors-mode-49-ref.html": [ + "8233a8a635910b23aa587c3cbe8ed947757b023e", + [] + ], "resources": { "float-image.jpg": [ "ab06d5f94d16e22bb08fad79d6fef662b2a7de5a", @@ -271746,6 +271880,10 @@ "bb3dbd31182e91f43c3caa0cb8bb7ffbad485177", [] ], + "iframe-with-object.html": [ + "c983a9d36d10b62e245ccb9377370f7a73511916", + [] + ], "iframe_sandbox_001.htm": [ "051ca5ecd78a17f499d3df76b0bd8f1b6a9dbade", [] @@ -277890,7 +278028,7 @@ ] }, "lint.ignore": [ - "2efb1fc1cd3be4eb8e0a7c6e30dbe9f5ad3a64b2", + "98a303ed12aaae4b32dc6471653db46048063665", [] ], "loading": { @@ -279535,6 +279673,10 @@ "DIR_METADATA": [ "563fa6720ba3a89d6ad8add86cd903465fe456f2", [] + ], + "MediaStreamTrackProcessor-worker.js": [ + "51eaef80a90a6e24fce8cad4fee03e05548e4517", + [] ] }, "mediacapture-record": { @@ -284104,7 +284246,7 @@ [] ], "preflight.py": [ - "168850e2a88dbdc74d07c4813b2ef4e5fd812d7d", + "f0f6017b4729ec19fb90dd7f6dc7b7848301fb72", [] ], "redirect-cors.py": [ @@ -292643,7 +292785,7 @@ [] ], "RTCConfiguration-iceTransportPolicy-expected.txt": [ - "28583e9886a128fe8cbc13418aaa4791ef837682", + "15bb1a064c2bbcd4421ba0866b7a33747c69cda9", [] ], "RTCDTMFSender-helper.js": [ @@ -292718,6 +292860,10 @@ "28c476ec409e1b5f53eae41aff934868abeb692d", [] ], + "RTCPeerConnection-plan-b-is-not-supported-expected.txt": [ + "637f3d231b8bb5def498d7953a6ff76ea7f2f13d", + [] + ], "RTCPeerConnection-restartIce.https-expected.txt": [ "9d4d4969bc5c110c07a8a99e28c2f7b8f15242e8", [] @@ -304785,84 +304931,243 @@ ] }, "digest": { - "digest.https.worker.js": [ - "9b1072e1dd8beec6fd5e0e02d3823b6952f89128", + "digest.https.any.js": [ + "379d9311f30247b85e2e5ea8981d1d180fe783a1", [ - "WebCryptoAPI/digest/digest.https.worker.html", - {} - ] - ], - "test_digest.https.html": [ - "e6e7aab13d1d3d63177e2c6525cabcfbec1ce85f", - [ - null, + "WebCryptoAPI/digest/digest.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: digest()" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/digest/digest.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: digest()" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ] }, "encrypt_decrypt": { - "aes_cbc.https.worker.js": [ - "c0c0395fc324d1a56371bf58baeca755648a6f07", + "aes_cbc.https.any.js": [ + "35637a46affc05938098d3cf769583c22fb66547", [ - "WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.html", - {} - ] - ], - "aes_ctr.https.worker.js": [ - "6577525ee21213542b07cb7e1b0a803fd5a23913", - [ - "WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.html", - {} - ] - ], - "aes_gcm.https.worker.js": [ - "7a14b69a752e43ed7a9e249c4472333a05d0f1ba", - [ - "WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.html", - {} - ] - ], - "rsa.https.worker.js": [ - "b0163262af9e2ba023ca808f918c74cf22b24b18", - [ - "WebCryptoAPI/encrypt_decrypt/rsa.https.worker.html", - {} - ] - ], - "test_aes_cbc.https.html": [ - "7a2805d38740ca9385f8e2b163711a10e62b9818", - [ - null, + "WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using AES-CBC" + ], + [ + "script", + "aes_cbc_vectors.js" + ], + [ + "script", + "aes.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using AES-CBC" + ], + [ + "script", + "aes_cbc_vectors.js" + ], + [ + "script", + "aes.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ], - "test_aes_ctr.https.html": [ - "a48dfd3fd1761f2951a09edb494c241b765d7251", + "aes_ctr.https.any.js": [ + "9f0c66900e9f3dace2e48ee7e106f81a6d40588a", [ - null, + "WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using AES-CTR" + ], + [ + "script", + "aes_ctr_vectors.js" + ], + [ + "script", + "aes.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using AES-CTR" + ], + [ + "script", + "aes_ctr_vectors.js" + ], + [ + "script", + "aes.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ], - "test_aes_gcm.https.html": [ - "9f8b8bdf9ddbfc7ecd62197ab030b04659ca43e9", + "aes_gcm.https.any.js": [ + "8f1103d8f4a483a93259e1f91541ec4bba1647c7", [ - null, + "WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using AES-GCM" + ], + [ + "script", + "aes_gcm_vectors.js" + ], + [ + "script", + "aes.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using AES-GCM" + ], + [ + "script", + "aes_gcm_vectors.js" + ], + [ + "script", + "aes.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ], - "test_rsa_oaep.https.html": [ - "df8d8f42aa72f78b02d8afe7c4dfdd0ca9b86a05", + "rsa_oaep.https.any.js": [ + "20fd17c5710b49400e8390315db00d10218b180d", [ - null, + "WebCryptoAPI/encrypt_decrypt/rsa_oaep.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using RSA-OAEP" + ], + [ + "script", + "rsa_vectors.js" + ], + [ + "script", + "rsa.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/encrypt_decrypt/rsa_oaep.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: encrypt() Using RSA-OAEP" + ], + [ + "script", + "rsa_vectors.js" + ], + [ + "script", + "rsa.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] @@ -309541,46 +309846,109 @@ ] ], "import_export": { - "ec_importKey.https.worker.js": [ - "698df52e9d30544ad46eb6c40b206806c2e318dc", + "ec_importKey.https.any.js": [ + "628d81ef500f2473d2f153152774cf9c4e0b60c6", [ - "WebCryptoAPI/import_export/ec_importKey.https.worker.html", - {} + "WebCryptoAPI/import_export/ec_importKey.https.any.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: importKey() for EC keys" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/import_export/ec_importKey.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: importKey() for EC keys" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } ] ], - "rsa_importKey.https.worker.js": [ - "3b2435be0104e64c627956478c5e0565f95c21b1", + "rsa_importKey.https.any.js": [ + "9f9d38a9554be98f256e6f6d30642242185e29b8", [ - "WebCryptoAPI/import_export/rsa_importKey.https.worker.html", - {} + "WebCryptoAPI/import_export/rsa_importKey.https.any.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: importKey() for RSA keys" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/import_export/rsa_importKey.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: importKey() for RSA keys" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } ] ], - "symmetric_importKey.https.worker.js": [ - "bedd082da49003e05439a26427287e9214da5085", + "symmetric_importKey.https.any.js": [ + "3d76daac1e28a1369c5046effd2b4fa951766963", [ - "WebCryptoAPI/import_export/symmetric_importKey.https.worker.html", - {} - ] - ], - "test_ec_importKey.https.html": [ - "54eea40951142a789fc3a353dd3eaaa9ffd96dfd", + "WebCryptoAPI/import_export/symmetric_importKey.https.any.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: importKey() for symmetric keys" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], [ - null, - {} - ] - ], - "test_rsa_importKey.https.html": [ - "219ad2d3bc51c7622850962bb7c554eec0dbf703", - [ - null, - {} - ] - ], - "test_symmetric_importKey.https.html": [ - "e82c4d78f6baf44d5abeeafeb5a439508a65eaaf", - [ - null, - {} + "WebCryptoAPI/import_export/symmetric_importKey.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: importKey() for symmetric keys" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } ] ] }, @@ -309605,88 +309973,239 @@ ] }, "sign_verify": { - "ecdsa.https.worker.js": [ - "f379d466784987a520b598d4cababcf02b0ce237", + "ecdsa.https.any.js": [ + "9764cc33540c08768bbf06ead24d399f90e1b7d6", [ - "WebCryptoAPI/sign_verify/ecdsa.https.worker.html", - {} - ] - ], - "hmac.https.worker.js": [ - "79d8f21d7307b84fec3ef0b4dfb1d7364c8b312a", - [ - "WebCryptoAPI/sign_verify/hmac.https.worker.html", - {} - ] - ], - "rsa_pkcs.https.worker.js": [ - "6b4dbee7987d968799886d42e1cfec4e8fcc2070", - [ - "WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.html", - {} - ] - ], - "rsa_pss.https.worker.js": [ - "fdf7b998d95eac4f4c72b01eef4e21eb6bd28aca", - [ - "WebCryptoAPI/sign_verify/rsa_pss.https.worker.html", - {} - ] - ], - "test_ecdsa.https.html": [ - "5f121f1acdc4e4d1ef6b53bc0d71be3ad03ef0a7", - [ - null, + "WebCryptoAPI/sign_verify/ecdsa.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using ECDSA" + ], + [ + "script", + "ecdsa_vectors.js" + ], + [ + "script", + "ecdsa.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/sign_verify/ecdsa.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using ECDSA" + ], + [ + "script", + "ecdsa_vectors.js" + ], + [ + "script", + "ecdsa.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ], - "test_hmac.https.html": [ - "6d5ff926f38f1329b7eebb3a2ee5d0aa40282315", + "hmac.https.any.js": [ + "419bab0506995e0d26d20b5b14c13e6b944a0574", [ - null, + "WebCryptoAPI/sign_verify/hmac.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using HMAC" + ], + [ + "script", + "hmac_vectors.js" + ], + [ + "script", + "hmac.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/sign_verify/hmac.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using HMAC" + ], + [ + "script", + "hmac_vectors.js" + ], + [ + "script", + "hmac.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ], - "test_rsa_pkcs.https.html": [ - "de428c0fc7ea6f486339e661570a5d9bb870fe0a", + "rsa_pkcs.https.any.js": [ + "d930a715ac6babe017ffdfb11c39c6f93572e372", [ - null, + "WebCryptoAPI/sign_verify/rsa_pkcs.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using RSASSA-PKCS1-v1_5" + ], + [ + "script", + "rsa_pkcs_vectors.js" + ], + [ + "script", + "rsa.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/sign_verify/rsa_pkcs.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using RSASSA-PKCS1-v1_5" + ], + [ + "script", + "rsa_pkcs_vectors.js" + ], + [ + "script", + "rsa.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ], - "test_rsa_pss.https.html": [ - "3a2034feb4ac759f62f23c6482f4ea7f33ba6fa9", + "rsa_pss.https.any.js": [ + "f02ba2096b710ec9f5f36f2178a6a43f59226bff", [ - null, + "WebCryptoAPI/sign_verify/rsa_pss.https.any.html", { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using RSA-PSS" + ], + [ + "script", + "rsa_pss_vectors.js" + ], + [ + "script", + "rsa.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/sign_verify/rsa_pss.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: sign() and verify() Using RSA-PSS" + ], + [ + "script", + "rsa_pss_vectors.js" + ], + [ + "script", + "rsa.js" + ], + [ + "timeout", + "long" + ] + ], "timeout": "long" } ] ] }, "wrapKey_unwrapKey": { - "test_wrapKey_unwrapKey.https.html": [ - "337e0780e5614c76503debbf26dbc05f80d47c5c", + "wrapKey_unwrapKey.https.any.js": [ + "f7e135c8532e14b0ac49071ffe54fdf26acc197e", [ - null, - { - "timeout": "long" - } - ] - ], - "wrapKey_unwrapKey.https.worker.js": [ - "4cf813ba5bf70caf0114466721b95e1d14417d66", - [ - "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.html", + "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.html", { "script_metadata": [ [ + "title", + "WebCryptoAPI: wrapKey() and unwrapKey()" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.worker.html", + { + "script_metadata": [ + [ + "title", + "WebCryptoAPI: wrapKey() and unwrapKey()" + ], + [ "timeout", "long" ] @@ -376619,7 +377138,7 @@ ] }, "request-bad-port.any.js": [ - "0981b0f63e36a1a48cbf68db21f9195f2baf16dd", + "b0684d4be0f83fd52d67bae373b37dfc3df7714d", [ "fetch/api/request/request-bad-port.any.html", { @@ -414546,6 +415065,13 @@ {} ] ], + "iframe-display-none-with-object.html": [ + "ee739532173a1ce2755364e8781b302e6e3f9756", + [ + null, + {} + ] + ], "iframe-first-load-canceled-second-load-blank.html": [ "bed3b6477f5889ece11524b57969921313e5fcb0", [ @@ -415489,7 +416015,7 @@ ] ], "not-rendered-image-loading-lazy.html": [ - "5f7da1a84653d60022538ab8426e0eb0eb9e0bc8", + "25aaedb2b2eb3f22c753797bc3228734c251cd0c", [ null, {} @@ -415689,6 +416215,13 @@ {} ] ], + "object-in-display-none-load-event.html": [ + "c8369365af0bb241ff66db733bf75440781996b9", + [ + null, + {} + ] + ], "object-in-object-fallback-2.html": [ "47cf8016935d22a1ad92734bf0a2db21ace4a81c", [ @@ -426334,7 +426867,7 @@ ] ], "inert-retargeting-iframe.tentative.html": [ - "ddcb3ccb0d2c851fe3f1d07169de839465d12354", + "d363adc20bc9411945f50c82e29df038453f0193", [ null, { @@ -431603,7 +432136,14 @@ ] ], "MediaStreamTrackProcessor-audio.https.html": [ - "516f267b161cff26abc8f1e50f72c305b5194e6b", + "6463de5ca2acfba63f02dc9b147e09d080debeea", + [ + null, + {} + ] + ], + "MediaStreamTrackProcessor-video.https.html": [ + "5fe4e044e859f7c8ecf7f916bbd4d0efee03ba60", [ null, {} @@ -453752,7 +454292,7 @@ ] ], "cors-preflight.any.js": [ - "5bbf3d2a2345ed4a5202d64b241468614352b0a8", + "4b980e7d0af89e2e6f636b7e23a173e4305f073c", [ "resource-timing/cors-preflight.any.html", { @@ -480193,7 +480733,7 @@ ] ], "createcredential-badargs-rp.https.html": [ - "fa4d2264fefe8be7da1de8ecefeeb60da27511e0", + "6ddd715306d119b0864ea0b57d16205c137595ac", [ null, { @@ -482657,6 +483197,15 @@ } ] ], + "RTCPeerConnection-plan-b-is-not-supported.html": [ + "bde6b1b003a416e7732a060f9f5a83ff4460886c", + [ + null, + { + "timeout": "long" + } + ] + ], "RTCPeerConnection-relay-canvas.https.html": [ "6e9cd068220d6f0ec2a8a77e215a40702f91ee75", [ @@ -486108,7 +486657,7 @@ ] ], "Create-blocked-port.any.js": [ - "4e5af19794f5a78f18301644c53b9bfdedc439bc", + "c670009b25d4237bfc56955b5f85ca80ac830b62", [ "websockets/Create-blocked-port.any.html", {
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.https.any.js similarity index 98% rename from third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.js rename to third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.https.any.js index ea341d36..379d9311 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.https.any.js
@@ -1,5 +1,6 @@ +// META: title=WebCryptoAPI: digest() +// META: timeout=long -function run_test() { var subtle = crypto.subtle; // Change to test prefixed implementations var sourceData = { @@ -149,6 +150,3 @@ return true; } - - return; -}
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.https.worker.js deleted file mode 100644 index 9b1072e..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/digest.https.worker.js +++ /dev/null
@@ -1,4 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("digest.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/test_digest.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/test_digest.https.html deleted file mode 100644 index e6e7aab..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/digest/test_digest.https.html +++ /dev/null
@@ -1,17 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: digest()</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#dfn-SubtleCrypto-method-digest"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="digest.js"></script> - -<h1>encrypt Tests for digest method</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes.js index e064353..fdeb796 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes.js
@@ -267,9 +267,11 @@ all_promises.push(promise); }); - Promise.all(all_promises) - .then(function() {done();}) - .catch(function() {done();}) + promise_test(function() { + return Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + }, "setup"); // A test vector has all needed fields for encryption, EXCEPT that the // key field may be null. This function replaces that null with the Correct
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any-expected.txt new file mode 100644 index 0000000..e20dce85 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any-expected.txt
@@ -0,0 +1,46 @@ +This is a testharness.js-based test. +PASS setup +PASS AES-CBC 128-bit key +FAIL importKey step: AES-CBC 192-bit key assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key +PASS AES-CBC 128-bit key with altered plaintext +FAIL importKey step: AES-CBC 192-bit key with altered plaintext assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key with altered plaintext +PASS AES-CBC 128-bit key decryption +FAIL importKey step for decryption: AES-CBC 192-bit key assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key decryption +PASS AES-CBC 128-bit key decryption with altered ciphertext +FAIL importKey step for decryption: AES-CBC 192-bit key with altered ciphertext assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key decryption with altered ciphertext +PASS AES-CBC 128-bit key without encrypt usage +FAIL importKey step: AES-CBC 192-bit key without encrypt usage assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key without encrypt usage +PASS AES-CBC 128-bit key with mismatched key and algorithm +FAIL importKey step: AES-CBC 192-bit key with mismatched key and algorithm assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key with mismatched key and algorithm +PASS AES-CBC 128-bit key without decrypt usage +FAIL importKey step: AES-CBC 192-bit key without decrypt usage assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key without decrypt usage +PASS AES-CBC 128-bit key, 64-bit IV +PASS AES-CBC 128-bit key, 192-bit IV +FAIL importKey step: AES-CBC 192-bit key, 64-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 64-bit IV Reached unreachable code +FAIL importKey step: AES-CBC 192-bit key, 192-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 192-bit IV Reached unreachable code +PASS AES-CBC 256-bit key, 64-bit IV +PASS AES-CBC 256-bit key, 192-bit IV +PASS AES-CBC 128-bit key, 64-bit IV decryption +PASS AES-CBC 128-bit key, 192-bit IV decryption +FAIL importKey step: decryption AES-CBC 192-bit key, 64-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 64-bit IV Reached unreachable code +FAIL importKey step: decryption AES-CBC 192-bit key, 192-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 192-bit IV Reached unreachable code +PASS AES-CBC 256-bit key, 64-bit IV decryption +PASS AES-CBC 256-bit key, 192-bit IV decryption +PASS AES-CBC 128-bit key, zeroPadChar +PASS AES-CBC 128-bit key, bigPadChar +PASS AES-CBC 128-bit key, inconsistentPadChars +FAIL importKey step: decryption AES-CBC 192-bit key, zeroPadChar assert_unreached: importKey failed for AES-CBC 192-bit key, zeroPadChar Reached unreachable code +FAIL importKey step: decryption AES-CBC 192-bit key, bigPadChar assert_unreached: importKey failed for AES-CBC 192-bit key, bigPadChar Reached unreachable code +FAIL importKey step: decryption AES-CBC 192-bit key, inconsistentPadChars assert_unreached: importKey failed for AES-CBC 192-bit key, inconsistentPadChars Reached unreachable code +PASS AES-CBC 256-bit key, zeroPadChar +PASS AES-CBC 256-bit key, bigPadChar +PASS AES-CBC 256-bit key, inconsistentPadChars +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.js new file mode 100644 index 0000000..35637a4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: encrypt() Using AES-CBC +// META: script=aes_cbc_vectors.js +// META: script=aes.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.worker-expected.txt new file mode 100644 index 0000000..e20dce85 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.any.worker-expected.txt
@@ -0,0 +1,46 @@ +This is a testharness.js-based test. +PASS setup +PASS AES-CBC 128-bit key +FAIL importKey step: AES-CBC 192-bit key assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key +PASS AES-CBC 128-bit key with altered plaintext +FAIL importKey step: AES-CBC 192-bit key with altered plaintext assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key with altered plaintext +PASS AES-CBC 128-bit key decryption +FAIL importKey step for decryption: AES-CBC 192-bit key assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key decryption +PASS AES-CBC 128-bit key decryption with altered ciphertext +FAIL importKey step for decryption: AES-CBC 192-bit key with altered ciphertext assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key decryption with altered ciphertext +PASS AES-CBC 128-bit key without encrypt usage +FAIL importKey step: AES-CBC 192-bit key without encrypt usage assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key without encrypt usage +PASS AES-CBC 128-bit key with mismatched key and algorithm +FAIL importKey step: AES-CBC 192-bit key with mismatched key and algorithm assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key with mismatched key and algorithm +PASS AES-CBC 128-bit key without decrypt usage +FAIL importKey step: AES-CBC 192-bit key without decrypt usage assert_unreached: importKey failed for AES-CBC 192-bit key Reached unreachable code +PASS AES-CBC 256-bit key without decrypt usage +PASS AES-CBC 128-bit key, 64-bit IV +PASS AES-CBC 128-bit key, 192-bit IV +FAIL importKey step: AES-CBC 192-bit key, 64-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 64-bit IV Reached unreachable code +FAIL importKey step: AES-CBC 192-bit key, 192-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 192-bit IV Reached unreachable code +PASS AES-CBC 256-bit key, 64-bit IV +PASS AES-CBC 256-bit key, 192-bit IV +PASS AES-CBC 128-bit key, 64-bit IV decryption +PASS AES-CBC 128-bit key, 192-bit IV decryption +FAIL importKey step: decryption AES-CBC 192-bit key, 64-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 64-bit IV Reached unreachable code +FAIL importKey step: decryption AES-CBC 192-bit key, 192-bit IV assert_unreached: importKey failed for AES-CBC 192-bit key, 192-bit IV Reached unreachable code +PASS AES-CBC 256-bit key, 64-bit IV decryption +PASS AES-CBC 256-bit key, 192-bit IV decryption +PASS AES-CBC 128-bit key, zeroPadChar +PASS AES-CBC 128-bit key, bigPadChar +PASS AES-CBC 128-bit key, inconsistentPadChars +FAIL importKey step: decryption AES-CBC 192-bit key, zeroPadChar assert_unreached: importKey failed for AES-CBC 192-bit key, zeroPadChar Reached unreachable code +FAIL importKey step: decryption AES-CBC 192-bit key, bigPadChar assert_unreached: importKey failed for AES-CBC 192-bit key, bigPadChar Reached unreachable code +FAIL importKey step: decryption AES-CBC 192-bit key, inconsistentPadChars assert_unreached: importKey failed for AES-CBC 192-bit key, inconsistentPadChars Reached unreachable code +PASS AES-CBC 256-bit key, zeroPadChar +PASS AES-CBC 256-bit key, bigPadChar +PASS AES-CBC 256-bit key, inconsistentPadChars +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js deleted file mode 100644 index c0c0395..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_cbc.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("aes_cbc_vectors.js"); -importScripts("aes.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any-expected.txt new file mode 100644 index 0000000..a91298b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any-expected.txt
@@ -0,0 +1,37 @@ +This is a testharness.js-based test. +PASS setup +PASS AES-CTR 128-bit key +FAIL importKey step: AES-CTR 192-bit key assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key +PASS AES-CTR 128-bit key with altered plaintext +FAIL importKey step: AES-CTR 192-bit key with altered plaintext assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key with altered plaintext +PASS AES-CTR 128-bit key decryption +FAIL importKey step for decryption: AES-CTR 192-bit key assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key decryption +PASS AES-CTR 128-bit key decryption with altered ciphertext +FAIL importKey step for decryption: AES-CTR 192-bit key with altered ciphertext assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key decryption with altered ciphertext +PASS AES-CTR 128-bit key without encrypt usage +FAIL importKey step: AES-CTR 192-bit key without encrypt usage assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key without encrypt usage +PASS AES-CTR 128-bit key with mismatched key and algorithm +FAIL importKey step: AES-CTR 192-bit key with mismatched key and algorithm assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key with mismatched key and algorithm +PASS AES-CTR 128-bit key without decrypt usage +FAIL importKey step: AES-CTR 192-bit key without decrypt usage assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key without decrypt usage +PASS AES-CTR 128-bit key, 0-bit counter +PASS AES-CTR 128-bit key, 129-bit counter +FAIL importKey step: AES-CTR 192-bit key, 0-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 0-bit counter Reached unreachable code +FAIL importKey step: AES-CTR 192-bit key, 129-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 129-bit counter Reached unreachable code +PASS AES-CTR 256-bit key, 0-bit counter +PASS AES-CTR 256-bit key, 129-bit counter +PASS AES-CTR 128-bit key, 0-bit counter decryption +PASS AES-CTR 128-bit key, 129-bit counter decryption +FAIL importKey step: decryption AES-CTR 192-bit key, 0-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 0-bit counter Reached unreachable code +FAIL importKey step: decryption AES-CTR 192-bit key, 129-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 129-bit counter Reached unreachable code +PASS AES-CTR 256-bit key, 0-bit counter decryption +PASS AES-CTR 256-bit key, 129-bit counter decryption +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.js new file mode 100644 index 0000000..9f0c6690 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: encrypt() Using AES-CTR +// META: script=aes_ctr_vectors.js +// META: script=aes.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.worker-expected.txt new file mode 100644 index 0000000..a91298b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.any.worker-expected.txt
@@ -0,0 +1,37 @@ +This is a testharness.js-based test. +PASS setup +PASS AES-CTR 128-bit key +FAIL importKey step: AES-CTR 192-bit key assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key +PASS AES-CTR 128-bit key with altered plaintext +FAIL importKey step: AES-CTR 192-bit key with altered plaintext assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key with altered plaintext +PASS AES-CTR 128-bit key decryption +FAIL importKey step for decryption: AES-CTR 192-bit key assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key decryption +PASS AES-CTR 128-bit key decryption with altered ciphertext +FAIL importKey step for decryption: AES-CTR 192-bit key with altered ciphertext assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key decryption with altered ciphertext +PASS AES-CTR 128-bit key without encrypt usage +FAIL importKey step: AES-CTR 192-bit key without encrypt usage assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key without encrypt usage +PASS AES-CTR 128-bit key with mismatched key and algorithm +FAIL importKey step: AES-CTR 192-bit key with mismatched key and algorithm assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key with mismatched key and algorithm +PASS AES-CTR 128-bit key without decrypt usage +FAIL importKey step: AES-CTR 192-bit key without decrypt usage assert_unreached: importKey failed for AES-CTR 192-bit key Reached unreachable code +PASS AES-CTR 256-bit key without decrypt usage +PASS AES-CTR 128-bit key, 0-bit counter +PASS AES-CTR 128-bit key, 129-bit counter +FAIL importKey step: AES-CTR 192-bit key, 0-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 0-bit counter Reached unreachable code +FAIL importKey step: AES-CTR 192-bit key, 129-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 129-bit counter Reached unreachable code +PASS AES-CTR 256-bit key, 0-bit counter +PASS AES-CTR 256-bit key, 129-bit counter +PASS AES-CTR 128-bit key, 0-bit counter decryption +PASS AES-CTR 128-bit key, 129-bit counter decryption +FAIL importKey step: decryption AES-CTR 192-bit key, 0-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 0-bit counter Reached unreachable code +FAIL importKey step: decryption AES-CTR 192-bit key, 129-bit counter assert_unreached: importKey failed for AES-CTR 192-bit key, 129-bit counter Reached unreachable code +PASS AES-CTR 256-bit key, 0-bit counter decryption +PASS AES-CTR 256-bit key, 129-bit counter decryption +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js deleted file mode 100644 index 6577525..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_ctr.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("aes_ctr_vectors.js"); -importScripts("aes.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any-expected.txt new file mode 100644 index 0000000..878a3d1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any-expected.txt
@@ -0,0 +1,335 @@ +This is a testharness.js-based test. +Found 331 tests; 217 PASS, 114 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS setup +PASS AES-GCM 128-bit key, 32-bit tag +PASS AES-GCM 128-bit key, no additional data, 32-bit tag +PASS AES-GCM 128-bit key, 64-bit tag +PASS AES-GCM 128-bit key, no additional data, 64-bit tag +PASS AES-GCM 128-bit key, 96-bit tag +PASS AES-GCM 128-bit key, no additional data, 96-bit tag +PASS AES-GCM 128-bit key, 104-bit tag +PASS AES-GCM 128-bit key, no additional data, 104-bit tag +PASS AES-GCM 128-bit key, 112-bit tag +PASS AES-GCM 128-bit key, no additional data, 112-bit tag +PASS AES-GCM 128-bit key, 120-bit tag +PASS AES-GCM 128-bit key, no additional data, 120-bit tag +PASS AES-GCM 128-bit key, 128-bit tag +PASS AES-GCM 128-bit key, no additional data, 128-bit tag +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag +PASS AES-GCM 256-bit key, no additional data, 32-bit tag +PASS AES-GCM 256-bit key, 64-bit tag +PASS AES-GCM 256-bit key, no additional data, 64-bit tag +PASS AES-GCM 256-bit key, 96-bit tag +PASS AES-GCM 256-bit key, no additional data, 96-bit tag +PASS AES-GCM 256-bit key, 104-bit tag +PASS AES-GCM 256-bit key, no additional data, 104-bit tag +PASS AES-GCM 256-bit key, 112-bit tag +PASS AES-GCM 256-bit key, no additional data, 112-bit tag +PASS AES-GCM 256-bit key, 120-bit tag +PASS AES-GCM 256-bit key, no additional data, 120-bit tag +PASS AES-GCM 256-bit key, 128-bit tag +PASS AES-GCM 256-bit key, no additional data, 128-bit tag +PASS AES-GCM 128-bit key, 32-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 32-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 64-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 64-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 96-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 96-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 104-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 104-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 112-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 112-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 120-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 120-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 128-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 128-bit tag with altered plaintext +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 32-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 64-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 64-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 96-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 96-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 104-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 104-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 112-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 112-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 120-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 120-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 128-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 128-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 32-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 32-bit tag decryption +PASS AES-GCM 128-bit key, 64-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 64-bit tag decryption +PASS AES-GCM 128-bit key, 96-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 96-bit tag decryption +PASS AES-GCM 128-bit key, 104-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 104-bit tag decryption +PASS AES-GCM 128-bit key, 112-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 112-bit tag decryption +PASS AES-GCM 128-bit key, 120-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 120-bit tag decryption +PASS AES-GCM 128-bit key, 128-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 128-bit tag decryption +FAIL importKey step for decryption: AES-GCM 192-bit key, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 32-bit tag decryption +PASS AES-GCM 256-bit key, 64-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 64-bit tag decryption +PASS AES-GCM 256-bit key, 96-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 96-bit tag decryption +PASS AES-GCM 256-bit key, 104-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 104-bit tag decryption +PASS AES-GCM 256-bit key, 112-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 112-bit tag decryption +PASS AES-GCM 256-bit key, 120-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 120-bit tag decryption +PASS AES-GCM 256-bit key, 128-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 128-bit tag decryption +PASS AES-GCM 128-bit key, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 128-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 128-bit tag decryption with altered ciphertext +FAIL importKey step for decryption: AES-GCM 192-bit key, 32-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 32-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 64-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 64-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 96-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 96-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 104-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 104-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 112-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 112-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 120-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 120-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 128-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 128-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 128-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 128-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 32-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 32-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 64-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 64-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 96-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 96-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 104-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 104-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 112-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 112-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 120-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 120-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 128-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 128-bit tag without encrypt usage +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 32-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 64-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 64-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 96-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 96-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 104-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 104-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 112-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 112-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 120-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 120-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 128-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 128-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 128-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 128-bit tag with mismatched key and algorithm +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 128-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 128-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 32-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 32-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 64-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 64-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 96-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 96-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 104-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 104-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 112-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 112-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 120-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 120-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 128-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 128-bit tag without decrypt usage +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 32-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 64-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 64-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 96-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 96-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 104-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 104-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 112-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 112-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 120-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 120-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 128-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 128-bit tag without decrypt usage +PASS AES-GCM 128-bit key, illegal tag length 24-bits +PASS AES-GCM 128-bit key, illegal tag length 48-bits +PASS AES-GCM 128-bit key, illegal tag length 72-bits +PASS AES-GCM 128-bit key, illegal tag length 95-bits +PASS AES-GCM 128-bit key, illegal tag length 129-bits +FAIL AES-GCM 128-bit key, illegal tag length 256-bits assert_equals: Should throw an OperationError instead of Failed to execute 'encrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 24-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 24-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 48-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 48-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 72-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 72-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 95-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 95-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 129-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 129-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 256-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 256-bits Reached unreachable code +PASS AES-GCM 256-bit key, illegal tag length 24-bits +PASS AES-GCM 256-bit key, illegal tag length 48-bits +PASS AES-GCM 256-bit key, illegal tag length 72-bits +PASS AES-GCM 256-bit key, illegal tag length 95-bits +PASS AES-GCM 256-bit key, illegal tag length 129-bits +FAIL AES-GCM 256-bit key, illegal tag length 256-bits assert_equals: Should throw an OperationError instead of Failed to execute 'encrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +PASS AES-GCM 128-bit key, illegal tag length 24-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 48-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 72-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 95-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 129-bits decryption +FAIL AES-GCM 128-bit key, illegal tag length 256-bits decryption assert_equals: Should throw an OperationError instead of Failed to execute 'decrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 24-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 24-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 48-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 48-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 72-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 72-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 95-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 95-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 129-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 129-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 256-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 256-bits Reached unreachable code +PASS AES-GCM 256-bit key, illegal tag length 24-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 48-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 72-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 95-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 129-bits decryption +FAIL AES-GCM 256-bit key, illegal tag length 256-bits decryption assert_equals: Should throw an OperationError instead of Failed to execute 'decrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js new file mode 100644 index 0000000..8f1103d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: encrypt() Using AES-GCM +// META: script=aes_gcm_vectors.js +// META: script=aes.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.worker-expected.txt new file mode 100644 index 0000000..878a3d1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.any.worker-expected.txt
@@ -0,0 +1,335 @@ +This is a testharness.js-based test. +Found 331 tests; 217 PASS, 114 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS setup +PASS AES-GCM 128-bit key, 32-bit tag +PASS AES-GCM 128-bit key, no additional data, 32-bit tag +PASS AES-GCM 128-bit key, 64-bit tag +PASS AES-GCM 128-bit key, no additional data, 64-bit tag +PASS AES-GCM 128-bit key, 96-bit tag +PASS AES-GCM 128-bit key, no additional data, 96-bit tag +PASS AES-GCM 128-bit key, 104-bit tag +PASS AES-GCM 128-bit key, no additional data, 104-bit tag +PASS AES-GCM 128-bit key, 112-bit tag +PASS AES-GCM 128-bit key, no additional data, 112-bit tag +PASS AES-GCM 128-bit key, 120-bit tag +PASS AES-GCM 128-bit key, no additional data, 120-bit tag +PASS AES-GCM 128-bit key, 128-bit tag +PASS AES-GCM 128-bit key, no additional data, 128-bit tag +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag +PASS AES-GCM 256-bit key, no additional data, 32-bit tag +PASS AES-GCM 256-bit key, 64-bit tag +PASS AES-GCM 256-bit key, no additional data, 64-bit tag +PASS AES-GCM 256-bit key, 96-bit tag +PASS AES-GCM 256-bit key, no additional data, 96-bit tag +PASS AES-GCM 256-bit key, 104-bit tag +PASS AES-GCM 256-bit key, no additional data, 104-bit tag +PASS AES-GCM 256-bit key, 112-bit tag +PASS AES-GCM 256-bit key, no additional data, 112-bit tag +PASS AES-GCM 256-bit key, 120-bit tag +PASS AES-GCM 256-bit key, no additional data, 120-bit tag +PASS AES-GCM 256-bit key, 128-bit tag +PASS AES-GCM 256-bit key, no additional data, 128-bit tag +PASS AES-GCM 128-bit key, 32-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 32-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 64-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 64-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 96-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 96-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 104-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 104-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 112-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 112-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 120-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 120-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 128-bit tag with altered plaintext +PASS AES-GCM 128-bit key, no additional data, 128-bit tag with altered plaintext +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag with altered plaintext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 32-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 64-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 64-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 96-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 96-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 104-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 104-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 112-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 112-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 120-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 120-bit tag with altered plaintext +PASS AES-GCM 256-bit key, 128-bit tag with altered plaintext +PASS AES-GCM 256-bit key, no additional data, 128-bit tag with altered plaintext +PASS AES-GCM 128-bit key, 32-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 32-bit tag decryption +PASS AES-GCM 128-bit key, 64-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 64-bit tag decryption +PASS AES-GCM 128-bit key, 96-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 96-bit tag decryption +PASS AES-GCM 128-bit key, 104-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 104-bit tag decryption +PASS AES-GCM 128-bit key, 112-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 112-bit tag decryption +PASS AES-GCM 128-bit key, 120-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 120-bit tag decryption +PASS AES-GCM 128-bit key, 128-bit tag decryption +PASS AES-GCM 128-bit key, no additional data, 128-bit tag decryption +FAIL importKey step for decryption: AES-GCM 192-bit key, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 32-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 64-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 96-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 104-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 112-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 120-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 128-bit tag assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 32-bit tag decryption +PASS AES-GCM 256-bit key, 64-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 64-bit tag decryption +PASS AES-GCM 256-bit key, 96-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 96-bit tag decryption +PASS AES-GCM 256-bit key, 104-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 104-bit tag decryption +PASS AES-GCM 256-bit key, 112-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 112-bit tag decryption +PASS AES-GCM 256-bit key, 120-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 120-bit tag decryption +PASS AES-GCM 256-bit key, 128-bit tag decryption +PASS AES-GCM 256-bit key, no additional data, 128-bit tag decryption +PASS AES-GCM 128-bit key, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 128-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, no additional data, 128-bit tag decryption with altered ciphertext +FAIL importKey step for decryption: AES-GCM 192-bit key, 32-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 32-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 64-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 64-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 96-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 96-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 104-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 104-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 112-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 112-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 120-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 120-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, 128-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step for decryption: AES-GCM 192-bit key, no additional data, 128-bit tag with altered ciphertext assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 32-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 64-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 96-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 104-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 112-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 120-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, 128-bit tag decryption with altered ciphertext +PASS AES-GCM 256-bit key, no additional data, 128-bit tag decryption with altered ciphertext +PASS AES-GCM 128-bit key, 32-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 32-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 64-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 64-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 96-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 96-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 104-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 104-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 112-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 112-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 120-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 120-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 128-bit tag without encrypt usage +PASS AES-GCM 128-bit key, no additional data, 128-bit tag without encrypt usage +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag without encrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 32-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 64-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 64-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 96-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 96-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 104-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 104-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 112-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 112-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 120-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 120-bit tag without encrypt usage +PASS AES-GCM 256-bit key, 128-bit tag without encrypt usage +PASS AES-GCM 256-bit key, no additional data, 128-bit tag without encrypt usage +PASS AES-GCM 128-bit key, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 128-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, no additional data, 128-bit tag with mismatched key and algorithm +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag with mismatched key and algorithm assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 32-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 64-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 96-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 104-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 112-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 120-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, 128-bit tag with mismatched key and algorithm +PASS AES-GCM 256-bit key, no additional data, 128-bit tag with mismatched key and algorithm +PASS AES-GCM 128-bit key, 32-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 32-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 64-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 64-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 96-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 96-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 104-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 104-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 112-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 112-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 120-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 120-bit tag without decrypt usage +PASS AES-GCM 128-bit key, 128-bit tag without decrypt usage +PASS AES-GCM 128-bit key, no additional data, 128-bit tag without decrypt usage +FAIL importKey step: AES-GCM 192-bit key, 32-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 32-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 32-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 64-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 64-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 64-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 96-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 96-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 96-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 104-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 104-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 104-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 112-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 112-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 112-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 120-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 120-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 120-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, 128-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, 128-bit tag Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, no additional data, 128-bit tag without decrypt usage assert_unreached: importKey failed for AES-GCM 192-bit key, no additional data, 128-bit tag Reached unreachable code +PASS AES-GCM 256-bit key, 32-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 32-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 64-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 64-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 96-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 96-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 104-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 104-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 112-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 112-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 120-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 120-bit tag without decrypt usage +PASS AES-GCM 256-bit key, 128-bit tag without decrypt usage +PASS AES-GCM 256-bit key, no additional data, 128-bit tag without decrypt usage +PASS AES-GCM 128-bit key, illegal tag length 24-bits +PASS AES-GCM 128-bit key, illegal tag length 48-bits +PASS AES-GCM 128-bit key, illegal tag length 72-bits +PASS AES-GCM 128-bit key, illegal tag length 95-bits +PASS AES-GCM 128-bit key, illegal tag length 129-bits +FAIL AES-GCM 128-bit key, illegal tag length 256-bits assert_equals: Should throw an OperationError instead of Failed to execute 'encrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 24-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 24-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 48-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 48-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 72-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 72-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 95-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 95-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 129-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 129-bits Reached unreachable code +FAIL importKey step: AES-GCM 192-bit key, illegal tag length 256-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 256-bits Reached unreachable code +PASS AES-GCM 256-bit key, illegal tag length 24-bits +PASS AES-GCM 256-bit key, illegal tag length 48-bits +PASS AES-GCM 256-bit key, illegal tag length 72-bits +PASS AES-GCM 256-bit key, illegal tag length 95-bits +PASS AES-GCM 256-bit key, illegal tag length 129-bits +FAIL AES-GCM 256-bit key, illegal tag length 256-bits assert_equals: Should throw an OperationError instead of Failed to execute 'encrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +PASS AES-GCM 128-bit key, illegal tag length 24-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 48-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 72-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 95-bits decryption +PASS AES-GCM 128-bit key, illegal tag length 129-bits decryption +FAIL AES-GCM 128-bit key, illegal tag length 256-bits decryption assert_equals: Should throw an OperationError instead of Failed to execute 'decrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 24-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 24-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 48-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 48-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 72-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 72-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 95-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 95-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 129-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 129-bits Reached unreachable code +FAIL importKey step: decryption AES-GCM 192-bit key, illegal tag length 256-bits assert_unreached: importKey failed for AES-GCM 192-bit key, illegal tag length 256-bits Reached unreachable code +PASS AES-GCM 256-bit key, illegal tag length 24-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 48-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 72-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 95-bits decryption +PASS AES-GCM 256-bit key, illegal tag length 129-bits decryption +FAIL AES-GCM 256-bit key, illegal tag length 256-bits decryption assert_equals: Should throw an OperationError instead of Failed to execute 'decrypt' on 'SubtleCrypto': AesGcmParams: tagLength: Outside of numeric range expected "OperationError" but got "TypeError" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js deleted file mode 100644 index 7a14b69..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/aes_gcm.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("aes_gcm_vectors.js"); -importScripts("aes.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js deleted file mode 100644 index b016326..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("rsa_vectors.js"); -importScripts("rsa.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js index e9c2265..5eae06e4 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa.js
@@ -293,9 +293,11 @@ all_promises.push(promise); }); - Promise.all(all_promises) - .then(function() {done();}) - .catch(function() {done();}) + promise_test(function() { + return Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + }, "setup"); // A test vector has all needed fields for encryption, EXCEPT that the // key field may be null. This function replaces that null with the Correct
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa_oaep.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa_oaep.https.any.js new file mode 100644 index 0000000..20fd17c5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/rsa_oaep.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: encrypt() Using RSA-OAEP +// META: script=rsa_vectors.js +// META: script=rsa.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_cbc.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_cbc.https.html deleted file mode 100644 index 7a2805d3..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_cbc.https.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: encrypt() Using AES-CBC</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-encrypt"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="aes_cbc_vectors.js"></script> -<script src="aes.js"></script> - -<h1>encrypt Tests for AES-CBC</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_ctr.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_ctr.https.html deleted file mode 100644 index a48dfd3f..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_ctr.https.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: encrypt() Using AES-CTR</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-encrypt"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="aes_ctr_vectors.js"></script> -<script src="aes.js"></script> - -<h1>encrypt Tests for AES-CTR</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_gcm.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_gcm.https.html deleted file mode 100644 index 9f8b8bd..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_aes_gcm.https.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: encrypt() Using AES-GCM</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-encrypt"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="aes_gcm_vectors.js"></script> -<script src="aes.js"></script> - -<h1>encrypt Tests for AES-GCM</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_rsa_oaep.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_rsa_oaep.https.html deleted file mode 100644 index df8d8f4..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/encrypt_decrypt/test_rsa_oaep.https.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: encrypt() Using RSA-OAEP</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-encrypt"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="rsa_vectors.js"></script> -<script src="rsa.js"></script> - -<h1>encrypt Tests for RSA-OAEP</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.https.any.js similarity index 99% rename from third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.js rename to third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.https.any.js index 277851d..628d81e 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.https.any.js
@@ -1,7 +1,9 @@ +// META: title=WebCryptoAPI: importKey() for EC keys +// META: timeout=long + // Test importKey and exportKey for EC algorithms. Only "happy paths" are // currently tested - those where the operation should succeed. -function run_test() { var subtle = crypto.subtle; var curves = ['P-256', 'P-384', 'P-521']; @@ -275,5 +277,3 @@ return "{" + keyValuePairs.join(", ") + "}"; } - return; // from run_test -}
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.https.worker.js deleted file mode 100644 index 698df52..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/ec_importKey.https.worker.js +++ /dev/null
@@ -1,4 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("ec_importKey.js"); -run_test(); -done();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.any.js similarity index 99% rename from third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.js rename to third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.any.js index 1d80f1c..9f9d38a 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.any.js
@@ -1,7 +1,9 @@ +// META: title=WebCryptoAPI: importKey() for RSA keys +// META: timeout=long + // Test importKey and exportKey for RSA algorithms. Only "happy paths" are // currently tested - those where the operation should succeed. -function run_test() { var subtle = crypto.subtle; var sizes = [1024, 2048, 4096]; @@ -291,6 +293,3 @@ return "{" + keyValuePairs.join(", ") + "}"; } - - return; // from run_test -}
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.worker.js deleted file mode 100644 index 3b2435be..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/rsa_importKey.https.worker.js +++ /dev/null
@@ -1,4 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("rsa_importKey.js"); -run_test(); -done();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any-expected.txt new file mode 100644 index 0000000..c864d22 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any-expected.txt
@@ -0,0 +1,238 @@ +This is a testharness.js-based test. +Found 234 tests; 186 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, false, [decrypt]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, false, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, false, [decrypt]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, false, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, false, [decrypt]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, false, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, false, [unwrapKey]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, true, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, false, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, true, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, false, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, true, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, false, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, false, [unwrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey, deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey, deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey, deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey, deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey, deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey, deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey]) +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any.js similarity index 98% rename from third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.js rename to third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any.js index 1221c60c..3d76daa 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any.js
@@ -1,7 +1,9 @@ +// META: title=WebCryptoAPI: importKey() for symmetric keys +// META: timeout=long + // Test importKey and exportKey for non-PKC algorithms. Only "happy paths" are // currently tested - those where the operation should succeed. -function run_test() { var subtle = crypto.subtle; // keying material for algorithms that can use any bit string. @@ -237,6 +239,3 @@ return "{" + keyValuePairs.join(", ") + "}"; } - - return; // from run_test -}
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any.worker-expected.txt new file mode 100644 index 0000000..c864d22 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.any.worker-expected.txt
@@ -0,0 +1,238 @@ +This is a testharness.js-based test. +Found 234 tests; 186 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CTR, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CTR}, false, [decrypt]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CTR}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, true, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, false, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, true, [decrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, false, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CTR, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CTR}, false, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128CBC, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-CBC}, false, [decrypt]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-CBC}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, true, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, false, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, true, [decrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CBC}, false, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256CBC, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-CBC}, false, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt]) +PASS Good parameters: 128 bits (jwk, {alg: A128GCM, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-GCM}, false, [decrypt]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, true, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, false, [encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, true, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, false, [decrypt, encrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, true, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-GCM}, false, [decrypt]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, true, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, false, [encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, true, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, false, [decrypt, encrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, true, [decrypt]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-GCM}, false, [decrypt]) +PASS Good parameters: 256 bits (jwk, {alg: A256GCM, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-GCM}, false, [decrypt]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey]) +PASS Good parameters: 128 bits (jwk, {alg: A128KW, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {name: AES-KW}, false, [unwrapKey]) +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, true, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, false, [wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, true, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, false, [unwrapKey, wrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, true, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +FAIL Good parameters: 192 bits (jwk, {alg: A192KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {name: AES-KW}, false, [unwrapKey]) assert_unreached: Threw an unexpected error: OperationError: 192-bit AES keys are not supported Reached unreachable code +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, true, [wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, false, [wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, true, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, false, [unwrapKey, wrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, true, [unwrapKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-KW}, false, [unwrapKey]) +PASS Good parameters: 256 bits (jwk, {alg: A256KW, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {name: AES-KW}, false, [unwrapKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS1, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-1, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS256, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-256, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS384, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-384, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 192 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcY, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify, sign]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 256 bits (jwk, {alg: HS512, k: AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA, kty: oct}, {hash: SHA-512, name: HMAC}, false, [verify]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey, deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey, deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey, deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: HKDF}, false, [deriveKey]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey, deriveBits]) +PASS Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey, deriveBits]) +PASS Good parameters: 192 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey, deriveBits]) +PASS Good parameters: 256 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 2: 3, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 3: 4, 30: 31, 31: 32, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: PBKDF2}, false, [deriveKey]) +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js deleted file mode 100644 index bedd082d..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/symmetric_importKey.https.worker.js +++ /dev/null
@@ -1,4 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("symmetric_importKey.js"); -run_test(); -done();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_ec_importKey.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_ec_importKey.https.html deleted file mode 100644 index 54eea40..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_ec_importKey.https.html +++ /dev/null
@@ -1,12 +0,0 @@ -<!DOCTYPE HTML> -<meta charset=utf-8> -<title>WebCryptoAPI: importKey() for EC keys</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href=https://w3c.github.io/webcrypto/Overview.html#SubtleCrypto-method-importKey"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="ec_importKey.js"></script> -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_rsa_importKey.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_rsa_importKey.https.html deleted file mode 100644 index 219ad2d..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_rsa_importKey.https.html +++ /dev/null
@@ -1,12 +0,0 @@ -<!DOCTYPE HTML> -<meta charset=utf-8> -<title>WebCryptoAPI: importKey() for RSA keys</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href=https://w3c.github.io/webcrypto/Overview.html#SubtleCrypto-method-importKey"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="rsa_importKey.js"></script> -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_symmetric_importKey.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_symmetric_importKey.https.html deleted file mode 100644 index e82c4d78..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/import_export/test_symmetric_importKey.https.html +++ /dev/null
@@ -1,12 +0,0 @@ -<!DOCTYPE HTML> -<meta charset=utf-8> -<title>WebCryptoAPI: importKey() for symmetric keys</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href=https://w3c.github.io/webcrypto/Overview.html#SubtleCrypto-method-importKey"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="symmetric_importKey.js"></script> -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.https.any.js new file mode 100644 index 0000000..9764cc33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: sign() and verify() Using ECDSA +// META: script=ecdsa_vectors.js +// META: script=ecdsa.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.https.worker.js deleted file mode 100644 index f379d46..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("ecdsa_vectors.js"); -importScripts("ecdsa.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.js index 208b81c4..6133a7e 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/ecdsa.js
@@ -408,10 +408,11 @@ }); - Promise.all(all_promises) - .then(function() {done();}) - .catch(function() {done();}) - return; + promise_test(function() { + return Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + }, "setup"); // A test vector has all needed fields for signing and verifying, EXCEPT that the // key field may be null. This function replaces that null with the Correct
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.https.any.js new file mode 100644 index 0000000..419bab05 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: sign() and verify() Using HMAC +// META: script=hmac_vectors.js +// META: script=hmac.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.https.worker.js deleted file mode 100644 index 79d8f21d7..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("hmac_vectors.js"); -importScripts("hmac.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.js index e8f9ec5..8df4b04 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/hmac.js
@@ -292,10 +292,11 @@ - Promise.all(all_promises) - .then(function() {done();}) - .catch(function() {done();}) - return; + promise_test(function() { + return Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + }, "setup"); // A test vector has all needed fields for signing and verifying, EXCEPT that the // key field may be null. This function replaces that null with the Correct
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa.js index 251f57e..7a38089 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa.js
@@ -329,9 +329,11 @@ }); - Promise.all(all_promises) - .then(function() {done();}) - .catch(function() {done();}) + promise_test(function() { + return Promise.all(all_promises) + .then(function() {done();}) + .catch(function() {done();}) + }, "setup"); // A test vector has all needed fields for signing and verifying, EXCEPT that the // key field may be null. This function replaces that null with the Correct
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pkcs.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pkcs.https.any.js new file mode 100644 index 0000000..d930a71 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pkcs.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: sign() and verify() Using RSASSA-PKCS1-v1_5 +// META: script=rsa_pkcs_vectors.js +// META: script=rsa.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js deleted file mode 100644 index 6b4dbee..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pkcs.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("rsa_pkcs_vectors.js"); -importScripts("rsa.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pss.https.any.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pss.https.any.js new file mode 100644 index 0000000..f02ba209 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pss.https.any.js
@@ -0,0 +1,6 @@ +// META: title=WebCryptoAPI: sign() and verify() Using RSA-PSS +// META: script=rsa_pss_vectors.js +// META: script=rsa.js +// META: timeout=long + +run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js deleted file mode 100644 index fdf7b99..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/rsa_pss.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -importScripts("/resources/testharness.js"); -importScripts("rsa_pss_vectors.js"); -importScripts("rsa.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_ecdsa.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_ecdsa.https.html deleted file mode 100644 index 5f121f1..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_ecdsa.https.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: sign() and verify() Using ECDSA</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-sign"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-verify"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="ecdsa_vectors.js"></script> -<script src="ecdsa.js"></script> - -<h1>sign and verify Tests for ECDSA</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_hmac.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_hmac.https.html deleted file mode 100644 index 6d5ff926f..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_hmac.https.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: sign() and verify() Using HMAC</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-sign"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-verify"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="hmac_vectors.js"></script> -<script src="hmac.js"></script> - -<h1>sign and verify Tests for HMAC</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_rsa_pkcs.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_rsa_pkcs.https.html deleted file mode 100644 index de428c0f..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_rsa_pkcs.https.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: sign() and verify() Using RSASSA-PKCS1-v1_5</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-sign"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-verify"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="rsa_pkcs_vectors.js"></script> -<script src="rsa.js"></script> - -<h1>sign and verify Tests for RSASSA-PKCS1-v1_5</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_rsa_pss.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_rsa_pss.https.html deleted file mode 100644 index 3a2034f..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/sign_verify/test_rsa_pss.https.html +++ /dev/null
@@ -1,19 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: sign() and verify() Using RSA-PSS</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-sign"> -<link rel="help" href="https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#SubtleCrypto-method-verify"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="rsa_pss_vectors.js"></script> -<script src="rsa.js"></script> - -<h1>sign and verify Tests for RSA-PSS</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/test_wrapKey_unwrapKey.https.html b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/test_wrapKey_unwrapKey.https.html deleted file mode 100644 index 337e078..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/test_wrapKey_unwrapKey.https.html +++ /dev/null
@@ -1,17 +0,0 @@ -<!DOCTYPE html> -<meta charset=utf-8> -<meta name="timeout" content="long"> -<title>WebCryptoAPI: wrapKey() and unwrapKey()</title> -<link rel="author" title="Charles Engelke" href="mailto:w3c@engelke.com"> -<link rel="help" href="https://w3c.github.io/webcrypto/Overview.html#SubtleCrypto-method-wrapKey"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script src="wrapKey_unwrapKey.js"></script> - -<h1>wrapKey and unwrapKey Tests</h1> - -<div id="log"></div> -<script> -run_test(); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js similarity index 97% rename from third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js rename to third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js index 8f1a602..f7e135c 100644 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.js +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js
@@ -1,6 +1,8 @@ +// META: title=WebCryptoAPI: wrapKey() and unwrapKey() +// META: timeout=long + // Tests for wrapKey and unwrapKey round tripping -function run_test() { var subtle = self.crypto.subtle; var wrappers = []; // Things we wrap (and upwrap) keys with @@ -9,7 +11,8 @@ // Generate all the keys needed, then iterate over all combinations // to test wrapping and unwrapping. - Promise.all([generateWrappingKeys(), generateKeysToWrap(), generateEcdhPeerKey()]) + promise_test(function() { + return Promise.all([generateWrappingKeys(), generateKeysToWrap(), generateEcdhPeerKey()]) .then(function(results) { var promises = []; wrappers.forEach(function(wrapper) { @@ -18,19 +21,8 @@ }) }); return Promise.all(promises); - }, function(err) { - promise_test(function(test) { - assert_unreached("A key failed to generate: " + err.name + ": " + err.message) - }, "Could not run all tests") - }) - .then(function() { - done(); - }, function(err) { - promise_test(function(test) { - assert_unreached("A test failed to run: " + err.name + ": " + err.message) - }, "Could not run all tests") }); - + }, "setup"); function generateWrappingKeys() { // There are five algorithms that can be used for wrapKey/unwrapKey. @@ -513,5 +505,3 @@ function str2ab(str) { return Uint8Array.from( str.split(''), function(s){return s.charCodeAt(0)} ); } function ab2str(ab) { return String.fromCharCode.apply(null, new Uint8Array(ab)); } - -}
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js deleted file mode 100644 index 4cf813ba..0000000 --- a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.worker.js +++ /dev/null
@@ -1,5 +0,0 @@ -// META: timeout=long -importScripts("/resources/testharness.js"); -importScripts("wrapKey_unwrapKey.js"); - -run_test();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/multicol-dynamic-contain-crash.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/multicol-dynamic-contain-crash.html new file mode 100644 index 0000000..e20a6e7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/multicol-dynamic-contain-crash.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org"> +<link rel="help" href="https://crbug.com/965639"> +<style> +#multicol { + columns: 2; + column-fill: auto; + height: 50px; + background: orange; +} +#container { + contain: strict; + width: 100px; + height: 100px; + background: blue; +} +#target { + width: 100px; + height: 100px; + position: absolute; + background: purple; +} +.transform { + transform: translate(0, 50px); +} +</style> +<body> + <div id="multicol"> + <div id="container"> + <div id="target"></div> + </div> + </div> +<script> +document.body.offsetTop; +target.appendChild(document.createTextNode('a')); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/select-element-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/select-element-001-ref.html new file mode 100644 index 0000000..c3de58e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/select-element-001-ref.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title>CSS aspect-ratio reference: select elements</title> +<select style="height: 50px; width: 50px; background: green;"> + <option value=""></option> +</select> +<br> +<select style="height: 50px; width: 50px; background: green;"> + <option value="">The long text is selected</option> +</select> +<br> +<select style="height: 50px; width: auto; background: green;"> + <option value="">The long text is selected</option> +</select>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/select-element-001.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/select-element-001.html new file mode 100644 index 0000000..7f1626c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/select-element-001.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<title>CSS aspect-ratio: select elements with min-width</title> +<link rel="author" title="Mozilla" href="https://www.mozilla.org/"> +<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#aspect-ratio"> +<link rel="match" href="select-element-001-ref.html"> + +<!-- Sanity Check - aspect-ratio should be applied on the select element --> +<select style="height: 50px; aspect-ratio: 1/1; background: green;"> + <option value=""></option> +</select> +<br> +<!-- The content size shouldn't override the size when min-width is non-auto --> +<select style="height: 50px; aspect-ratio: 1/1; background: green; min-width: 0px;"> + <option value="">The long text is selected</option> +</select> +<br> +<!-- The content size should override the size when min-width is auto --> +<select style="height: 50px; aspect-ratio: 1/1; background: green;"> + <option value="">The long text is selected</option> +</select>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-001-ref.html index 3634745..0f412e2 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-001-ref.html
@@ -9,7 +9,7 @@ </style> <p>Test passes if the three “A” letters below are vertically aligned with eachother. -<div class=ref> +<div class=ref><br> A<br> A<br> A
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-002-ref.html index b595b3f..ade76fe 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-002-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-inline-002-ref.html
@@ -14,7 +14,7 @@ <p>Test passes if the black “A” lines up vertically with the blue one, not the orange one. -<div class=right> A</div> + <div> A</div> <div class=right> A</div> <div class=wrong> A</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-002-ref.html new file mode 100644 index 0000000..65621a0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-002-ref.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Text level 3 Test reference</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<style> +div { + font-family: monospace; /* so we can compare tab with a count of preserved spaces */ + white-space: pre; +} +</style> + +<p>Test passes if the "1"s all line up vertically: +<div>1 2 3 1 2 3 1 2 3 1 +1 1 1 1 +1 1 1 1</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-002.html b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-002.html new file mode 100644 index 0000000..01bc6caf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-002.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Text level 3 Test: tab-size and letter-spacing</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#tab-size-property"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property"> +<link rel="match" href="tab-size-spacing-002-ref.html"> +<meta name="assert" content="For the tab-size property, a <number> represents the measure as a multiple of the space character’s advance width (U+0020) including its associated letter-spacing and word-spacing"> +<style> +div { + font-family: monospace; /* so we can compare tab with a count of preserved spaces */ + white-space: pre; +} +.test { + letter-spacing: 1ch; /* effectively double the advance of the characters */ + tab-size: 3; +} +.ref1 { + letter-spacing: 1ch; +} +.ref2 { + white-space: pre; +} +</style> + +<p>Test passes if the "1"s all line up vertically: +<div class=ref1>1231231231</div> +<div class=test>1	1	1	1</div> +<div class=ref2>1 1 1 1</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-003-ref.html new file mode 100644 index 0000000..b8a7bc1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-003-ref.html
@@ -0,0 +1,15 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Text level 3 Test reference</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<style> +div { + font-family: monospace; /* so we can compare tab with a count of preserved spaces */ + white-space: pre; +} +</style> + +<p>Test passes if the "1"s all line up vertically: +<div>1 2 1 2 1 2 1 +1 1 1 1 +1 1 1 1</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-003.html b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-003.html new file mode 100644 index 0000000..767cc59 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/tab-size/tab-size-spacing-003.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>CSS Text level 3 Test: tab-size and word-spacing</title> +<link rel="author" title="Jonathan Kew" href="mailto:jkew@mozilla.com"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#tab-size-property"> +<link rel="help" href="https://drafts.csswg.org/css-text-3/#letter-spacing-property"> +<link rel="match" href="tab-size-spacing-003-ref.html"> +<meta name="assert" content="For the tab-size property, a <number> represents the measure as a multiple of the space character’s advance width (U+0020) including its associated letter-spacing and word-spacing"> +<style> +div { + font-family: monospace; /* so we can compare tab with a count of preserved spaces */ + white-space: pre; +} +.test { + word-spacing: 100%; /* effectively double the size of SPACE, and hence of tabs */ + tab-size: 3; +} +.ref1 { + word-spacing: 100%; +} +.ref2 { + white-space: pre; +} +</style> + +<p>Test passes if the "1"s all line up vertically: +<div class=ref1>1 2 1 2 1 2 1</div> +<div class=test>1	1	1	1</div> +<div class=ref2>1 1 1 1</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/transform3d-sorting-006.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/transform3d-sorting-006.html index 966549a..bea736f 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-transforms/transform3d-sorting-006.html +++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/transform3d-sorting-006.html
@@ -8,6 +8,7 @@ <meta name="assert" content="This tests that when two boxes intersect in a simple fashion, they're rendered according to Newell's algorithm."> <link rel="match" href="transform3d-sorting-006-ref.html"> + <meta name=fuzzy content="0-100;0-500"> </head> <body> <div style="transform-style: preserve-3d">
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js b/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js index 0981b0f6..b0684d4 100644 --- a/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js +++ b/third_party/blink/web_tests/external/wpt/fetch/api/request/request-bad-port.any.js
@@ -62,6 +62,8 @@ 587, // smtp (outgoing) 601, // syslog-conn 636, // ldap+ssl + 989, // ftps-data + 990, // ftps 993, // ldap+ssl 995, // pop3+ssl 1719, // h323gatestat
diff --git a/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-48-ref.html b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-48-ref.html new file mode 100644 index 0000000..53f72c1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-48-ref.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Forced colors mode - forced-color-adjust propagation to viewport.</title> +<style> + body { + margin:0; + overflow: hidden; + } + div { + background-color: green; + forced-color-adjust: none; + height: 100vh; + width: 100vw; + } +</style> +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-48.html b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-48.html new file mode 100644 index 0000000..feb3fc08 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-48.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Forced colors mode - forced-color-adjust propagation to viewport.</title> +<link rel="help" href="https://www.w3.org/TR/css-color-adjust-1/#forced-color-adjust-prop"> +<link rel=match href="forced-colors-mode-48-ref.html"> +<style> + :root { + forced-color-adjust: none; + background-color: green; + } +</style>
diff --git a/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-49-ref.html b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-49-ref.html new file mode 100644 index 0000000..8233a8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-49-ref.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Forced colors mode - forced-color-adjust does not propagate from body to viewport.</title> +<style> + body { + margin:0; + overflow: hidden; + } + div { + background-color: Canvas; + forced-color-adjust: none; + height: 100vh; + width: 100vw; + } +</style> +<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-49.html b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-49.html new file mode 100644 index 0000000..e96c379 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-49.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Forced colors mode - forced-color-adjust does not propagate from body to viewport.</title> +<link rel="help" href="https://www.w3.org/TR/css-color-adjust-1/#forced-color-adjust-prop"> +<link rel=match href="forced-colors-mode-49-ref.html"> +<style> + body { + forced-color-adjust: none; + background-color: green; + } +</style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/not-rendered-image-loading-lazy.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/not-rendered-image-loading-lazy.html index 5f7da1a..25aaedb 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/not-rendered-image-loading-lazy.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/not-rendered-image-loading-lazy.html
@@ -10,11 +10,11 @@ <body> <!-- These images must not attempt to load --> - <img id="display_none" style="display:none;" src="resources/image.png?2" loading="lazy" + <img id="display_none" style="display:none;" src="resources/image.png?not-rendered-image-loading-lazy-2" loading="lazy" onload="display_none_img.resolve();" onerror="display_none_img.reject();"> - <img id="attribute_hidden" hidden src="resources/image.png?3" loading="lazy" + <img id="attribute_hidden" hidden src="resources/image.png?not-rendered-image-loading-lazy-3" loading="lazy" onload="attribute_hidden_img.resolve();" onerror="attribute_hidden_img.reject();"> - <img id="js_display_none" src="resources/image.png?4" loading="lazy" + <img id="js_display_none" src="resources/image.png?not-rendered-image-loading-lazy-4" loading="lazy" onload="js_display_none_img.resolve();" onerror="js_display_none_img.reject();"> <script> document.getElementById("js_display_none").style = 'display:none;';
diff --git a/third_party/blink/web_tests/external/wpt/inert/inert-retargeting-iframe.tentative.html b/third_party/blink/web_tests/external/wpt/inert/inert-retargeting-iframe.tentative.html index ddcb3cc..d363adc 100644 --- a/third_party/blink/web_tests/external/wpt/inert/inert-retargeting-iframe.tentative.html +++ b/third_party/blink/web_tests/external/wpt/inert/inert-retargeting-iframe.tentative.html
@@ -33,7 +33,9 @@ } #ancestorContainer { - position: relative; + position: absolute; + top: 200px; + left: 10px; width: 300px; height: 300px; background-color: blue; @@ -72,14 +74,6 @@ border: 1px solid black; margin-left: 5px; } - -button.clicked::after { - content: " (clicked)"; -} - -.clicked > legend::after { - content: " (clicked)"; -} </style> </head> <body> @@ -89,7 +83,7 @@ <li>The yellow, semi-transparent square ("Non-inert, displaced container") should not turn red.</li> <li>"Non-inert button" should not turn red.</li> </ul> - <p>(The full test suite checks a range of events.)</p> + <p style="margin-bottom:250px">(The full test suite checks a range of events.)</p> <fieldset id="ancestorContainer"> <legend>Non-inert ancestor container</legend> <iframe id="background" src="frame/button.html"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index 2efb1fc1..98a303e 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -814,3 +814,5 @@ DUPLICATE-BASENAME-PATH: dom/nodes/ParentNode-querySelector-All-content.xht DUPLICATE-BASENAME-PATH: svg/struct/reftests/reference/green-100x100.html DUPLICATE-BASENAME-PATH: svg/struct/reftests/reference/green-100x100.svg + +SET TIMEOUT: mediacapture-insertable-streams/MediaStreamTrackProcessor-video.https.html \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/mathml/crashtests/scrollbar-caching-assert.html b/third_party/blink/web_tests/external/wpt/mathml/crashtests/scrollbar-caching-assert.html new file mode 100644 index 0000000..3f972ef --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/mathml/crashtests/scrollbar-caching-assert.html
@@ -0,0 +1,17 @@ +<!doctype html> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1663740"> +<style> +@namespace url(http://www.w3.org/1998/Math/MathML); +* { + all: inherit; + overflow-inline: hidden; +} +</style> +<script> +window.addEventListener('load', () => { + var x = document.getElementById('a') + x.setAttribute('mathvariant', 'double-struck') + x.innerHTML = '<select></select>' +}) +</script> +<math id='a'>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-insertable-streams/MediaStreamTrackProcessor-video.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-insertable-streams/MediaStreamTrackProcessor-video.https.html index 7d9ded91..7cc87c7 100644 --- a/third_party/blink/web_tests/external/wpt/mediacapture-insertable-streams/MediaStreamTrackProcessor-video.https.html +++ b/third_party/blink/web_tests/external/wpt/mediacapture-insertable-streams/MediaStreamTrackProcessor-video.https.html
@@ -45,6 +45,49 @@ [processor.readable]); return promise; }, "Tests that the reader of a video MediaStreamTrackProcessor produces VideoFrame objects and is closed on track stop while running on a worker"); + +function makeVideoFrame() { + const canvas = new OffscreenCanvas(100, 100); + const ctx = canvas.getContext('2d'); + return new VideoFrame(canvas); +} + +promise_test(async t => { + // The generator will be used as the source for the processor to + // produce frames in a controlled manner. + const generator = new MediaStreamTrackGenerator('video'); + t.add_cleanup(() => generator.stop()); + // Use a larger maxBufferSize than the default to ensure no frames + // will be dropped. + const processor = new MediaStreamTrackProcessor({track: generator, maxBufferSize:10}); + const reader = processor.readable.getReader(); + const writer = generator.writable.getWriter(); + + let numReads = 0; + let resolve = null; + const promise = new Promise(r => resolve = r); + + const numOperations = 4; + // Issue reads without waiting for the frames to arrive. + for (let i = 0; i < numOperations; i++) { + reader.read().then(dv=> { + dv.value.close(); + if (++numReads == numOperations) + resolve(); + }); + } + + // Write video frames in different tasks to "slowly" settle the pending read + // requests. + for (let i = 0; i<numOperations; i++) { + await writer.write(makeVideoFrame()); + await new Promise(r=>setTimeout(r,0)); + } + + return promise; + +}, "Tests that multiple read requests are eventually settled"); + </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/cors-preflight.any.js b/third_party/blink/web_tests/external/wpt/resource-timing/cors-preflight.any.js index 5bbf3d2a..4b980e7 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/cors-preflight.any.js +++ b/third_party/blink/web_tests/external/wpt/resource-timing/cors-preflight.any.js
@@ -5,29 +5,45 @@ // transferSize will vary slightly between requests for the same resource. const fuzzFactor = 3; // bytes -const hostInfo = get_host_info(); -const url = new URL('/resource-timing/resources/preflight.py', hostInfo['HTTP_REMOTE_ORIGIN']).href; +const {HTTP_REMOTE_ORIGIN} = get_host_info(); +const url = new URL('/resource-timing/resources/preflight.py', + HTTP_REMOTE_ORIGIN).href; // The header bytes are expected to be > |minHeaderSize| and // < |maxHeaderSize|. If they are outside this range the test will fail. const minHeaderSize = 100; const maxHeaderSize = 1024; -function checkResourceSizes() { - const entries = performance.getEntriesByName(url); - assert_equals(entries.length, 2, 'Wrong number of entries'); +promise_test(async () => { + const checkCorsAllowed = response => response.arrayBuffer(); + const requirePreflight = {headers: {'X-Require-Preflight' : '1'}}; + const collectEntries = new Promise(resolve => { + let entriesSeen = []; + new PerformanceObserver(entryList => { + entriesSeen = entriesSeen.concat(entryList.getEntries()); + if (entriesSeen.length > 2) { + throw new Error(`Saw too many PerformanceResourceTiming entries ` + + `(${entriesSeen.length})`); + } + if (entriesSeen.length == 2) { + resolve(entriesSeen); + } + }).observe({"type": "resource"}); + }); + + // Although this fetch doesn't send a pre-flight request, the server response + // will allow cross-origin requests explicitly with the + // Access-Control-Allow-Origin header. + await fetch(url).then(checkCorsAllowed); + + // This fetch will send a pre-flight request to do the CORS handshake + // explicitly. + await fetch(url, requirePreflight).then(checkCorsAllowed); + + const entries = await collectEntries; assert_greater_than(entries[0].transferSize, 0, 'No-preflight transferSize'); const lowerBound = entries[0].transferSize - fuzzFactor; const upperBound = entries[0].transferSize + fuzzFactor; - assert_between_exclusive(entries[1].transferSize, lowerBound, upperBound, 'Preflighted transferSize'); -} - -promise_test(() => { - const eatBody = response => response.arrayBuffer(); - const requirePreflight = {headers: {'X-Require-Preflight' : '1'}}; - return fetch(url) - .then(eatBody) - .then(() => fetch(url, requirePreflight)) - .then(eatBody) - .then(checkResourceSizes); + assert_between_exclusive(entries[1].transferSize, lowerBound, upperBound, + 'Preflighted transferSize'); }, 'PerformanceResourceTiming sizes fetch with preflight test');
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/preflight.py b/third_party/blink/web_tests/external/wpt/resource-timing/resources/preflight.py index 168850e2..f0f6017 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/resources/preflight.py +++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/preflight.py
@@ -1,8 +1,9 @@ def main(request, response): - response.headers.set(b"Access-Control-Allow-Origin", b"*"); - response.headers.set(b"Access-Control-Max-Age", b"0"); - response.headers.set(b"Timing-Allow-Origin", b"*"); - # If this script is accessed with the header X-Require-Preflight then the - # browser will send a preflight request. Otherwise it won't. - if request.method == u'OPTIONS': - response.headers.set(b"Access-Control-Allow-Headers", b"X-Require-Preflight"); + response.headers.set(b"Access-Control-Allow-Origin", b"*") + response.headers.set(b"Access-Control-Max-Age", b"0") + response.headers.set(b"Timing-Allow-Origin", b"*") + # If this script is accessed with the header X-Require-Preflight then the + # browser will send a preflight request. Otherwise it won't. + if request.method == u'OPTIONS': + response.headers.set(b"Access-Control-Allow-Headers", + b"X-Require-Preflight")
diff --git a/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-rp.https.html b/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-rp.https.html index fa4d226..6ddd715 100644 --- a/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-rp.https.html +++ b/third_party/blink/web_tests/external/wpt/webauthn/createcredential-badargs-rp.https.html
@@ -16,7 +16,7 @@ // rp bad values new CreateCredentialsTest({path: "options.publicKey.rp", value: undefined}).runTest("Bad rp: rp missing", TypeError); - new CreateCredentialsTest({ path: "options.publicKey.rp", value: null }).runTest("Bad rp: rp null", "NotSupportedError"); + new CreateCredentialsTest({ path: "options.publicKey.rp", value: null }).runTest("Bad rp: rp null", TypeError); new CreateCredentialsTest("options.publicKey.rp", "hi mom").runTest("Bad rp: rp is string", TypeError); new CreateCredentialsTest("options.publicKey.rp", {}).runTest("Bad rp: rp is empty object", TypeError);
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceTransportPolicy-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceTransportPolicy-expected.txt index 28583e9..15bb1a0 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceTransportPolicy-expected.txt +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCConfiguration-iceTransportPolicy-expected.txt
@@ -13,7 +13,7 @@ PASS new RTCPeerConnection(config) - with null iceTransportPolicy should throw TypeError PASS setConfiguration(config) - with null iceTransportPolicy should throw TypeError FAIL new RTCPeerConnection({ iceTransports: 'relay' }) should have no effect assert_equals: expected "all" but got "relay" -FAIL new RTCPeerConnection({ iceTransports: 'invalid' }) should have no effect Failed to construct 'RTCPeerConnection': The provided value 'invalid' is not a valid enum value of type RTCIceTransportPolicy. -FAIL new RTCPeerConnection({ iceTransports: null }) should have no effect Failed to construct 'RTCPeerConnection': The provided value 'null' is not a valid enum value of type RTCIceTransportPolicy. +FAIL new RTCPeerConnection({ iceTransports: 'invalid' }) should have no effect Failed to construct 'RTCPeerConnection': Failed to read the 'iceTransports' property from 'RTCConfiguration': The provided value 'invalid' is not a valid enum value of type RTCIceTransportPolicy. +FAIL new RTCPeerConnection({ iceTransports: null }) should have no effect Failed to construct 'RTCPeerConnection': Failed to read the 'iceTransports' property from 'RTCConfiguration': The provided value 'null' is not a valid enum value of type RTCIceTransportPolicy. Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js b/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js index 4e5af19..c670009b 100644 --- a/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js +++ b/third_party/blink/web_tests/external/wpt/websockets/Create-blocked-port.any.js
@@ -69,6 +69,8 @@ 587, // smtp (outgoing) 601, // syslog-conn 636, // ldap+ssl + 989, // ftps-data + 990, // ftps 993, // ldap+ssl 995, // pop3+ssl 1719, // h323gatestat
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-ImageData-workers-expected.txt b/third_party/blink/web_tests/fast/canvas/canvas-ImageData-workers-expected.txt index d17bb51..5c68110 100644 --- a/third_party/blink/web_tests/fast/canvas/canvas-ImageData-workers-expected.txt +++ b/third_party/blink/web_tests/fast/canvas/canvas-ImageData-workers-expected.txt
@@ -22,8 +22,8 @@ PASS [Worker] new ImageData(new Uint8ClampedArray(28), 7, 0) threw exception IndexSizeError: Failed to construct 'ImageData': The source height is zero or not a number.. PASS [Worker] new ImageData(new Uint8ClampedArray(104), 14) threw exception IndexSizeError: Failed to construct 'ImageData': The input data length is not a multiple of (4 * width).. PASS [Worker] new ImageData(new Uint8ClampedArray([12, 34, 168, 65328]), 1, 151) threw exception IndexSizeError: Failed to construct 'ImageData': The input data length is not equal to (4 * width * height).. -PASS [Worker] new ImageData(self, 4, 4) threw exception TypeError: Failed to construct 'ImageData': cannot convert to dictionary.. -PASS [Worker] new ImageData(null, 4, 4) threw exception TypeError: Failed to construct 'ImageData': cannot convert to dictionary.. +PASS [Worker] new ImageData(self, 4, 4) threw exception TypeError: Failed to construct 'ImageData': The provided value is not of type 'ImageDataSettings'.. +PASS [Worker] new ImageData(null, 4, 4) threw exception TypeError: Failed to construct 'ImageData': The provided value is not of type 'ImageDataSettings'.. PASS [Worker] new ImageData(imageData.data, 0) threw exception IndexSizeError: Failed to construct 'ImageData': The source width is zero or not a number.. PASS [Worker] new ImageData(imageData.data, 13) threw exception IndexSizeError: Failed to construct 'ImageData': The input data length is not a multiple of (4 * width).. PASS [Worker] new ImageData(imageData.data, 1 << 31) threw exception IndexSizeError: Failed to construct 'ImageData': The requested image size exceeds the supported range..
diff --git a/third_party/blink/web_tests/fast/dom/Window/window-scroll-arguments-expected.txt b/third_party/blink/web_tests/fast/dom/Window/window-scroll-arguments-expected.txt index 1217f52..90c882c 100644 --- a/third_party/blink/web_tests/fast/dom/Window/window-scroll-arguments-expected.txt +++ b/third_party/blink/web_tests/fast/dom/Window/window-scroll-arguments-expected.txt
@@ -10,7 +10,7 @@ Testing - scrollTo with 0 arguments PASS window.scrollTo() did not throw exception. Testing - scrollTo with 1 non-dictionary argument -PASS window.scrollTo(x) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': cannot convert to dictionary.. +PASS window.scrollTo(x) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': The provided value is not of type 'ScrollToOptions'.. Testing - scrollTo with a valid ScrollToOptions argument PASS window.scrollTo({ }) did not throw exception. PASS window.scrollTo({ left: x }) did not throw exception. @@ -23,9 +23,9 @@ PASS window.scrollTo({ left: x, top: y, behavior: "instant" }) did not throw exception. PASS window.scrollTo({ left: x, top: y, behavior: "smooth" }) did not throw exception. Testing - scrollTo with an invalid ScrollToOptions argument -PASS window.scrollTo({ behavior: "" }) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': The provided value '' is not a valid enum value of type ScrollBehavior.. -PASS window.scrollTo({ left: x, top: y, behavior: "abcd" }) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': The provided value 'abcd' is not a valid enum value of type ScrollBehavior.. -PASS window.scrollTo({ left: x, top: y, behavior: 200 }) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': The provided value '200' is not a valid enum value of type ScrollBehavior.. +PASS window.scrollTo({ behavior: "" }) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value '' is not a valid enum value of type ScrollBehavior.. +PASS window.scrollTo({ left: x, top: y, behavior: "abcd" }) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value 'abcd' is not a valid enum value of type ScrollBehavior.. +PASS window.scrollTo({ left: x, top: y, behavior: 200 }) threw exception TypeError: Failed to execute 'scrollTo' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value '200' is not a valid enum value of type ScrollBehavior.. window.scroll Tests @@ -34,7 +34,7 @@ Testing - scroll with 0 arguments PASS window.scroll() did not throw exception. Testing - scroll with 1 argument -PASS window.scroll(x) threw exception TypeError: Failed to execute 'scroll' on 'Window': cannot convert to dictionary.. +PASS window.scroll(x) threw exception TypeError: Failed to execute 'scroll' on 'Window': The provided value is not of type 'ScrollToOptions'.. Testing - scroll with a valid ScrollToOptions argument PASS window.scroll({ }) did not throw exception. PASS window.scroll({ left: x }) did not throw exception. @@ -47,9 +47,9 @@ PASS window.scroll({ left: x, top: y, behavior: "instant" }) did not throw exception. PASS window.scroll({ left: x, top: y, behavior: "smooth" }) did not throw exception. Testing - scroll with an invalid ScrollToOptions argument -PASS window.scroll({ behavior: "" }) threw exception TypeError: Failed to execute 'scroll' on 'Window': The provided value '' is not a valid enum value of type ScrollBehavior.. -PASS window.scroll({ left: x, top: y, behavior: "abcd" }) threw exception TypeError: Failed to execute 'scroll' on 'Window': The provided value 'abcd' is not a valid enum value of type ScrollBehavior.. -PASS window.scroll({ left: x, top: y, behavior: 200 }) threw exception TypeError: Failed to execute 'scroll' on 'Window': The provided value '200' is not a valid enum value of type ScrollBehavior.. +PASS window.scroll({ behavior: "" }) threw exception TypeError: Failed to execute 'scroll' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value '' is not a valid enum value of type ScrollBehavior.. +PASS window.scroll({ left: x, top: y, behavior: "abcd" }) threw exception TypeError: Failed to execute 'scroll' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value 'abcd' is not a valid enum value of type ScrollBehavior.. +PASS window.scroll({ left: x, top: y, behavior: 200 }) threw exception TypeError: Failed to execute 'scroll' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value '200' is not a valid enum value of type ScrollBehavior.. window.scrollBy Tests @@ -58,7 +58,7 @@ Testing - scrollBy with 0 arguments PASS window.scrollBy() did not throw exception. Testing - scrollBy with 1 argument -PASS window.scrollBy(x) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': cannot convert to dictionary.. +PASS window.scrollBy(x) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': The provided value is not of type 'ScrollToOptions'.. Testing - scrollBy with a valid ScrollOptions argument PASS window.scrollBy({ }) did not throw exception. PASS window.scrollBy({ left: x }) did not throw exception. @@ -71,9 +71,9 @@ PASS window.scrollBy({ left: x, top: y, behavior: "instant" }) did not throw exception. PASS window.scrollBy({ left: x, top: y, behavior: "smooth" }) did not throw exception. Testing - scrollBy with an invalid ScrollOptions argument -PASS window.scrollBy({ behavior: "" }) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': The provided value '' is not a valid enum value of type ScrollBehavior.. -PASS window.scrollBy({ left: x, top: y, behavior: "abcd" }) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': The provided value 'abcd' is not a valid enum value of type ScrollBehavior.. -PASS window.scrollBy({ left: x, top: y, behavior: 200 }) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': The provided value '200' is not a valid enum value of type ScrollBehavior.. +PASS window.scrollBy({ behavior: "" }) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value '' is not a valid enum value of type ScrollBehavior.. +PASS window.scrollBy({ left: x, top: y, behavior: "abcd" }) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value 'abcd' is not a valid enum value of type ScrollBehavior.. +PASS window.scrollBy({ left: x, top: y, behavior: 200 }) threw exception TypeError: Failed to execute 'scrollBy' on 'Window': Failed to read the 'behavior' property from 'ScrollOptions': The provided value '200' is not a valid enum value of type ScrollBehavior.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/events/constructors/animation-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/animation-event-constructor-expected.txt index 48a8687..e6fed33d 100644 --- a/third_party/blink/web_tests/fast/events/constructors/animation-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/animation-event-constructor-expected.txt
@@ -27,19 +27,19 @@ PASS new AnimationEvent('eventType', { elapsedTime: 123.45 }).elapsedTime is 123.45 PASS new AnimationEvent('eventType', { elapsedTime: -123.45 }).elapsedTime is -123.45 PASS new AnimationEvent('eventType', { elapsedTime: 18446744073709551615 }).elapsedTime is 18446744073709551615 -PASS new AnimationEvent('eventType', { elapsedTime: NaN }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': The provided double value is non-finite.. -PASS new AnimationEvent('eventType', { elapsedTime: Infinity }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': The provided double value is non-finite.. -PASS new AnimationEvent('eventType', { elapsedTime: -Infinity }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': The provided double value is non-finite.. +PASS new AnimationEvent('eventType', { elapsedTime: NaN }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': Failed to read the 'elapsedTime' property from 'AnimationEventInit': The provided double value is non-finite.. +PASS new AnimationEvent('eventType', { elapsedTime: Infinity }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': Failed to read the 'elapsedTime' property from 'AnimationEventInit': The provided double value is non-finite.. +PASS new AnimationEvent('eventType', { elapsedTime: -Infinity }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': Failed to read the 'elapsedTime' property from 'AnimationEventInit': The provided double value is non-finite.. PASS new AnimationEvent('eventType', { elapsedTime: undefined }).elapsedTime is 0 PASS new AnimationEvent('eventType', { elapsedTime: null }).elapsedTime is 0 PASS new AnimationEvent('eventType', { elapsedTime: false }).elapsedTime is 0 PASS new AnimationEvent('eventType', { elapsedTime: true }).elapsedTime is 1 PASS new AnimationEvent('eventType', { elapsedTime: '' }).elapsedTime is 0 -PASS new AnimationEvent('eventType', { elapsedTime: 'doremi' }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': The provided double value is non-finite.. +PASS new AnimationEvent('eventType', { elapsedTime: 'doremi' }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': Failed to read the 'elapsedTime' property from 'AnimationEventInit': The provided double value is non-finite.. PASS new AnimationEvent('eventType', { elapsedTime: [] }).elapsedTime is 0 PASS new AnimationEvent('eventType', { elapsedTime: [123.45] }).elapsedTime is 123.45 -PASS new AnimationEvent('eventType', { elapsedTime: [123.45, 678.90] }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': The provided double value is non-finite.. -PASS new AnimationEvent('eventType', { elapsedTime: {doremi: 123.45} }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': The provided double value is non-finite.. +PASS new AnimationEvent('eventType', { elapsedTime: [123.45, 678.90] }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': Failed to read the 'elapsedTime' property from 'AnimationEventInit': The provided double value is non-finite.. +PASS new AnimationEvent('eventType', { elapsedTime: {doremi: 123.45} }).elapsedTime threw exception TypeError: Failed to construct 'AnimationEvent': Failed to read the 'elapsedTime' property from 'AnimationEventInit': The provided double value is non-finite.. PASS new AnimationEvent('eventType', { elapsedTime: {valueOf: function () { return 123.45 } } }).elapsedTime is 123.45 PASS new AnimationEvent('eventType', { bubbles: true, cancelable: true, animationName: 'doremi', elapsedTime: 123.45 }).bubbles is true PASS new AnimationEvent('eventType', { bubbles: true, cancelable: true, animationName: 'doremi', elapsedTime: 123.45 }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/composition-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/composition-event-constructor-expected.txt index 2682e18..7b5573d 100644 --- a/third_party/blink/web_tests/fast/events/constructors/composition-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/composition-event-constructor-expected.txt
@@ -13,20 +13,20 @@ PASS new CompositionEvent('eventType', { cancelable: true }).cancelable is true PASS new CompositionEvent('eventType', { view: window }).view is window PASS new CompositionEvent('eventType', { view: this }).view is this -PASS new CompositionEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. +PASS new CompositionEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new CompositionEvent('eventType', { view: undefined }).view is null PASS new CompositionEvent('eventType', { view: null }).view is null -PASS new CompositionEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. -PASS new CompositionEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. +PASS new CompositionEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new CompositionEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new CompositionEvent('eventType', { get view() { return window; } }).view is window -PASS new CompositionEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'CompositionEvent': member view is not of type Window.. +PASS new CompositionEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'CompositionEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new CompositionEvent('eventType', { get view() { throw 'CompositionEvent Error'; } }) threw exception CompositionEvent Error. PASS new CompositionEvent('eventType', { data: 'koakuma' }).data is "koakuma" PASS new CompositionEvent('eventType', { data: '' }).data is ""
diff --git a/third_party/blink/web_tests/fast/events/constructors/event-constructors-expected.txt b/third_party/blink/web_tests/fast/events/constructors/event-constructors-expected.txt index b7ff3cf..fe6274a5 100644 --- a/third_party/blink/web_tests/fast/events/constructors/event-constructors-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/event-constructors-expected.txt
@@ -20,7 +20,7 @@ PASS (new Event('eventType', null)).cancelable is false PASS (new Event('eventType', undefined)).bubbles is false PASS (new Event('eventType', undefined)).cancelable is false -PASS new Event('eventType', 0) threw exception TypeError: Failed to construct 'Event': cannot convert to dictionary.. +PASS new Event('eventType', 0) threw exception TypeError: Failed to construct 'Event': The provided value is not of type 'EventInit'.. PASS (new Event('eventType', window)).bubbles is false PASS (new Event('eventType', window)).cancelable is false PASS (new Event('eventType', window)).bubbles is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/focus-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/focus-event-constructor-expected.txt index 336147f..83cc2a9 100644 --- a/third_party/blink/web_tests/fast/events/constructors/focus-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/focus-event-constructor-expected.txt
@@ -13,38 +13,38 @@ PASS new FocusEvent('eventType', { cancelable: true }).cancelable is true PASS new FocusEvent('eventType', { view: window }).view is window PASS new FocusEvent('eventType', { view: this }).view is this -PASS new FocusEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. +PASS new FocusEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new FocusEvent('eventType', { view: undefined }).view is null PASS new FocusEvent('eventType', { view: null }).view is null -PASS new FocusEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. -PASS new FocusEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. +PASS new FocusEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new FocusEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new FocusEvent('eventType', { get view() { return window; } }).view is window -PASS new FocusEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'FocusEvent': member view is not of type Window.. +PASS new FocusEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new FocusEvent('eventType', { get view() { throw 'FocusEvent Error'; } }) threw exception FocusEvent Error. PASS new FocusEvent('eventType', { relatedTarget: testDiv }).relatedTarget is testDiv PASS new FocusEvent('eventType', { relatedTarget: document }).relatedTarget is document PASS new FocusEvent('eventType', { relatedTarget: xhr }).relatedTarget is xhr PASS new FocusEvent('eventType', { relatedTarget: window }).relatedTarget is window -PASS new FocusEvent('eventType', { relatedTarget: testObject }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. +PASS new FocusEvent('eventType', { relatedTarget: testObject }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. PASS new FocusEvent('eventType', { relatedTarget: undefined }).relatedTarget is null PASS new FocusEvent('eventType', { relatedTarget: null }).relatedTarget is null -PASS new FocusEvent('eventType', { relatedTarget: false }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: true }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: '' }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: 'chocolate' }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: 12345 }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: 18446744073709551615 }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: NaN }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. -PASS new FocusEvent('eventType', { relatedTarget: {valueOf: function () { return testDiv; } } }).relatedTarget == testDiv threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. +PASS new FocusEvent('eventType', { relatedTarget: false }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: true }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: '' }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: 'chocolate' }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: 12345 }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: 18446744073709551615 }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: NaN }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. +PASS new FocusEvent('eventType', { relatedTarget: {valueOf: function () { return testDiv; } } }).relatedTarget == testDiv threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. PASS new FocusEvent('eventType', { get relatedTarget() { return testDiv; } }).relatedTarget == testDiv is true -PASS new FocusEvent('eventType', { get relatedTarget() { return 123; } }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': member relatedTarget is not of type EventTarget.. +PASS new FocusEvent('eventType', { get relatedTarget() { return 123; } }).relatedTarget threw exception TypeError: Failed to construct 'FocusEvent': Failed to read the 'relatedTarget' property from 'FocusEventInit': Failed to convert value to 'EventTarget'.. PASS new FocusEvent('eventType', { get relatedTarget() { throw 'FocusEvent Error'; } }) threw exception FocusEvent Error. PASS new FocusEvent('eventType', { bubbles: true, cancelable: true, view: window, detail: 111, relatedTarget: testDiv }).bubbles is true PASS new FocusEvent('eventType', { bubbles: true, cancelable: true, view: window, detail: 111, relatedTarget: testDiv }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/keyboard-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/keyboard-event-constructor-expected.txt index 4a4930d..504d94e6 100644 --- a/third_party/blink/web_tests/fast/events/constructors/keyboard-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/keyboard-event-constructor-expected.txt
@@ -18,20 +18,20 @@ PASS new KeyboardEvent('eventType', { cancelable: true }).cancelable is true PASS new KeyboardEvent('eventType', { view: window }).view is window PASS new KeyboardEvent('eventType', { view: this }).view is this -PASS new KeyboardEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. +PASS new KeyboardEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new KeyboardEvent('eventType', { view: undefined }).view is null PASS new KeyboardEvent('eventType', { view: null }).view is null -PASS new KeyboardEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. -PASS new KeyboardEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. +PASS new KeyboardEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new KeyboardEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new KeyboardEvent('eventType', { get view() { return window; } }).view is window -PASS new KeyboardEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'KeyboardEvent': member view is not of type Window.. +PASS new KeyboardEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'KeyboardEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new KeyboardEvent('eventType', { get view() { throw 'KeyboardEvent Error'; } }) threw exception KeyboardEvent Error. PASS new KeyboardEvent('eventType', { code: 'koakuma' }).code is "koakuma" PASS new KeyboardEvent('eventType', { code: '' }).code is ""
diff --git a/third_party/blink/web_tests/fast/events/constructors/media-encrypted-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/media-encrypted-event-constructor-expected.txt index fc8102f..097d7c0 100644 --- a/third_party/blink/web_tests/fast/events/constructors/media-encrypted-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/media-encrypted-event-constructor-expected.txt
@@ -12,8 +12,8 @@ PASS new MediaEncryptedEvent('eventType', { bubbles: true, cancelable: true }).initData is null PASS new MediaEncryptedEvent('eventType', { initDataType: 'foo' }).initDataType is "foo" PASS new MediaEncryptedEvent('eventType', { initData: initData }).initData is initData -PASS new MediaEncryptedEvent('eventType', { initData: 'foo' }).initData threw exception TypeError: Failed to construct 'MediaEncryptedEvent': member initData is not of type ArrayBuffer.. -PASS new MediaEncryptedEvent('eventType', { initData: 1 }).initData threw exception TypeError: Failed to construct 'MediaEncryptedEvent': member initData is not of type ArrayBuffer.. +PASS new MediaEncryptedEvent('eventType', { initData: 'foo' }).initData threw exception TypeError: Failed to construct 'MediaEncryptedEvent': Failed to read the 'initData' property from 'MediaEncryptedEventInit': Failed to convert value to 'ArrayBuffer'.. +PASS new MediaEncryptedEvent('eventType', { initData: 1 }).initData threw exception TypeError: Failed to construct 'MediaEncryptedEvent': Failed to read the 'initData' property from 'MediaEncryptedEventInit': Failed to convert value to 'ArrayBuffer'.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/events/constructors/media-stream-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/media-stream-event-constructor-expected.txt index 4289e0b..7ce612b 100644 --- a/third_party/blink/web_tests/fast/events/constructors/media-stream-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/media-stream-event-constructor-expected.txt
@@ -10,20 +10,20 @@ PASS new MediaStreamEvent('eventType', { cancelable: false }).cancelable is false PASS new MediaStreamEvent('eventType', { cancelable: true }).cancelable is true PASS new MediaStreamEvent('eventType', { stream: mediaStream }).stream is mediaStream -PASS new MediaStreamEvent('eventType', { stream: testObject }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: document }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. +PASS new MediaStreamEvent('eventType', { stream: testObject }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: document }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. PASS new MediaStreamEvent('eventType', { stream: undefined }).stream is null PASS new MediaStreamEvent('eventType', { stream: null }).stream is null -PASS new MediaStreamEvent('eventType', { stream: false }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: true }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: '' }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: 'chocolate' }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: 12345 }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: 18446744073709551615 }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: NaN }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. -PASS new MediaStreamEvent('eventType', { stream: {valueOf: function () { return mediaStream; } } }).stream == mediaStream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. +PASS new MediaStreamEvent('eventType', { stream: false }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: true }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: '' }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: 'chocolate' }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: 12345 }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: 18446744073709551615 }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: NaN }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. +PASS new MediaStreamEvent('eventType', { stream: {valueOf: function () { return mediaStream; } } }).stream == mediaStream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. PASS new MediaStreamEvent('eventType', { get stream() { return mediaStream; } }).stream is mediaStream -PASS new MediaStreamEvent('eventType', { get stream() { return 123; } }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': member stream is not of type MediaStream.. +PASS new MediaStreamEvent('eventType', { get stream() { return 123; } }).stream threw exception TypeError: Failed to construct 'MediaStreamEvent': Failed to read the 'stream' property from 'MediaStreamEventInit': Failed to convert value to 'MediaStream'.. PASS new MediaStreamEvent('eventType', { get stream() { throw 'MediaStreamEvent Error'; } }) threw exception MediaStreamEvent Error. PASS new MediaStreamEvent('eventType', { bubbles: true, cancelable: true, stream: mediaStream }).bubbles is true PASS new MediaStreamEvent('eventType', { bubbles: true, cancelable: true, stream: mediaStream }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/message-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/message-event-constructor-expected.txt index 77a6b4b..382aead 100644 --- a/third_party/blink/web_tests/fast/events/constructors/message-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/message-event-constructor-expected.txt
@@ -60,42 +60,42 @@ PASS new MessageEvent('eventType', { source: window }).source is window PASS new MessageEvent('eventType', { source: this }).source is this PASS new MessageEvent('eventType', { ports: [channel.port1], source: channel.port1 }).source is channel.port1 -PASS new MessageEvent('eventType', { source: test_object }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. +PASS new MessageEvent('eventType', { source: test_object }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. PASS new MessageEvent('eventType', { source: document }).source threw exception TypeError: Failed to construct 'MessageEvent': The optional 'source' property is neither a Window nor MessagePort.. PASS new MessageEvent('eventType', { source: document.body }).source threw exception TypeError: Failed to construct 'MessageEvent': The optional 'source' property is neither a Window nor MessagePort.. PASS new MessageEvent('eventType', { source: undefined }).source is null PASS new MessageEvent('eventType', { source: null }).source is null -PASS new MessageEvent('eventType', { source: false }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: true }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: '' }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: 'chocolate' }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: 12345 }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: 18446744073709551615 }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: NaN }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. -PASS new MessageEvent('eventType', { source: {valueOf: function () { return window; } } }).source == window threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. +PASS new MessageEvent('eventType', { source: false }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: true }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: '' }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: 'chocolate' }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: 12345 }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: 18446744073709551615 }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: NaN }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. +PASS new MessageEvent('eventType', { source: {valueOf: function () { return window; } } }).source == window threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. PASS new MessageEvent('eventType', { get source() { return window; } }).source is window -PASS new MessageEvent('eventType', { get source() { return 123; } }).source threw exception TypeError: Failed to construct 'MessageEvent': member source is not of type EventTarget.. +PASS new MessageEvent('eventType', { get source() { return 123; } }).source threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'source' property from 'MessageEventInit': Failed to convert value to 'EventTarget'.. PASS new MessageEvent('eventType', { get source() { throw 'MessageEvent Error'; } }) threw exception MessageEvent Error. PASS new MessageEvent('eventType', { ports: [channel.port1, channel.port2, channel2.port1] }).ports[0] is channel.port1 PASS new MessageEvent('eventType', { ports: [channel.port1, channel.port2, channel2.port1] }).ports[1] is channel.port2 PASS new MessageEvent('eventType', { ports: [channel.port1, channel.port2, channel2.port1] }).ports[2] is channel2.port1 PASS new MessageEvent('eventType', { ports: [] }).ports is [] PASS new MessageEvent('eventType', { ports: undefined }).ports is [] -PASS new MessageEvent('eventType', { ports: [1, 2, 3] }).ports[2] threw exception TypeError: Failed to construct 'MessageEvent': Failed to convert value to 'MessagePort'.. -PASS new MessageEvent('eventType', { ports: test_object }).ports threw exception TypeError: Failed to construct 'MessageEvent': The object must have a callable @@iterator property.. -PASS new MessageEvent('eventType', { ports: document }).ports threw exception TypeError: Failed to construct 'MessageEvent': The object must have a callable @@iterator property.. -PASS new MessageEvent('eventType', { ports: false }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: true }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: '' }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: 'chocolate' }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: 12345 }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: 18446744073709551615 }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: NaN }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { get ports() { return 123; } }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: [1, 2, 3] }).ports[2] threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': Failed to convert value to 'MessagePort'.. +PASS new MessageEvent('eventType', { ports: test_object }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The object must have a callable @@iterator property.. +PASS new MessageEvent('eventType', { ports: document }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The object must have a callable @@iterator property.. +PASS new MessageEvent('eventType', { ports: false }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: true }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: '' }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: 'chocolate' }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: 12345 }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: 18446744073709551615 }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: NaN }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { get ports() { return 123; } }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. PASS new MessageEvent('eventType', { get ports() { throw 'MessageEvent Error'; } }) threw exception MessageEvent Error. -PASS new MessageEvent('eventType', { ports: null }).ports threw exception TypeError: Failed to construct 'MessageEvent': The provided value cannot be converted to a sequence.. -PASS new MessageEvent('eventType', { ports: {valueOf: function () { return [channel.port1, channel.port2, channel.port2]; } } }).ports[0] threw exception TypeError: Failed to construct 'MessageEvent': The object must have a callable @@iterator property.. -PASS new MessageEvent('eventType', { bubbles: true, cancelable: true, data: test_object, origin: 'wonderful', lastEventId: 'excellent', source: window, ports: {length: 3, 0: channel.port1, 1: channel.port2, 2: channel2.port1} }).ports[2] threw exception TypeError: Failed to construct 'MessageEvent': The object must have a callable @@iterator property.. +PASS new MessageEvent('eventType', { ports: null }).ports threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The provided value cannot be converted to a sequence.. +PASS new MessageEvent('eventType', { ports: {valueOf: function () { return [channel.port1, channel.port2, channel.port2]; } } }).ports[0] threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The object must have a callable @@iterator property.. +PASS new MessageEvent('eventType', { bubbles: true, cancelable: true, data: test_object, origin: 'wonderful', lastEventId: 'excellent', source: window, ports: {length: 3, 0: channel.port1, 1: channel.port2, 2: channel2.port1} }).ports[2] threw exception TypeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': The object must have a callable @@iterator property.. PASS new MessageEvent('eventType', { bubbles: true, cancelable: true, data: test_object, origin: 'wonderful', lastEventId: 'excellent', source: window, ports: [channel.port1, channel.port2, channel2.port1] }).bubbles is true PASS new MessageEvent('eventType', { bubbles: true, cancelable: true, data: test_object, origin: 'wonderful', lastEventId: 'excellent', source: window, ports: [channel.port1, channel.port2, channel2.port1] }).cancelable is true PASS new MessageEvent('eventType', { bubbles: true, cancelable: true, data: test_object, origin: 'wonderful', lastEventId: 'excellent', source: window, ports: [channel.port1, channel.port2, channel2.port1] }).data is test_object
diff --git a/third_party/blink/web_tests/fast/events/constructors/midi-message-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/midi-message-event-constructor-expected.txt index fdb2045e..62b60a4 100644 --- a/third_party/blink/web_tests/fast/events/constructors/midi-message-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/midi-message-event-constructor-expected.txt
@@ -14,7 +14,7 @@ PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).bubbles is true PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).cancelable is true PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).data == '0,0,0' is true -PASS new MIDIMessageEvent('eventType', { data: data }) threw exception TypeError: Failed to construct 'MIDIMessageEvent': The provided ArrayBufferView value must not be shared.. +PASS new MIDIMessageEvent('eventType', { data: data }) threw exception TypeError: Failed to construct 'MIDIMessageEvent': Failed to read the 'data' property from 'MIDIMessageEventInit': The provided ArrayBufferView value must not be shared.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/events/constructors/mouse-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/mouse-event-constructor-expected.txt index f774535..af08b6f 100644 --- a/third_party/blink/web_tests/fast/events/constructors/mouse-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/mouse-event-constructor-expected.txt
@@ -23,20 +23,20 @@ PASS new MouseEvent('eventType', { cancelable: true }).cancelable is true PASS new MouseEvent('eventType', { view: window }).view is window PASS new MouseEvent('eventType', { view: this }).view is this -PASS new MouseEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. +PASS new MouseEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new MouseEvent('eventType', { view: undefined }).view is null PASS new MouseEvent('eventType', { view: null }).view is null -PASS new MouseEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. -PASS new MouseEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. +PASS new MouseEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new MouseEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new MouseEvent('eventType', { get view() { return window; } }).view is window -PASS new MouseEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'MouseEvent': member view is not of type Window.. +PASS new MouseEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new MouseEvent('eventType', { get view() { throw 'MouseEvent Error'; } }) threw exception MouseEvent Error. PASS new MouseEvent('eventType', { detail: 0 }).detail is 0 PASS new MouseEvent('eventType', { detail: 1 }).detail is 1 @@ -65,18 +65,18 @@ PASS new MouseEvent('eventType', { screenX: -2147483648 }).screenX is -2147483648 PASS new MouseEvent('eventType', { screenX: 123.45 }).screenX is 123 PASS new MouseEvent('eventType', { screenX: -123.45 }).screenX is -124 -PASS new MouseEvent('eventType', { screenX: NaN }).screenX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenX: NaN }).screenX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { screenX: undefined }).screenX is 0 PASS new MouseEvent('eventType', { screenX: null }).screenX is 0 PASS new MouseEvent('eventType', { screenX: '' }).screenX is 0 PASS new MouseEvent('eventType', { screenX: '12345' }).screenX is 12345 -PASS new MouseEvent('eventType', { screenX: '12345a' }).screenX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { screenX: 'abc' }).screenX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenX: '12345a' }).screenX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenX: 'abc' }).screenX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { screenX: [] }).screenX is 0 PASS new MouseEvent('eventType', { screenX: [12345] }).screenX is 12345 -PASS new MouseEvent('eventType', { screenX: [12345, 67890] }).screenX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { screenX: {moemoe: 12345} }).screenX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenX: [12345, 67890] }).screenX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenX: {moemoe: 12345} }).screenX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { screenX: {valueOf: function () { return 12345; }} }).screenX is 12345 PASS new MouseEvent('eventType', { screenY: 0 }).screenY is 0 PASS new MouseEvent('eventType', { screenY: 1 }).screenY is 1 @@ -85,18 +85,18 @@ PASS new MouseEvent('eventType', { screenY: -2147483648 }).screenY is -2147483648 PASS new MouseEvent('eventType', { screenY: 123.45 }).screenY is 123 PASS new MouseEvent('eventType', { screenY: -123.45 }).screenY is -124 -PASS new MouseEvent('eventType', { screenY: NaN }).screenY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenY: NaN }).screenY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { screenY: undefined }).screenY is 0 PASS new MouseEvent('eventType', { screenY: null }).screenY is 0 PASS new MouseEvent('eventType', { screenY: '' }).screenY is 0 PASS new MouseEvent('eventType', { screenY: '12345' }).screenY is 12345 -PASS new MouseEvent('eventType', { screenY: '12345a' }).screenY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { screenY: 'abc' }).screenY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenY: '12345a' }).screenY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenY: 'abc' }).screenY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { screenY: [] }).screenY is 0 PASS new MouseEvent('eventType', { screenY: [12345] }).screenY is 12345 -PASS new MouseEvent('eventType', { screenY: [12345, 67890] }).screenY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { screenY: {moemoe: 12345} }).screenY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenY: [12345, 67890] }).screenY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { screenY: {moemoe: 12345} }).screenY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { screenY: {valueOf: function () { return 12345; }} }).screenY is 12345 PASS new MouseEvent('eventType', { clientX: 0 }).clientX is 0 PASS new MouseEvent('eventType', { clientX: 1 }).clientX is 1 @@ -105,18 +105,18 @@ PASS new MouseEvent('eventType', { clientX: -2147483648 }).clientX is -2147483648 PASS new MouseEvent('eventType', { clientX: 123.45 }).clientX is 123 PASS new MouseEvent('eventType', { clientX: -123.45 }).clientX is -124 -PASS new MouseEvent('eventType', { clientX: NaN }).clientX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientX: NaN }).clientX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { clientX: undefined }).clientX is 0 PASS new MouseEvent('eventType', { clientX: null }).clientX is 0 PASS new MouseEvent('eventType', { clientX: '' }).clientX is 0 PASS new MouseEvent('eventType', { clientX: '12345' }).clientX is 12345 -PASS new MouseEvent('eventType', { clientX: '12345a' }).clientX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { clientX: 'abc' }).clientX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientX: '12345a' }).clientX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientX: 'abc' }).clientX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { clientX: [] }).clientX is 0 PASS new MouseEvent('eventType', { clientX: [12345] }).clientX is 12345 -PASS new MouseEvent('eventType', { clientX: [12345, 67890] }).clientX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { clientX: {moemoe: 12345} }).clientX threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientX: [12345, 67890] }).clientX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientX: {moemoe: 12345} }).clientX threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { clientX: {valueOf: function () { return 12345; }} }).clientX is 12345 PASS new MouseEvent('eventType', { clientY: 0 }).clientY is 0 PASS new MouseEvent('eventType', { clientY: 1 }).clientY is 1 @@ -125,18 +125,18 @@ PASS new MouseEvent('eventType', { clientY: -2147483648 }).clientY is -2147483648 PASS new MouseEvent('eventType', { clientY: 123.45 }).clientY is 123 PASS new MouseEvent('eventType', { clientY: -123.45 }).clientY is -124 -PASS new MouseEvent('eventType', { clientY: NaN }).clientY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientY: NaN }).clientY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { clientY: undefined }).clientY is 0 PASS new MouseEvent('eventType', { clientY: null }).clientY is 0 PASS new MouseEvent('eventType', { clientY: '' }).clientY is 0 PASS new MouseEvent('eventType', { clientY: '12345' }).clientY is 12345 -PASS new MouseEvent('eventType', { clientY: '12345a' }).clientY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { clientY: 'abc' }).clientY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientY: '12345a' }).clientY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientY: 'abc' }).clientY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { clientY: [] }).clientY is 0 PASS new MouseEvent('eventType', { clientY: [12345] }).clientY is 12345 -PASS new MouseEvent('eventType', { clientY: [12345, 67890] }).clientY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. -PASS new MouseEvent('eventType', { clientY: {moemoe: 12345} }).clientY threw exception TypeError: Failed to construct 'MouseEvent': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientY: [12345, 67890] }).clientY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new MouseEvent('eventType', { clientY: {moemoe: 12345} }).clientY threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new MouseEvent('eventType', { clientY: {valueOf: function () { return 12345; }} }).clientY is 12345 PASS new MouseEvent('eventType', { ctrlKey: false }).ctrlKey is false PASS new MouseEvent('eventType', { ctrlKey: true }).ctrlKey is true @@ -219,19 +219,19 @@ PASS new MouseEvent('eventType', { relatedTarget: document }).relatedTarget is document PASS new MouseEvent('eventType', { relatedTarget: xhr }).relatedTarget is xhr PASS new MouseEvent('eventType', { relatedTarget: window }).relatedTarget is window -PASS new MouseEvent('eventType', { relatedTarget: testObject }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. +PASS new MouseEvent('eventType', { relatedTarget: testObject }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. PASS new MouseEvent('eventType', { relatedTarget: undefined }).relatedTarget is null PASS new MouseEvent('eventType', { relatedTarget: null }).relatedTarget is null -PASS new MouseEvent('eventType', { relatedTarget: false }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: true }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: '' }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: 'chocolate' }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: 12345 }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: 18446744073709551615 }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: NaN }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. -PASS new MouseEvent('eventType', { relatedTarget: {valueOf: function () { return testDiv; } } }).relatedTarget == testDiv threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. +PASS new MouseEvent('eventType', { relatedTarget: false }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: true }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: '' }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: 'chocolate' }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: 12345 }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: 18446744073709551615 }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: NaN }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new MouseEvent('eventType', { relatedTarget: {valueOf: function () { return testDiv; } } }).relatedTarget == testDiv threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. PASS new MouseEvent('eventType', { get relatedTarget() { return testDiv; } }).relatedTarget is testDiv -PASS new MouseEvent('eventType', { get relatedTarget() { return 123; } }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': member relatedTarget is not of type EventTarget.. +PASS new MouseEvent('eventType', { get relatedTarget() { return 123; } }).relatedTarget threw exception TypeError: Failed to construct 'MouseEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. PASS new MouseEvent('eventType', { get relatedTarget() { throw 'MouseEvent Error'; } }) threw exception MouseEvent Error. PASS new MouseEvent('eventType', { bubbles: true, cancelable: true, view: window, detail: 111, screenX: 222, screenY: 333, clientX: 444, clientY: 555, ctrlKey: true, shiftKey: true, altKey: true, metaKey: true, button: 666, buttons: 777, relatedTarget: testDiv }).bubbles is true PASS new MouseEvent('eventType', { bubbles: true, cancelable: true, view: window, detail: 111, screenX: 222, screenY: 333, clientX: 444, clientY: 555, ctrlKey: true, shiftKey: true, altKey: true, metaKey: true, button: 666, buttons: 777, relatedTarget: testDiv }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/pointer-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/pointer-event-constructor-expected.txt index c74c49e..a106288 100644 --- a/third_party/blink/web_tests/fast/events/constructors/pointer-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/pointer-event-constructor-expected.txt
@@ -108,17 +108,17 @@ PASS new PointerEvent('eventType', { width: 16777215 }).width is 16777215 PASS new PointerEvent('eventType', { width: -16777216 }).width is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { width: '123abc' }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { width: 'dummy' }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { width: NaN }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: '123abc' }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: 'dummy' }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: NaN }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { width: null }).width is 0 PASS new PointerEvent('eventType', { width: undefined }).width is 1 PASS new PointerEvent('eventType', { width: [] }).width is 0 PASS new PointerEvent('eventType', { width: [12] }).width is 12 -PASS new PointerEvent('eventType', { width: [12, 34] }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { width: {} }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { width: {abc:1} }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { width: {} }).width threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: [12, 34] }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: {} }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: {abc:1} }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { width: {} }).width threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'width' property from 'PointerEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { width: {valueOf: function () { return 123; }} }).width is 123 -- no init -- PASS new PointerEvent('eventType').height is 1 @@ -133,17 +133,17 @@ PASS new PointerEvent('eventType', { height: 16777215 }).height is 16777215 PASS new PointerEvent('eventType', { height: -16777216 }).height is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { height: '123abc' }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { height: 'dummy' }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { height: NaN }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: '123abc' }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: 'dummy' }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: NaN }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { height: null }).height is 0 PASS new PointerEvent('eventType', { height: undefined }).height is 1 PASS new PointerEvent('eventType', { height: [] }).height is 0 PASS new PointerEvent('eventType', { height: [12] }).height is 12 -PASS new PointerEvent('eventType', { height: [12, 34] }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { height: {} }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { height: {abc:1} }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { height: {} }).height threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: [12, 34] }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: {} }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: {abc:1} }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { height: {} }).height threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'height' property from 'PointerEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { height: {valueOf: function () { return 123; }} }).height is 123 -- no init -- PASS new PointerEvent('eventType').pressure is 0 @@ -158,17 +158,17 @@ PASS new PointerEvent('eventType', { pressure: 16777215 }).pressure is 16777215 PASS new PointerEvent('eventType', { pressure: -16777216 }).pressure is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { pressure: '123abc' }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { pressure: 'dummy' }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { pressure: NaN }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: '123abc' }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: 'dummy' }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: NaN }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. PASS new PointerEvent('eventType', { pressure: null }).pressure is 0 PASS new PointerEvent('eventType', { pressure: undefined }).pressure is 0 PASS new PointerEvent('eventType', { pressure: [] }).pressure is 0 PASS new PointerEvent('eventType', { pressure: [12] }).pressure is 12 -PASS new PointerEvent('eventType', { pressure: [12, 34] }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { pressure: {} }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { pressure: {abc:1} }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { pressure: {} }).pressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: [12, 34] }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: {} }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: {abc:1} }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { pressure: {} }).pressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'pressure' property from 'PointerEventInit': The provided float value is non-finite.. PASS new PointerEvent('eventType', { pressure: {valueOf: function () { return 123; }} }).pressure is 123 -- no init -- PASS new PointerEvent('eventType').tangentialPressure is 0 @@ -183,17 +183,17 @@ PASS new PointerEvent('eventType', { tangentialPressure: 16777215 }).tangentialPressure is 16777215 PASS new PointerEvent('eventType', { tangentialPressure: -16777216 }).tangentialPressure is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { tangentialPressure: '123abc' }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { tangentialPressure: 'dummy' }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { tangentialPressure: NaN }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: '123abc' }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: 'dummy' }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: NaN }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. PASS new PointerEvent('eventType', { tangentialPressure: null }).tangentialPressure is 0 PASS new PointerEvent('eventType', { tangentialPressure: undefined }).tangentialPressure is 0 PASS new PointerEvent('eventType', { tangentialPressure: [] }).tangentialPressure is 0 PASS new PointerEvent('eventType', { tangentialPressure: [12] }).tangentialPressure is 12 -PASS new PointerEvent('eventType', { tangentialPressure: [12, 34] }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { tangentialPressure: {} }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { tangentialPressure: {abc:1} }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. -PASS new PointerEvent('eventType', { tangentialPressure: {} }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: [12, 34] }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: {} }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: {abc:1} }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. +PASS new PointerEvent('eventType', { tangentialPressure: {} }).tangentialPressure threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'tangentialPressure' property from 'PointerEventInit': The provided float value is non-finite.. PASS new PointerEvent('eventType', { tangentialPressure: {valueOf: function () { return 123; }} }).tangentialPressure is 123 -- no init -- PASS new PointerEvent('eventType').screenX is 0 @@ -208,17 +208,17 @@ PASS new PointerEvent('eventType', { screenX: 16777215 }).screenX is 16777215 PASS new PointerEvent('eventType', { screenX: -16777216 }).screenX is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { screenX: '123abc' }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenX: 'dummy' }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenX: NaN }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: '123abc' }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: 'dummy' }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: NaN }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { screenX: null }).screenX is 0 PASS new PointerEvent('eventType', { screenX: undefined }).screenX is 0 PASS new PointerEvent('eventType', { screenX: [] }).screenX is 0 PASS new PointerEvent('eventType', { screenX: [12] }).screenX is 12 -PASS new PointerEvent('eventType', { screenX: [12, 34] }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenX: {abc:1} }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: [12, 34] }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: {abc:1} }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { screenX: {valueOf: function () { return 123; }} }).screenX is 123 -- no init -- PASS new PointerEvent('eventType').screenY is 0 @@ -233,17 +233,17 @@ PASS new PointerEvent('eventType', { screenY: 16777215 }).screenY is 16777215 PASS new PointerEvent('eventType', { screenY: -16777216 }).screenY is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { screenY: '123abc' }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenY: 'dummy' }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenY: NaN }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: '123abc' }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: 'dummy' }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: NaN }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { screenY: null }).screenY is 0 PASS new PointerEvent('eventType', { screenY: undefined }).screenY is 0 PASS new PointerEvent('eventType', { screenY: [] }).screenY is 0 PASS new PointerEvent('eventType', { screenY: [12] }).screenY is 12 -PASS new PointerEvent('eventType', { screenY: [12, 34] }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenY: {abc:1} }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: [12, 34] }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: {abc:1} }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { screenY: {valueOf: function () { return 123; }} }).screenY is 123 -- no init -- PASS new PointerEvent('eventType').clientX is 0 @@ -258,17 +258,17 @@ PASS new PointerEvent('eventType', { clientX: 16777215 }).clientX is 16777215 PASS new PointerEvent('eventType', { clientX: -16777216 }).clientX is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { clientX: '123abc' }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientX: 'dummy' }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientX: NaN }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: '123abc' }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: 'dummy' }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: NaN }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { clientX: null }).clientX is 0 PASS new PointerEvent('eventType', { clientX: undefined }).clientX is 0 PASS new PointerEvent('eventType', { clientX: [] }).clientX is 0 PASS new PointerEvent('eventType', { clientX: [12] }).clientX is 12 -PASS new PointerEvent('eventType', { clientX: [12, 34] }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientX: {abc:1} }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: [12, 34] }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: {abc:1} }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { clientX: {valueOf: function () { return 123; }} }).clientX is 123 -- no init -- PASS new PointerEvent('eventType').clientY is 0 @@ -283,17 +283,17 @@ PASS new PointerEvent('eventType', { clientY: 16777215 }).clientY is 16777215 PASS new PointerEvent('eventType', { clientY: -16777216 }).clientY is -16777216 -- init with non-float/double values -- -PASS new PointerEvent('eventType', { clientY: '123abc' }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientY: 'dummy' }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientY: NaN }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: '123abc' }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: 'dummy' }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: NaN }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { clientY: null }).clientY is 0 PASS new PointerEvent('eventType', { clientY: undefined }).clientY is 0 PASS new PointerEvent('eventType', { clientY: [] }).clientY is 0 PASS new PointerEvent('eventType', { clientY: [12] }).clientY is 12 -PASS new PointerEvent('eventType', { clientY: [12, 34] }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientY: {abc:1} }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. -PASS new PointerEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'PointerEvent': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: [12, 34] }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: {abc:1} }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new PointerEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'PointerEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new PointerEvent('eventType', { clientY: {valueOf: function () { return 123; }} }).clientY is 123 --- tests for inherited attributes (other than screen & client coordinates) --- PASS new PointerEvent('eventType').bubbles is false
diff --git a/third_party/blink/web_tests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt index ca3f152..90bd9ba4b 100644 --- a/third_party/blink/web_tests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/security-policy-violation-event-constructor-expected.txt
@@ -26,16 +26,16 @@ PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ effectiveDirective: 'foo' })).effectiveDirective is "foo" PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ originalPolicy: 'foo' })).originalPolicy is "foo" PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ sourceFile: 'foo' })).sourceFile is "foo" -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ disposition: 'foo' })) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': The provided value 'foo' is not a valid enum value of type SecurityPolicyViolationEventDisposition.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ disposition: 'foo' })) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'disposition' property from 'SecurityPolicyViolationEventInit': The provided value 'foo' is not a valid enum value of type SecurityPolicyViolationEventDisposition.. PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ lineNumber: 42 })).lineNumber is 42 PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ columnNumber: 42 })).columnNumber is 42 PASS new SecurityPolicyViolationEvent('eventType', add_required_members({ statusCode: 42 })).statusCode is 42 -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "documentURI")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': required member documentURI is undefined.. -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "violatedDirective")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': required member violatedDirective is undefined.. -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "effectiveDirective")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': required member effectiveDirective is undefined.. -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "originalPolicy")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': required member originalPolicy is undefined.. -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "statusCode")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': required member statusCode is undefined.. -PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "disposition")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': required member disposition is undefined.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "documentURI")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'documentURI' property from 'SecurityPolicyViolationEventInit': Failed to read the 'documentURI' property from 'SecurityPolicyViolationEventInit': Required member is undefined.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "violatedDirective")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'violatedDirective' property from 'SecurityPolicyViolationEventInit': Failed to read the 'violatedDirective' property from 'SecurityPolicyViolationEventInit': Required member is undefined.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "effectiveDirective")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'effectiveDirective' property from 'SecurityPolicyViolationEventInit': Failed to read the 'effectiveDirective' property from 'SecurityPolicyViolationEventInit': Required member is undefined.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "originalPolicy")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'originalPolicy' property from 'SecurityPolicyViolationEventInit': Failed to read the 'originalPolicy' property from 'SecurityPolicyViolationEventInit': Required member is undefined.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "statusCode")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'statusCode' property from 'SecurityPolicyViolationEventInit': Failed to read the 'statusCode' property from 'SecurityPolicyViolationEventInit': Required member is undefined.. +PASS new SecurityPolicyViolationEvent('eventType', add_required_members({}, "disposition")) threw exception TypeError: Failed to construct 'SecurityPolicyViolationEvent': Failed to read the 'disposition' property from 'SecurityPolicyViolationEventInit': Failed to read the 'disposition' property from 'SecurityPolicyViolationEventInit': Required member is undefined.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/events/constructors/storage-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/storage-event-constructor-expected.txt index 2c4e2e2..cff47a4a 100644 --- a/third_party/blink/web_tests/fast/events/constructors/storage-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/storage-event-constructor-expected.txt
@@ -67,21 +67,21 @@ PASS new StorageEvent('eventType', { url: null }).url is "null" PASS new StorageEvent('eventType', { storageArea: localStorage }).storageArea is localStorage PASS new StorageEvent('eventType', { storageArea: sessionStorage }).storageArea is sessionStorage -PASS new StorageEvent('eventType', { storageArea: test_object }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: window }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: document }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. +PASS new StorageEvent('eventType', { storageArea: test_object }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: window }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: document }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. PASS new StorageEvent('eventType', { storageArea: undefined }).storageArea is null PASS new StorageEvent('eventType', { storageArea: null }).storageArea is null -PASS new StorageEvent('eventType', { storageArea: false }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: true }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: '' }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: 'chocolate' }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: 12345 }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: 18446744073709551615 }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: NaN }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. -PASS new StorageEvent('eventType', { storageArea: {valueOf: function () { return window; } } }).storageArea == window threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. +PASS new StorageEvent('eventType', { storageArea: false }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: true }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: '' }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: 'chocolate' }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: 12345 }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: 18446744073709551615 }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: NaN }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. +PASS new StorageEvent('eventType', { storageArea: {valueOf: function () { return window; } } }).storageArea == window threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. PASS new StorageEvent('eventType', { get storageArea() { return localStorage; } }).storageArea is localStorage -PASS new StorageEvent('eventType', { get storageArea() { return 123; } }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': member storageArea is not of type Storage.. +PASS new StorageEvent('eventType', { get storageArea() { return 123; } }).storageArea threw exception TypeError: Failed to construct 'StorageEvent': Failed to read the 'storageArea' property from 'StorageEventInit': Failed to convert value to 'Storage'.. PASS new StorageEvent('eventType', { get storageArea() { throw 'StorageEvent Error'; } }) threw exception StorageEvent Error. PASS new StorageEvent('eventType', { bubbles: true, cancelable: false, key: 'abc', oldValue: 'def', newValue: 'ghi', url: 'jkl', storageArea: localStorage }).bubbles is true PASS new StorageEvent('eventType', { bubbles: false, cancelable: true, key: 'abc', oldValue: 'def', newValue: 'ghi', url: 'jkl', storageArea: localStorage }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/track-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/track-event-constructor-expected.txt index 44388cd..ecb1049 100644 --- a/third_party/blink/web_tests/fast/events/constructors/track-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/track-event-constructor-expected.txt
@@ -14,15 +14,15 @@ PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true }).track is null *** Bubbles and cancelable true, invalid track *** -PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: HTMLTrackElement }).bubbles threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. -PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: HTMLTrackElement }).cancelable threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. -PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: HTMLTrackElement }).track threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. +PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: HTMLTrackElement }).bubbles threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. +PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: HTMLTrackElement }).cancelable threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. +PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: HTMLTrackElement }).track threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. *** Initialize 'track' with a invalid values *** -PASS new TrackEvent('TrackEvent', { track: 10 }).track threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. -PASS new TrackEvent('TrackEvent', { track: 'string' }).track threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. -PASS new TrackEvent('TrackEvent', { track: emptyObject }).track threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. -PASS new TrackEvent('TrackEvent', { track: document }).track threw exception TypeError: Failed to construct 'TrackEvent': The provided value is not of type '(VideoTrack or AudioTrack or TextTrack)'. +PASS new TrackEvent('TrackEvent', { track: 10 }).track threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. +PASS new TrackEvent('TrackEvent', { track: 'string' }).track threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. +PASS new TrackEvent('TrackEvent', { track: emptyObject }).track threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. +PASS new TrackEvent('TrackEvent', { track: document }).track threw exception TypeError: Failed to construct 'TrackEvent': Failed to read the 'track' property from 'TrackEventInit': The provided value is not of type '(AudioTrack or TextTrack or VideoTrack)'.. *** Bubbles and cancelable true, valid track *** PASS new TrackEvent('TrackEvent', { bubbles: true, cancelable: true, track: trackElement.track }).bubbles is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/transition-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/transition-event-constructor-expected.txt index 2d40dd0..adb84bc 100644 --- a/third_party/blink/web_tests/fast/events/constructors/transition-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/transition-event-constructor-expected.txt
@@ -28,9 +28,9 @@ PASS new TransitionEvent('eventType', { elapsedTime: 123.45 }).elapsedTime is 123.45 PASS new TransitionEvent('eventType', { elapsedTime: -123.45 }).elapsedTime is -123.45 PASS new TransitionEvent('eventType', { elapsedTime: 18446744073709551615 }).elapsedTime is 18446744073709551615 -PASS new TransitionEvent('eventType', { elapsedTime: NaN }) threw exception TypeError: Failed to construct 'TransitionEvent': The provided double value is non-finite.. -PASS new TransitionEvent('eventType', { elapsedTime: Infinity }) threw exception TypeError: Failed to construct 'TransitionEvent': The provided double value is non-finite.. -PASS new TransitionEvent('eventType', { elapsedTime: -Infinity }) threw exception TypeError: Failed to construct 'TransitionEvent': The provided double value is non-finite.. +PASS new TransitionEvent('eventType', { elapsedTime: NaN }) threw exception TypeError: Failed to construct 'TransitionEvent': Failed to read the 'elapsedTime' property from 'TransitionEventInit': The provided double value is non-finite.. +PASS new TransitionEvent('eventType', { elapsedTime: Infinity }) threw exception TypeError: Failed to construct 'TransitionEvent': Failed to read the 'elapsedTime' property from 'TransitionEventInit': The provided double value is non-finite.. +PASS new TransitionEvent('eventType', { elapsedTime: -Infinity }) threw exception TypeError: Failed to construct 'TransitionEvent': Failed to read the 'elapsedTime' property from 'TransitionEventInit': The provided double value is non-finite.. PASS new TransitionEvent('eventType', { pseudoElement: '::before' }).pseudoElement is "::before" PASS new TransitionEvent('eventType', { pseudoElement: '' }).pseudoElement is "" PASS new TransitionEvent('eventType', { elapsedTime: undefined }).elapsedTime is 0 @@ -38,11 +38,11 @@ PASS new TransitionEvent('eventType', { elapsedTime: false }).elapsedTime is 0 PASS new TransitionEvent('eventType', { elapsedTime: true }).elapsedTime is 1 PASS new TransitionEvent('eventType', { elapsedTime: '' }).elapsedTime is 0 -PASS new TransitionEvent('eventType', { elapsedTime: 'doremi' }) threw exception TypeError: Failed to construct 'TransitionEvent': The provided double value is non-finite.. +PASS new TransitionEvent('eventType', { elapsedTime: 'doremi' }) threw exception TypeError: Failed to construct 'TransitionEvent': Failed to read the 'elapsedTime' property from 'TransitionEventInit': The provided double value is non-finite.. PASS new TransitionEvent('eventType', { elapsedTime: [] }).elapsedTime is 0 PASS new TransitionEvent('eventType', { elapsedTime: [123.45] }).elapsedTime is 123.45 -PASS new TransitionEvent('eventType', { elapsedTime: [123.45, 678.90] }) threw exception TypeError: Failed to construct 'TransitionEvent': The provided double value is non-finite.. -PASS new TransitionEvent('eventType', { elapsedTime: {doremi: 123.45} }) threw exception TypeError: Failed to construct 'TransitionEvent': The provided double value is non-finite.. +PASS new TransitionEvent('eventType', { elapsedTime: [123.45, 678.90] }) threw exception TypeError: Failed to construct 'TransitionEvent': Failed to read the 'elapsedTime' property from 'TransitionEventInit': The provided double value is non-finite.. +PASS new TransitionEvent('eventType', { elapsedTime: {doremi: 123.45} }) threw exception TypeError: Failed to construct 'TransitionEvent': Failed to read the 'elapsedTime' property from 'TransitionEventInit': The provided double value is non-finite.. PASS new TransitionEvent('eventType', { elapsedTime: {valueOf: function () { return 123.45 } } }).elapsedTime is 123.45 PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).bubbles is true PASS new TransitionEvent('eventType', { bubbles: true, cancelable: true, propertyName: 'doremi', elapsedTime: 123.45, pseudoElement: '::after' }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/constructors/ui-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/ui-event-constructor-expected.txt index 2d921e2..92099ed 100644 --- a/third_party/blink/web_tests/fast/events/constructors/ui-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/ui-event-constructor-expected.txt
@@ -12,20 +12,20 @@ PASS new UIEvent('eventType', { cancelable: true }).cancelable is true PASS new UIEvent('eventType', { view: window }).view is window PASS new UIEvent('eventType', { view: this }).view is this -PASS new UIEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. +PASS new UIEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new UIEvent('eventType', { view: undefined }).view is null PASS new UIEvent('eventType', { view: null }).view is null -PASS new UIEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. -PASS new UIEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. +PASS new UIEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new UIEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new UIEvent('eventType', { get view() { return window; } }).view is window -PASS new UIEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'UIEvent': member view is not of type Window.. +PASS new UIEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'UIEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new UIEvent('eventType', { get view() { throw 'UIEvent Error'; } }) threw exception UIEvent Error. PASS new UIEvent('eventType', { detail: 0 }).detail is 0 PASS new UIEvent('eventType', { detail: 2147483647 }).detail is 2147483647
diff --git a/third_party/blink/web_tests/fast/events/constructors/wheel-event-constructor-expected.txt b/third_party/blink/web_tests/fast/events/constructors/wheel-event-constructor-expected.txt index 6594784..03a0c1d 100644 --- a/third_party/blink/web_tests/fast/events/constructors/wheel-event-constructor-expected.txt +++ b/third_party/blink/web_tests/fast/events/constructors/wheel-event-constructor-expected.txt
@@ -25,20 +25,20 @@ PASS new WheelEvent('eventType', { cancelable: true }).cancelable is true PASS new WheelEvent('eventType', { view: window }).view is window PASS new WheelEvent('eventType', { view: this }).view is this -PASS new WheelEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. +PASS new WheelEvent('eventType', { view: testObject }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: document }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new WheelEvent('eventType', { view: undefined }).view is null PASS new WheelEvent('eventType', { view: null }).view is null -PASS new WheelEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. -PASS new WheelEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. +PASS new WheelEvent('eventType', { view: false }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: true }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: '' }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: 'chocolate' }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: 12345 }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: 18446744073709551615 }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: NaN }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. +PASS new WheelEvent('eventType', { view: {valueOf: function () { return window; } } }).view == window threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new WheelEvent('eventType', { get view() { return window; } }).view is window -PASS new WheelEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'WheelEvent': member view is not of type Window.. +PASS new WheelEvent('eventType', { get view() { return 123; } }).view threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'view' property from 'UIEventInit': Failed to convert value to 'Window'.. PASS new WheelEvent('eventType', { get view() { throw 'WheelEvent Error'; } }) threw exception WheelEvent Error. PASS new WheelEvent('eventType', { detail: 0 }).detail is 0 PASS new WheelEvent('eventType', { detail: 1 }).detail is 1 @@ -67,18 +67,18 @@ PASS new WheelEvent('eventType', { screenX: -2147483648 }).screenX is -2147483648 PASS new WheelEvent('eventType', { screenX: 123.45 }).screenX is 123 PASS new WheelEvent('eventType', { screenX: -123.45 }).screenX is -124 -PASS new WheelEvent('eventType', { screenX: NaN }).screenX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenX: NaN }).screenX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { screenX: undefined }).screenX is 0 PASS new WheelEvent('eventType', { screenX: null }).screenX is 0 PASS new WheelEvent('eventType', { screenX: '' }).screenX is 0 PASS new WheelEvent('eventType', { screenX: '12345' }).screenX is 12345 -PASS new WheelEvent('eventType', { screenX: '12345a' }).screenX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { screenX: 'abc' }).screenX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenX: '12345a' }).screenX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenX: 'abc' }).screenX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { screenX: [] }).screenX is 0 PASS new WheelEvent('eventType', { screenX: [12345] }).screenX is 12345 -PASS new WheelEvent('eventType', { screenX: [12345, 67890] }).screenX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { screenX: {moemoe: 12345} }).screenX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenX: [12345, 67890] }).screenX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenX: {} }).screenX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenX: {moemoe: 12345} }).screenX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { screenX: {valueOf: function () { return 12345; }} }).screenX is 12345 PASS new WheelEvent('eventType', { screenY: 0 }).screenY is 0 PASS new WheelEvent('eventType', { screenY: 1 }).screenY is 1 @@ -87,18 +87,18 @@ PASS new WheelEvent('eventType', { screenY: -2147483648 }).screenY is -2147483648 PASS new WheelEvent('eventType', { screenY: 123.45 }).screenY is 123 PASS new WheelEvent('eventType', { screenY: -123.45 }).screenY is -124 -PASS new WheelEvent('eventType', { screenY: NaN }).screenY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenY: NaN }).screenY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { screenY: undefined }).screenY is 0 PASS new WheelEvent('eventType', { screenY: null }).screenY is 0 PASS new WheelEvent('eventType', { screenY: '' }).screenY is 0 PASS new WheelEvent('eventType', { screenY: '12345' }).screenY is 12345 -PASS new WheelEvent('eventType', { screenY: '12345a' }).screenY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { screenY: 'abc' }).screenY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenY: '12345a' }).screenY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenY: 'abc' }).screenY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { screenY: [] }).screenY is 0 PASS new WheelEvent('eventType', { screenY: [12345] }).screenY is 12345 -PASS new WheelEvent('eventType', { screenY: [12345, 67890] }).screenY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { screenY: {moemoe: 12345} }).screenY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenY: [12345, 67890] }).screenY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenY: {} }).screenY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { screenY: {moemoe: 12345} }).screenY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'screenY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { screenY: {valueOf: function () { return 12345; }} }).screenY is 12345 PASS new WheelEvent('eventType', { clientX: 0 }).clientX is 0 PASS new WheelEvent('eventType', { clientX: 1 }).clientX is 1 @@ -107,18 +107,18 @@ PASS new WheelEvent('eventType', { clientX: -2147483648 }).clientX is -2147483648 PASS new WheelEvent('eventType', { clientX: 123.45 }).clientX is 123 PASS new WheelEvent('eventType', { clientX: -123.45 }).clientX is -124 -PASS new WheelEvent('eventType', { clientX: NaN }).clientX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientX: NaN }).clientX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { clientX: undefined }).clientX is 0 PASS new WheelEvent('eventType', { clientX: null }).clientX is 0 PASS new WheelEvent('eventType', { clientX: '' }).clientX is 0 PASS new WheelEvent('eventType', { clientX: '12345' }).clientX is 12345 -PASS new WheelEvent('eventType', { clientX: '12345a' }).clientX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { clientX: 'abc' }).clientX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientX: '12345a' }).clientX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientX: 'abc' }).clientX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { clientX: [] }).clientX is 0 PASS new WheelEvent('eventType', { clientX: [12345] }).clientX is 12345 -PASS new WheelEvent('eventType', { clientX: [12345, 67890] }).clientX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { clientX: {moemoe: 12345} }).clientX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientX: [12345, 67890] }).clientX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientX: {} }).clientX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientX: {moemoe: 12345} }).clientX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientX' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { clientX: {valueOf: function () { return 12345; }} }).clientX is 12345 PASS new WheelEvent('eventType', { clientY: 0 }).clientY is 0 PASS new WheelEvent('eventType', { clientY: 1 }).clientY is 1 @@ -127,18 +127,18 @@ PASS new WheelEvent('eventType', { clientY: -2147483648 }).clientY is -2147483648 PASS new WheelEvent('eventType', { clientY: 123.45 }).clientY is 123 PASS new WheelEvent('eventType', { clientY: -123.45 }).clientY is -124 -PASS new WheelEvent('eventType', { clientY: NaN }).clientY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientY: NaN }).clientY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { clientY: undefined }).clientY is 0 PASS new WheelEvent('eventType', { clientY: null }).clientY is 0 PASS new WheelEvent('eventType', { clientY: '' }).clientY is 0 PASS new WheelEvent('eventType', { clientY: '12345' }).clientY is 12345 -PASS new WheelEvent('eventType', { clientY: '12345a' }).clientY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { clientY: 'abc' }).clientY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientY: '12345a' }).clientY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientY: 'abc' }).clientY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { clientY: [] }).clientY is 0 PASS new WheelEvent('eventType', { clientY: [12345] }).clientY is 12345 -PASS new WheelEvent('eventType', { clientY: [12345, 67890] }).clientY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { clientY: {moemoe: 12345} }).clientY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientY: [12345, 67890] }).clientY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientY: {} }).clientY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { clientY: {moemoe: 12345} }).clientY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'clientY' property from 'MouseEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { clientY: {valueOf: function () { return 12345; }} }).clientY is 12345 PASS new WheelEvent('eventType', { wheelDeltaX: 0 }).wheelDeltaX is 0 PASS new WheelEvent('eventType', { wheelDeltaX: 1 }).wheelDeltaX is 1 @@ -187,18 +187,18 @@ PASS new WheelEvent('eventType', { deltaX: -2147483648 }).deltaX is -2147483648 PASS new WheelEvent('eventType', { deltaX: 123.45 }).deltaX is 123.45 PASS new WheelEvent('eventType', { deltaX: -123.45 }).deltaX is -123.45 -PASS new WheelEvent('eventType', { deltaX: NaN }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaX: NaN }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaX' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaX: undefined }).deltaX is 0 PASS new WheelEvent('eventType', { deltaX: null }).deltaX is 0 PASS new WheelEvent('eventType', { deltaX: '' }).deltaX is 0 PASS new WheelEvent('eventType', { deltaX: '12345' }).deltaX is 12345 -PASS new WheelEvent('eventType', { deltaX: '12345a' }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaX: 'abc' }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaX: '12345a' }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaX' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaX: 'abc' }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaX' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaX: [] }).deltaX is 0 PASS new WheelEvent('eventType', { deltaX: [12345] }).deltaX is 12345 -PASS new WheelEvent('eventType', { deltaX: [12345, 67890] }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaX: {} }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaX: {moemoe: 12345} }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaX: [12345, 67890] }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaX' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaX: {} }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaX' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaX: {moemoe: 12345} }).deltaX threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaX' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaX: {valueOf: function () { return 12345; }} }).deltaX is 12345 PASS new WheelEvent('eventType', { deltaY: 0 }).deltaY is 0 PASS new WheelEvent('eventType', { deltaY: 1 }).deltaY is 1 @@ -207,18 +207,18 @@ PASS new WheelEvent('eventType', { deltaY: -2147483648 }).deltaY is -2147483648 PASS new WheelEvent('eventType', { deltaY: 123.45 }).deltaY is 123.45 PASS new WheelEvent('eventType', { deltaY: -123.45 }).deltaY is -123.45 -PASS new WheelEvent('eventType', { deltaY: NaN }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaY: NaN }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaY' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaY: undefined }).deltaY is 0 PASS new WheelEvent('eventType', { deltaY: null }).deltaY is 0 PASS new WheelEvent('eventType', { deltaY: '' }).deltaY is 0 PASS new WheelEvent('eventType', { deltaY: '12345' }).deltaY is 12345 -PASS new WheelEvent('eventType', { deltaY: '12345a' }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaY: 'abc' }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaY: '12345a' }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaY' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaY: 'abc' }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaY' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaY: [] }).deltaY is 0 PASS new WheelEvent('eventType', { deltaY: [12345] }).deltaY is 12345 -PASS new WheelEvent('eventType', { deltaY: [12345, 67890] }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaY: {} }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaY: {moemoe: 12345} }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaY: [12345, 67890] }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaY' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaY: {} }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaY' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaY: {moemoe: 12345} }).deltaY threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaY' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaY: {valueOf: function () { return 12345; }} }).deltaY is 12345 PASS new WheelEvent('eventType', { deltaZ: 0 }).deltaZ is 0 PASS new WheelEvent('eventType', { deltaZ: 1 }).deltaZ is 1 @@ -227,18 +227,18 @@ PASS new WheelEvent('eventType', { deltaZ: -2147483648 }).deltaZ is -2147483648 PASS new WheelEvent('eventType', { deltaZ: 123.45 }).deltaZ is 123.45 PASS new WheelEvent('eventType', { deltaZ: -123.45 }).deltaZ is -123.45 -PASS new WheelEvent('eventType', { deltaZ: NaN }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaZ: NaN }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaZ' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaZ: undefined }).deltaZ is 0 PASS new WheelEvent('eventType', { deltaZ: null }).deltaZ is 0 PASS new WheelEvent('eventType', { deltaZ: '' }).deltaZ is 0 PASS new WheelEvent('eventType', { deltaZ: '12345' }).deltaZ is 12345 -PASS new WheelEvent('eventType', { deltaZ: '12345a' }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaZ: 'abc' }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaZ: '12345a' }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaZ' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaZ: 'abc' }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaZ' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaZ: [] }).deltaZ is 0 PASS new WheelEvent('eventType', { deltaZ: [12345] }).deltaZ is 12345 -PASS new WheelEvent('eventType', { deltaZ: [12345, 67890] }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaZ: {} }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. -PASS new WheelEvent('eventType', { deltaZ: {moemoe: 12345} }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaZ: [12345, 67890] }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaZ' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaZ: {} }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaZ' property from 'WheelEventInit': The provided double value is non-finite.. +PASS new WheelEvent('eventType', { deltaZ: {moemoe: 12345} }).deltaZ threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'deltaZ' property from 'WheelEventInit': The provided double value is non-finite.. PASS new WheelEvent('eventType', { deltaZ: {valueOf: function () { return 12345; }} }).deltaZ is 12345 PASS new WheelEvent('eventType', { deltaMode: 0 }).deltaMode is 0 PASS new WheelEvent('eventType', { deltaMode: 1 }).deltaMode is 1 @@ -303,19 +303,19 @@ PASS new WheelEvent('eventType', { relatedTarget: testDiv }).relatedTarget is testDiv PASS new WheelEvent('eventType', { relatedTarget: document }).relatedTarget is document PASS new WheelEvent('eventType', { relatedTarget: xhr }).relatedTarget is xhr -PASS new WheelEvent('eventType', { relatedTarget: testObject }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. +PASS new WheelEvent('eventType', { relatedTarget: testObject }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. PASS new WheelEvent('eventType', { relatedTarget: undefined }).relatedTarget is null PASS new WheelEvent('eventType', { relatedTarget: null }).relatedTarget is null -PASS new WheelEvent('eventType', { relatedTarget: false }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: true }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: '' }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: 'chocolate' }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: 12345 }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: 18446744073709551615 }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: NaN }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. -PASS new WheelEvent('eventType', { relatedTarget: {valueOf: function () { return testDiv; } } }).relatedTarget == testDiv threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. +PASS new WheelEvent('eventType', { relatedTarget: false }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: true }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: '' }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: 'chocolate' }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: 12345 }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: 18446744073709551615 }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: NaN }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. +PASS new WheelEvent('eventType', { relatedTarget: {valueOf: function () { return testDiv; } } }).relatedTarget == testDiv threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. PASS new WheelEvent('eventType', { get relatedTarget() { return testDiv; } }).relatedTarget is testDiv -PASS new WheelEvent('eventType', { get relatedTarget() { return 123; } }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': member relatedTarget is not of type EventTarget.. +PASS new WheelEvent('eventType', { get relatedTarget() { return 123; } }).relatedTarget threw exception TypeError: Failed to construct 'WheelEvent': Failed to read the 'relatedTarget' property from 'MouseEventInit': Failed to convert value to 'EventTarget'.. PASS new WheelEvent('eventType', { get relatedTarget() { throw 'WheelEvent Error'; } }) threw exception WheelEvent Error. PASS new WheelEvent('eventType', { bubbles: true, cancelable: true, view: window, detail: 111, screenX: 222, screenY: 333, clientX: 444, clientY: 555, ctrlKey: true, shiftKey: true, altKey: true, metaKey: true, button: 666, relatedTarget: testDiv, wheelDeltaX: 777, wheelDeltaY: 888, deltaMode: WheelEvent.DOM_DELTA_PAGE }).bubbles is true PASS new WheelEvent('eventType', { bubbles: true, cancelable: true, view: window, detail: 111, screenX: 222, screenY: 333, clientX: 444, clientY: 555, ctrlKey: true, shiftKey: true, altKey: true, metaKey: true, button: 666, relatedTarget: testDiv, wheelDeltaX: 777, wheelDeltaY: 888, deltaMode: WheelEvent.DOM_DELTA_PAGE }).cancelable is true
diff --git a/third_party/blink/web_tests/fast/events/message-event-max-ports-expected.txt b/third_party/blink/web_tests/fast/events/message-event-max-ports-expected.txt index ae0f9d3..b2344bd 100644 --- a/third_party/blink/web_tests/fast/events/message-event-max-ports-expected.txt +++ b/third_party/blink/web_tests/fast/events/message-event-max-ports-expected.txt
@@ -2,7 +2,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -PASS new MessageEvent("message", {ports:ports}) threw exception RangeError: Failed to construct 'MessageEvent': Array length exceeds supported limit.. +PASS new MessageEvent("message", {ports:ports}) threw exception RangeError: Failed to construct 'MessageEvent': Failed to read the 'ports' property from 'MessageEventInit': Array length exceeds supported limit.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/filesystem/flags-passing-expected.txt b/third_party/blink/web_tests/fast/filesystem/flags-passing-expected.txt index 29740b2e..d9f03e5 100644 --- a/third_party/blink/web_tests/fast/filesystem/flags-passing-expected.txt +++ b/third_party/blink/web_tests/fast/filesystem/flags-passing-expected.txt
@@ -6,7 +6,7 @@ * Passing JSON Flags object (with exclusive=true). * Passing null as a flags parameter. * Passing a number as a flags parameter. -Caught exception: TypeError: Failed to execute 'getFile' on 'DirectoryEntry': cannot convert to dictionary. +Caught exception: TypeError: Failed to execute 'getFile' on 'DirectoryEntry': The provided value is not of type 'FileSystemFlags'. Finished running tests. PASS expectedCallbacksCount is 1 PASS unexpectedCallbacksCount is 0
diff --git a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-includes-seconds.html b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-includes-seconds.html new file mode 100644 index 0000000..a7cbd06 --- /dev/null +++ b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-includes-seconds.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<link rel="author" title="Joey Arhar" href="mailto:jarhar@chromium.org"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1182180"> + +<script src="../../../resources/testharness.js"></script> +<script src="../../../resources/testharnessreport.js"></script> + +<input type=time step=1 id=secondstep value="12:34:56"> +<input type=time step="0.001" id=msstep value="12:34:56.789"> + +<script> +test(() => { + secondstep.focus(); + eventSender.keyDown('ArrowRight'); + eventSender.keyDown('ArrowRight'); + eventSender.keyDown('0'); + assert_equals(secondstep.value, '12:34:00'); +}, `<input type=time> should always include seconds in .value if the seconds portion is visible.`); + +test(() => { + msstep.focus(); + eventSender.keyDown('ArrowRight'); + eventSender.keyDown('ArrowRight'); + eventSender.keyDown('ArrowRight'); + eventSender.keyDown('0'); + assert_equals(msstep.value, '12:34:56.000'); +}, `<input type=time> should always include milliseconds in .value if the milliseconds portion is visible.`); +</script>
diff --git a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events-expected.txt b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events-expected.txt index baa4bbb..d037b35 100644 --- a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events-expected.txt +++ b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events-expected.txt
@@ -55,7 +55,7 @@ PASS input.value is "15:03" PASS document.activeElement.id is "before" == Up key on maximum value == -PASS input.value is "13:00" +PASS input.value is "13:00:00.000" == Down key on minimum value == PASS input.value is "00:59:59.999" == Backspace key ==
diff --git a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events.html b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events.html index 6ff560d8..5a3878f 100644 --- a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events.html +++ b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-keyboard-events.html
@@ -177,7 +177,7 @@ keyDown('ArrowUp'); keyDown('\t'); keyDown('ArrowUp'); -shouldBeEqualToString('input.value', '13:00'); +shouldBeEqualToString('input.value', '13:00:00.000'); beginTest('Down key on minimum value', '01:00'); input.step = 0.001;
diff --git a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-expected.txt b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-expected.txt index 149fb511..f33aa2b 100644 --- a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-expected.txt +++ b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-expected.txt
@@ -10,24 +10,24 @@ PASS test("07:13", null, null, null, ["ArrowDown", "ArrowDown", "ArrowDown"]) is "07:10" Milliseconds PASS stepUp("07:13:00.000", 0.001, null, null) is "07:13:00.001" -PASS stepDown("07:13:00.001", 0.001, null, null) is "07:13" -PASS stepUp("07:13:00.999", 0.001, null, null) is "07:13" +PASS stepDown("07:13:00.001", 0.001, null, null) is "07:13:00.000" +PASS stepUp("07:13:00.999", 0.001, null, null) is "07:13:00.000" PASS stepDown("07:13:00.000", 0.001, null, null) is "07:13:00.999" PASS stepUp("07:13:00.000", 0.250, null, null) is "07:13:00.250" PASS stepDown("07:13:00.500", 0.250, null, null) is "07:13:00.250" -PASS stepUp("07:13:00.750", 0.250, null, null) is "07:13" +PASS stepUp("07:13:00.750", 0.250, null, null) is "07:13:00.000" PASS stepDown("07:13:00.000", 0.250, null, null) is "07:13:00.750" PASS stepUp("07:13:00.099", 0.100, null, null) is "07:13:00.100" PASS stepDown("07:13:00.101", 0.100, null, null) is "07:13:00.100" PASS stepUp("07:13:00.500", 0.0001, null, null) is "07:13:00.501" PASS stepDown("07:13:00.500", 0.0001, null, null) is "07:13:00.499" -PASS stepUp("07:13:00.500", 0, null, null) is "07:13" -PASS stepDown("07:13:00.500", 0, null, null) is "07:13" -PASS stepUp("07:13:00.500", 60, null, null) is "07:13" -PASS stepDown("07:13:00.500", 60, null, null) is "07:13" +PASS stepUp("07:13:00.500", 0, null, null) is "07:13:00.000" +PASS stepDown("07:13:00.500", 0, null, null) is "07:13:00.000" +PASS stepUp("07:13:00.500", 60, null, null) is "07:13:00.000" +PASS stepDown("07:13:00.500", 60, null, null) is "07:13:00.000" PASS stepUp("07:13:00.500", 0.100, "00:00:00.050", null) is "07:13:00.550" PASS stepDown("07:13:00.500", 0.100, "00:00:00.050", null) is "07:13:00.450" -PASS test("07:13:00.500", 0.100, null, null, ["Delete", "ArrowUp"]) is "07:13" +PASS test("07:13:00.500", 0.100, null, null, ["Delete", "ArrowUp"]) is "07:13:00.000" PASS test("07:13:00.500", 0.100, null, null, ["Delete", "ArrowDown"]) is "07:13:00.900" PASS test("07:13:00.500", 0.100, "00:00:00.050", null, ["Delete", "ArrowUp"]) is "07:13:00.050" PASS test("07:13:00.500", 0.100, "00:00:00.050", null, ["Delete", "ArrowDown"]) is "07:13:00.950" @@ -43,26 +43,26 @@ PASS stepDown("07:13:00.010", 0.001, "07:13:00.010", "07:13:01.020") is "07:13:00.009" Seconds PASS stepUp("07:13:00", 1, null, null) is "07:13:01" -PASS stepDown("07:13:01", 1, null, null) is "07:13" -PASS stepUp("07:13:59", 0.001, null, null) is "07:13" -PASS stepDown("07:13:00", 0.001, null, null) is "07:13:59" +PASS stepDown("07:13:01", 1, null, null) is "07:13:00" +PASS stepUp("07:13:59", 0.001, null, null) is "07:13:00.000" +PASS stepDown("07:13:00", 0.001, null, null) is "07:13:59.000" PASS stepUp("07:13:00", 10, null, null) is "07:13:10" PASS stepDown("07:13:30", 10, null, null) is "07:13:20" -PASS stepUp("07:13:50", 10, null, null) is "07:13" +PASS stepUp("07:13:50", 10, null, null) is "07:13:00" PASS stepDown("07:13:00", 10, null, null) is "07:13:50" PASS stepUp("07:13:09", 10, null, null) is "07:13:10" PASS stepDown("07:13:11", 10, null, null) is "07:13:10" -PASS stepUp("07:13:30", 2.5, null, null) is "07:13:31" -PASS stepDown("07:13:30", 2.5, null, null) is "07:13:29" -PASS stepUp("07:13:30", 0, null, null) is "07:13" -PASS stepDown("07:13:30", 0, null, null) is "07:13" -PASS stepUp("07:13:30", 3600, null, null) is "07:13" -PASS stepDown("07:13:30", 3600, null, null) is "07:13" +PASS stepUp("07:13:30", 2.5, null, null) is "07:13:31.000" +PASS stepDown("07:13:30", 2.5, null, null) is "07:13:29.000" +PASS stepUp("07:13:30", 0, null, null) is "07:13:00" +PASS stepDown("07:13:30", 0, null, null) is "07:13:00" +PASS stepUp("07:13:30", 3600, null, null) is "07:13:00" +PASS stepDown("07:13:30", 3600, null, null) is "07:13:00" PASS stepUp("07:13:30", 11, null, null) is "07:13:31" PASS stepDown("07:13:30", 11, null, null) is "07:13:29" PASS stepUp("07:13:30", 10, "00:00:05", null) is "07:13:35" PASS stepDown("07:13:30", 10, "00:00:05", null) is "07:13:25" -PASS test("07:13:30", 10, null, null, ["Delete", "ArrowUp"]) is "07:13" +PASS test("07:13:30", 10, null, null, ["Delete", "ArrowUp"]) is "07:13:00" PASS test("07:13:30", 10, null, null, ["Delete", "ArrowDown"]) is "07:13:50" PASS test("07:13:30", 10, "00:00:05", null, ["Delete", "ArrowUp"]) is "07:13:05" PASS test("07:13:30", 10, "00:00:05", null, ["Delete", "ArrowDown"]) is "07:13:55" @@ -77,18 +77,18 @@ PASS stepUp("07:13:10", 1, "07:13:10", "07:14:20") is "07:13:11" PASS stepDown("07:13:10", 1, "07:13:10", "07:14:20") is "07:13:09" Minutes -PASS stepUp("07:13", 1, null, null) is "07:14" -PASS stepDown("07:13", 1, null, null) is "07:12" -PASS stepUp("07:59", 0.001, null, null) is "07:00" -PASS stepDown("07:00", 0.001, null, null) is "07:59" +PASS stepUp("07:13", 1, null, null) is "07:14:00" +PASS stepDown("07:13", 1, null, null) is "07:12:00" +PASS stepUp("07:59", 0.001, null, null) is "07:00:00.000" +PASS stepDown("07:00", 0.001, null, null) is "07:59:00.000" PASS stepUp("07:00", 600, null, null) is "07:10" PASS stepDown("07:10", 600, null, null) is "07:00" PASS stepUp("07:50", 600, null, null) is "07:00" PASS stepDown("07:00", 600, null, null) is "07:50" PASS stepUp("07:13", 600, null, null) is "07:20" PASS stepDown("07:13", 600, null, null) is "07:10" -PASS stepUp("07:13", 150, null, null) is "07:14" -PASS stepDown("07:13", 150, null, null) is "07:12" +PASS stepUp("07:13", 150, null, null) is "07:14:00" +PASS stepDown("07:13", 150, null, null) is "07:12:00" PASS stepUp("07:13", 0, null, null) is "07:14" PASS stepDown("07:13", 0, null, null) is "07:12" PASS stepUp("07:13", 36000, null, null) is "07:00" @@ -101,16 +101,16 @@ PASS test("07:13", 600, null, null, ["Delete", "ArrowDown"]) is "07:50" PASS test("07:13", 600, "00:05", null, ["Delete", "ArrowUp"]) is "07:05" PASS test("07:13", 600, "00:05", null, ["Delete", "ArrowDown"]) is "07:55" -PASS stepUp("07:10", 1, "07:05", "07:10") is "07:05" -PASS stepDown("07:05", 1, "07:05", "07:10") is "07:10" -PASS stepUp("07:05", 1, "07:10", "07:20") is "07:10" -PASS stepDown("07:05", 1, "07:10", "07:20") is "07:20" -PASS stepUp("07:05", 1, "07:00", "07:00") is "07:00" -PASS stepDown("07:05", 1, "07:00", "07:00") is "07:00" +PASS stepUp("07:10", 1, "07:05", "07:10") is "07:05:00" +PASS stepDown("07:05", 1, "07:05", "07:10") is "07:10:00" +PASS stepUp("07:05", 1, "07:10", "07:20") is "07:10:00" +PASS stepDown("07:05", 1, "07:10", "07:20") is "07:20:00" +PASS stepUp("07:05", 1, "07:00", "07:00") is "07:00:00" +PASS stepDown("07:05", 1, "07:00", "07:00") is "07:00:00" PASS stepUp("07:35", 600, "07:10", "07:35") is "07:10" PASS stepDown("07:35", 600, "07:10", "07:35") is "07:30" -PASS stepUp("07:10", 1, "07:10", "08:20") is "07:11" -PASS stepDown("07:10", 1, "07:10", "08:20") is "07:09" +PASS stepUp("07:10", 1, "07:10", "08:20") is "07:11:00" +PASS stepDown("07:10", 1, "07:10", "08:20") is "07:09:00" PASS successfullyParsed is true
diff --git a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html index 1385835..5392df5 100644 --- a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html +++ b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html
@@ -70,18 +70,18 @@ assert_own_property(window, 'internals'); assert_own_property(window, 'eventSender'); - assert_input_value_after_up('07:00', 1, '08:00'); - assert_input_value_after_down('07:00', 1, '06:00'); - assert_input_value_after_up('11:00', 1, '12:00'); - assert_input_value_after_down('00:00', 1, '23:00'); + assert_input_value_after_up('07:00', 1, '08:00:00'); + assert_input_value_after_down('07:00', 1, '06:00:00'); + assert_input_value_after_up('11:00', 1, '12:00:00'); + assert_input_value_after_down('00:00', 1, '23:00:00'); assert_input_value_after_up('06:00', 7200, '08:00'); assert_input_value_after_down('06:00', 7200, '04:00'); assert_input_value_after_up('10:00', 7200, '12:00'); assert_input_value_after_down('00:00', 7200, '22:00'); assert_input_value_after_up('07:00', 7200, '08:00'); assert_input_value_after_down('07:00', 7200, '06:00'); - assert_input_value_after_up('06:00', 3601, '07:00'); - assert_input_value_after_down('06:00', 3601, '05:00'); + assert_input_value_after_up('06:00', 3601, '07:00:00'); + assert_input_value_after_down('06:00', 3601, '05:00:00'); assert_input_value_after_up('06:00', 0, '07:00'); assert_input_value_after_down('06:00', 0, '05:00'); assert_input_value_after_up('06:00', 86400, '00:00'); @@ -94,24 +94,24 @@ assert_input_value_with_limits_after_deletedown('06:00', 7200, null, null, '00:00', '12:00 AM'); assert_input_value_with_limits_after_deleteup('06:00', 7200, '01:00', null, '01:00'); assert_input_value_with_limits_after_deletedown('06:00', 7200, '01:00', null, '11:00'); - assert_input_value_with_limits_after_up('17:00', 1, '17:00', '20:00', '18:00'); - assert_input_value_with_limits_after_down('17:00', 1, '17:00', '20:00', '20:00'); - assert_input_value_with_limits_after_up('17:00', 1, '15:00', '17:00', '15:00'); - assert_input_value_with_limits_after_down('17:00', 1, '15:00', '17:00', '16:00'); - assert_input_value_with_limits_after_up('15:00', 1, '17:00', '20:00', '17:00'); - assert_input_value_with_limits_after_down('15:00', 1, '17:00', '20:00', '20:00'); - assert_input_value_with_limits_after_up('15:00', 1, '13:00', '13:00', '13:00'); - assert_input_value_with_limits_after_down('15:00', 1, '13:00', '13:00', '13:00'); - assert_input_value_with_limits_after_up('12:00', 1, '12:00', '15:00', '13:00'); - assert_input_value_with_limits_after_down('12:00', 1, '12:00', '15:00', '11:00'); - assert_input_value_with_limits_after_up('15:00', 1, '12:00', '15:00', '16:00'); - assert_input_value_with_limits_after_down('15:00', 1, '12:00', '15:00', '14:00'); - assert_input_value_with_limits_after_up('12:00', 1, '10:00', '12:00', '13:00'); - assert_input_value_with_limits_after_down('12:00', 1, '10:00', '12:00', '11:00'); - assert_input_value_with_limits_after_up('00:00', 1, '00:00', '03:00', '01:00'); - assert_input_value_with_limits_after_down('00:00', 1, '00:00', '03:00', '23:00'); - assert_input_value_with_limits_after_up('15:00', 1, '10:00', '15:00', '16:00'); - assert_input_value_with_limits_after_down('10:00', 1, '10:00', '15:00', '09:00'); + assert_input_value_with_limits_after_up('17:00', 1, '17:00', '20:00', '18:00:00'); + assert_input_value_with_limits_after_down('17:00', 1, '17:00', '20:00', '20:00:00'); + assert_input_value_with_limits_after_up('17:00', 1, '15:00', '17:00', '15:00:00'); + assert_input_value_with_limits_after_down('17:00', 1, '15:00', '17:00', '16:00:00'); + assert_input_value_with_limits_after_up('15:00', 1, '17:00', '20:00', '17:00:00'); + assert_input_value_with_limits_after_down('15:00', 1, '17:00', '20:00', '20:00:00'); + assert_input_value_with_limits_after_up('15:00', 1, '13:00', '13:00', '13:00:00'); + assert_input_value_with_limits_after_down('15:00', 1, '13:00', '13:00', '13:00:00'); + assert_input_value_with_limits_after_up('12:00', 1, '12:00', '15:00', '13:00:00'); + assert_input_value_with_limits_after_down('12:00', 1, '12:00', '15:00', '11:00:00'); + assert_input_value_with_limits_after_up('15:00', 1, '12:00', '15:00', '16:00:00'); + assert_input_value_with_limits_after_down('15:00', 1, '12:00', '15:00', '14:00:00'); + assert_input_value_with_limits_after_up('12:00', 1, '10:00', '12:00', '13:00:00'); + assert_input_value_with_limits_after_down('12:00', 1, '10:00', '12:00', '11:00:00'); + assert_input_value_with_limits_after_up('00:00', 1, '00:00', '03:00', '01:00:00'); + assert_input_value_with_limits_after_down('00:00', 1, '00:00', '03:00', '23:00:00'); + assert_input_value_with_limits_after_up('15:00', 1, '10:00', '15:00', '16:00:00'); + assert_input_value_with_limits_after_down('10:00', 1, '10:00', '15:00', '09:00:00'); assert_input_value_with_limits_after_up('17:00', 7200, '17:00', '20:00', '19:00'); assert_input_value_with_limits_after_down('17:00', 7200, '17:00', '20:00', '19:00'); assert_input_value_with_limits_after_up('17:00', 7200, '17:00', '18:00', '17:00');
diff --git a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html index 2b2897dd..85c865a6 100644 --- a/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html +++ b/third_party/blink/web_tests/fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html
@@ -67,24 +67,24 @@ keyDown('ArrowRight'); keyDown('ArrowRight'); shouldBeEqualToString('stepUp("07:13:00.000", 0.001, null, null)', '07:13:00.001'); -shouldBeEqualToString('stepDown("07:13:00.001", 0.001, null, null)', '07:13'); -shouldBeEqualToString('stepUp("07:13:00.999", 0.001, null, null)', '07:13'); +shouldBeEqualToString('stepDown("07:13:00.001", 0.001, null, null)', '07:13:00.000'); +shouldBeEqualToString('stepUp("07:13:00.999", 0.001, null, null)', '07:13:00.000'); shouldBeEqualToString('stepDown("07:13:00.000", 0.001, null, null)', '07:13:00.999'); shouldBeEqualToString('stepUp("07:13:00.000", 0.250, null, null)', '07:13:00.250'); shouldBeEqualToString('stepDown("07:13:00.500", 0.250, null, null)', '07:13:00.250'); -shouldBeEqualToString('stepUp("07:13:00.750", 0.250, null, null)', '07:13'); +shouldBeEqualToString('stepUp("07:13:00.750", 0.250, null, null)', '07:13:00.000'); shouldBeEqualToString('stepDown("07:13:00.000", 0.250, null, null)', '07:13:00.750'); shouldBeEqualToString('stepUp("07:13:00.099", 0.100, null, null)', '07:13:00.100'); shouldBeEqualToString('stepDown("07:13:00.101", 0.100, null, null)', '07:13:00.100'); shouldBeEqualToString('stepUp("07:13:00.500", 0.0001, null, null)', '07:13:00.501'); shouldBeEqualToString('stepDown("07:13:00.500", 0.0001, null, null)', '07:13:00.499'); -shouldBeEqualToString('stepUp("07:13:00.500", 0, null, null)', '07:13'); -shouldBeEqualToString('stepDown("07:13:00.500", 0, null, null)', '07:13'); -shouldBeEqualToString('stepUp("07:13:00.500", 60, null, null)', '07:13'); -shouldBeEqualToString('stepDown("07:13:00.500", 60, null, null)', '07:13'); +shouldBeEqualToString('stepUp("07:13:00.500", 0, null, null)', '07:13:00.000'); +shouldBeEqualToString('stepDown("07:13:00.500", 0, null, null)', '07:13:00.000'); +shouldBeEqualToString('stepUp("07:13:00.500", 60, null, null)', '07:13:00.000'); +shouldBeEqualToString('stepDown("07:13:00.500", 60, null, null)', '07:13:00.000'); shouldBeEqualToString('stepUp("07:13:00.500", 0.100, "00:00:00.050", null)', '07:13:00.550'); shouldBeEqualToString('stepDown("07:13:00.500", 0.100, "00:00:00.050", null)', '07:13:00.450'); -shouldBeEqualToString('test("07:13:00.500", 0.100, null, null, ["Delete", "ArrowUp"])', '07:13'); +shouldBeEqualToString('test("07:13:00.500", 0.100, null, null, ["Delete", "ArrowUp"])', '07:13:00.000'); shouldBeEqualToString('test("07:13:00.500", 0.100, null, null, ["Delete", "ArrowDown"])', '07:13:00.900'); shouldBeEqualToString('test("07:13:00.500", 0.100, "00:00:00.050", null, ["Delete", "ArrowUp"])', '07:13:00.050'); shouldBeEqualToString('test("07:13:00.500", 0.100, "00:00:00.050", null, ["Delete", "ArrowDown"])', '07:13:00.950'); @@ -102,26 +102,26 @@ debug('Seconds'); keyDown('ArrowLeft'); shouldBeEqualToString('stepUp("07:13:00", 1, null, null)', '07:13:01'); -shouldBeEqualToString('stepDown("07:13:01", 1, null, null)', '07:13'); -shouldBeEqualToString('stepUp("07:13:59", 0.001, null, null)', '07:13'); -shouldBeEqualToString('stepDown("07:13:00", 0.001, null, null)', '07:13:59'); +shouldBeEqualToString('stepDown("07:13:01", 1, null, null)', '07:13:00'); +shouldBeEqualToString('stepUp("07:13:59", 0.001, null, null)', '07:13:00.000'); +shouldBeEqualToString('stepDown("07:13:00", 0.001, null, null)', '07:13:59.000'); shouldBeEqualToString('stepUp("07:13:00", 10, null, null)', '07:13:10'); shouldBeEqualToString('stepDown("07:13:30", 10, null, null)', '07:13:20'); -shouldBeEqualToString('stepUp("07:13:50", 10, null, null)', '07:13'); +shouldBeEqualToString('stepUp("07:13:50", 10, null, null)', '07:13:00'); shouldBeEqualToString('stepDown("07:13:00", 10, null, null)', '07:13:50'); shouldBeEqualToString('stepUp("07:13:09", 10, null, null)', '07:13:10'); shouldBeEqualToString('stepDown("07:13:11", 10, null, null)', '07:13:10'); -shouldBeEqualToString('stepUp("07:13:30", 2.5, null, null)', '07:13:31'); -shouldBeEqualToString('stepDown("07:13:30", 2.5, null, null)', '07:13:29'); -shouldBeEqualToString('stepUp("07:13:30", 0, null, null)', '07:13'); -shouldBeEqualToString('stepDown("07:13:30", 0, null, null)', '07:13'); -shouldBeEqualToString('stepUp("07:13:30", 3600, null, null)', '07:13'); -shouldBeEqualToString('stepDown("07:13:30", 3600, null, null)', '07:13'); +shouldBeEqualToString('stepUp("07:13:30", 2.5, null, null)', '07:13:31.000'); +shouldBeEqualToString('stepDown("07:13:30", 2.5, null, null)', '07:13:29.000'); +shouldBeEqualToString('stepUp("07:13:30", 0, null, null)', '07:13:00'); +shouldBeEqualToString('stepDown("07:13:30", 0, null, null)', '07:13:00'); +shouldBeEqualToString('stepUp("07:13:30", 3600, null, null)', '07:13:00'); +shouldBeEqualToString('stepDown("07:13:30", 3600, null, null)', '07:13:00'); shouldBeEqualToString('stepUp("07:13:30", 11, null, null)', '07:13:31'); shouldBeEqualToString('stepDown("07:13:30", 11, null, null)', '07:13:29'); shouldBeEqualToString('stepUp("07:13:30", 10, "00:00:05", null)', '07:13:35'); shouldBeEqualToString('stepDown("07:13:30", 10, "00:00:05", null)', '07:13:25'); -shouldBeEqualToString('test("07:13:30", 10, null, null, ["Delete", "ArrowUp"])', '07:13'); +shouldBeEqualToString('test("07:13:30", 10, null, null, ["Delete", "ArrowUp"])', '07:13:00'); shouldBeEqualToString('test("07:13:30", 10, null, null, ["Delete", "ArrowDown"])', '07:13:50'); shouldBeEqualToString('test("07:13:30", 10, "00:00:05", null, ["Delete", "ArrowUp"])', '07:13:05'); shouldBeEqualToString('test("07:13:30", 10, "00:00:05", null, ["Delete", "ArrowDown"])', '07:13:55'); @@ -138,18 +138,18 @@ debug('Minutes'); keyDown('ArrowLeft'); -shouldBeEqualToString('stepUp("07:13", 1, null, null)', '07:14'); -shouldBeEqualToString('stepDown("07:13", 1, null, null)', '07:12'); -shouldBeEqualToString('stepUp("07:59", 0.001, null, null)', '07:00'); -shouldBeEqualToString('stepDown("07:00", 0.001, null, null)', '07:59'); +shouldBeEqualToString('stepUp("07:13", 1, null, null)', '07:14:00'); +shouldBeEqualToString('stepDown("07:13", 1, null, null)', '07:12:00'); +shouldBeEqualToString('stepUp("07:59", 0.001, null, null)', '07:00:00.000'); +shouldBeEqualToString('stepDown("07:00", 0.001, null, null)', '07:59:00.000'); shouldBeEqualToString('stepUp("07:00", 600, null, null)', '07:10'); shouldBeEqualToString('stepDown("07:10", 600, null, null)', '07:00'); shouldBeEqualToString('stepUp("07:50", 600, null, null)', '07:00'); shouldBeEqualToString('stepDown("07:00", 600, null, null)', '07:50'); shouldBeEqualToString('stepUp("07:13", 600, null, null)', '07:20'); shouldBeEqualToString('stepDown("07:13", 600, null, null)', '07:10'); -shouldBeEqualToString('stepUp("07:13", 150, null, null)', '07:14'); -shouldBeEqualToString('stepDown("07:13", 150, null, null)', '07:12'); +shouldBeEqualToString('stepUp("07:13", 150, null, null)', '07:14:00'); +shouldBeEqualToString('stepDown("07:13", 150, null, null)', '07:12:00'); shouldBeEqualToString('stepUp("07:13", 0, null, null)', '07:14'); shouldBeEqualToString('stepDown("07:13", 0, null, null)', '07:12'); shouldBeEqualToString('stepUp("07:13", 36000, null, null)', '07:00'); @@ -162,16 +162,16 @@ shouldBeEqualToString('test("07:13", 600, null, null, ["Delete", "ArrowDown"])', '07:50'); shouldBeEqualToString('test("07:13", 600, "00:05", null, ["Delete", "ArrowUp"])', '07:05'); shouldBeEqualToString('test("07:13", 600, "00:05", null, ["Delete", "ArrowDown"])', '07:55'); -shouldBeEqualToString('stepUp("07:10", 1, "07:05", "07:10")', '07:05'); -shouldBeEqualToString('stepDown("07:05", 1, "07:05", "07:10")', '07:10'); -shouldBeEqualToString('stepUp("07:05", 1, "07:10", "07:20")', '07:10'); -shouldBeEqualToString('stepDown("07:05", 1, "07:10", "07:20")', '07:20'); -shouldBeEqualToString('stepUp("07:05", 1, "07:00", "07:00")', '07:00'); -shouldBeEqualToString('stepDown("07:05", 1, "07:00", "07:00")', '07:00'); +shouldBeEqualToString('stepUp("07:10", 1, "07:05", "07:10")', '07:05:00'); +shouldBeEqualToString('stepDown("07:05", 1, "07:05", "07:10")', '07:10:00'); +shouldBeEqualToString('stepUp("07:05", 1, "07:10", "07:20")', '07:10:00'); +shouldBeEqualToString('stepDown("07:05", 1, "07:10", "07:20")', '07:20:00'); +shouldBeEqualToString('stepUp("07:05", 1, "07:00", "07:00")', '07:00:00'); +shouldBeEqualToString('stepDown("07:05", 1, "07:00", "07:00")', '07:00:00'); shouldBeEqualToString('stepUp("07:35", 600, "07:10", "07:35")', '07:10'); shouldBeEqualToString('stepDown("07:35", 600, "07:10", "07:35")', '07:30'); -shouldBeEqualToString('stepUp("07:10", 1, "07:10", "08:20")', '07:11'); -shouldBeEqualToString('stepDown("07:10", 1, "07:10", "08:20")', '07:09'); +shouldBeEqualToString('stepUp("07:10", 1, "07:10", "08:20")', '07:11:00'); +shouldBeEqualToString('stepDown("07:10", 1, "07:10", "08:20")', '07:09:00'); debug(''); document.body.removeChild(input);
diff --git a/third_party/blink/web_tests/fast/mediastream/argument-types-expected.txt b/third_party/blink/web_tests/fast/mediastream/argument-types-expected.txt index d5998ce..3288370 100644 --- a/third_party/blink/web_tests/fast/mediastream/argument-types-expected.txt +++ b/third_party/blink/web_tests/fast/mediastream/argument-types-expected.txt
@@ -8,12 +8,12 @@ PASS navigator.webkitGetUserMedia({video: true}, callbackFunction, callbackFunction) did not throw exception. PASS navigator.webkitGetUserMedia({audio: true}, callbackFunction, callbackFunction) did not throw exception. PASS navigator.webkitGetUserMedia({audio: true, video: true}, callbackFunction, callbackFunction) did not throw exception. -PASS navigator.webkitGetUserMedia(-Infinity, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': cannot convert to dictionary.. -PASS navigator.webkitGetUserMedia(42, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': cannot convert to dictionary.. -PASS navigator.webkitGetUserMedia(Infinity, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': cannot convert to dictionary.. +PASS navigator.webkitGetUserMedia(-Infinity, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': The provided value is not of type 'MediaStreamConstraints'.. +PASS navigator.webkitGetUserMedia(42, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': The provided value is not of type 'MediaStreamConstraints'.. +PASS navigator.webkitGetUserMedia(Infinity, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': The provided value is not of type 'MediaStreamConstraints'.. PASS navigator.webkitGetUserMedia(emptyFunction, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': At least one of audio and video must be requested. PASS navigator.webkitGetUserMedia(null, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': At least one of audio and video must be requested. -PASS navigator.webkitGetUserMedia(true, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': cannot convert to dictionary.. +PASS navigator.webkitGetUserMedia(true, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': The provided value is not of type 'MediaStreamConstraints'.. PASS navigator.webkitGetUserMedia(undefined, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': At least one of audio and video must be requested. PASS navigator.webkitGetUserMedia({ }, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': At least one of audio and video must be requested. PASS navigator.webkitGetUserMedia({foo: true }, emptyFunction, emptyFunction) threw exception TypeError: Failed to execute 'webkitGetUserMedia' on 'Navigator': At least one of audio and video must be requested.
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-expected.txt b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-expected.txt index fd69d8b..31f2502 100644 --- a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-expected.txt +++ b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-expected.txt
@@ -11,7 +11,7 @@ PASS new RTCPeerConnection(undefined); did not throw exception. PASS new RTCPeerConnection({}); did not throw exception. PASS new RTCPeerConnection(); did not throw exception. -PASS new RTCPeerConnection(''); threw exception TypeError: Failed to construct 'RTCPeerConnection': cannot convert to dictionary.. +PASS new RTCPeerConnection(''); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value is not of type 'RTCConfiguration'.. PASS new RTCPeerConnection({iceServers:[]}); did not throw exception. PASS new RTCPeerConnection({iceServers:[{url:'stun:foo.com'}]}); did not throw exception. PASS new RTCPeerConnection({iceServers:[{url:'turn:foo.com', username:'x', credential:'x'}]}); did not throw exception. @@ -20,34 +20,34 @@ PASS new RTCPeerConnection({iceServers:[{urls:['stun:foo.com', 'turn:foo.com'], username:'x', credential:'x'}]}); did not throw exception. PASS new RTCPeerConnection({iceServers:[{urls:['stun:foo.com', 'turn:foo.com']}]}); threw exception InvalidAccessError: Failed to construct 'RTCPeerConnection': Both username and credential are required when the URL scheme is "turn" or "turns".. PASS new RTCPeerConnection({fooServers:[]}); did not throw exception. -PASS new RTCPeerConnection({iceServers:true}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value cannot be converted to a sequence.. -PASS new RTCPeerConnection({iceServers:[1, 2, 3]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': cannot convert to dictionary.. +PASS new RTCPeerConnection({iceServers:true}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceServers' property from 'RTCConfiguration': The provided value cannot be converted to a sequence.. +PASS new RTCPeerConnection({iceServers:[1, 2, 3]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceServers' property from 'RTCConfiguration': The provided value is not of type 'RTCIceServer'.. PASS new RTCPeerConnection({iceServers:[{}]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Malformed RTCIceServer. PASS new RTCPeerConnection({iceServers:[{url:'foo'}]}); threw exception SyntaxError: Failed to construct 'RTCPeerConnection': 'foo' is not a valid URL.. PASS new RTCPeerConnection({iceServers:[{urls:'unsupported:scheme'}]}); threw exception SyntaxError: Failed to construct 'RTCPeerConnection': 'unsupported' is not one of the supported URL schemes 'stun', 'turn' or 'turns'.. PASS new RTCPeerConnection({iceServers:[{urls:[1, 'turn:foo.com']}]}); threw exception SyntaxError: Failed to construct 'RTCPeerConnection': '1' is not a valid URL.. PASS new RTCPeerConnection({iceServers:[], iceTransportPolicy:'relay'}); did not throw exception. PASS new RTCPeerConnection({iceServers:[], iceTransportPolicy:'all'}); did not throw exception. -PASS new RTCPeerConnection({iceServers:[], iceTransportPolicy:'none'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value 'none' is not a valid enum value of type RTCIceTransportPolicy.. -PASS new RTCPeerConnection({iceServers:[], iceTransportPolicy:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value 'foo' is not a valid enum value of type RTCIceTransportPolicy.. +PASS new RTCPeerConnection({iceServers:[], iceTransportPolicy:'none'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceTransportPolicy' property from 'RTCConfiguration': The provided value 'none' is not a valid enum value of type RTCIceTransportPolicy.. +PASS new RTCPeerConnection({iceServers:[], iceTransportPolicy:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceTransportPolicy' property from 'RTCConfiguration': The provided value 'foo' is not a valid enum value of type RTCIceTransportPolicy.. PASS new RTCPeerConnection({iceServers:[], iceTransports:'relay'}); did not throw exception. PASS new RTCPeerConnection({iceServers:[], iceTransports:'all'}); did not throw exception. -PASS new RTCPeerConnection({iceServers:[], iceTransports:'none'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value 'none' is not a valid enum value of type RTCIceTransportPolicy.. -PASS new RTCPeerConnection({iceServers:[], iceTransports:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value 'foo' is not a valid enum value of type RTCIceTransportPolicy.. +PASS new RTCPeerConnection({iceServers:[], iceTransports:'none'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceTransports' property from 'RTCConfiguration': The provided value 'none' is not a valid enum value of type RTCIceTransportPolicy.. +PASS new RTCPeerConnection({iceServers:[], iceTransports:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceTransports' property from 'RTCConfiguration': The provided value 'foo' is not a valid enum value of type RTCIceTransportPolicy.. PASS new RTCPeerConnection({iceServers:[], bundlePolicy:'balanced'}); did not throw exception. PASS new RTCPeerConnection({iceServers:[], bundlePolicy:'max-bundle'}); did not throw exception. PASS new RTCPeerConnection({iceServers:[], bundlePolicy:'max-compat'}); did not throw exception. -PASS new RTCPeerConnection({iceServers:[], bundlePolicy:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value 'foo' is not a valid enum value of type RTCBundlePolicy.. +PASS new RTCPeerConnection({iceServers:[], bundlePolicy:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'bundlePolicy' property from 'RTCConfiguration': The provided value 'foo' is not a valid enum value of type RTCBundlePolicy.. PASS new RTCPeerConnection({iceServers:[], rtcpMuxPolicy:'negotiate'}); did not throw exception. PASS new RTCPeerConnection({iceServers:[], rtcpMuxPolicy:'require'}); did not throw exception. -PASS new RTCPeerConnection({iceServers:[], rtcpMuxPolicy:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value 'foo' is not a valid enum value of type RTCRtcpMuxPolicy.. +PASS new RTCPeerConnection({iceServers:[], rtcpMuxPolicy:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'rtcpMuxPolicy' property from 'RTCConfiguration': The provided value 'foo' is not a valid enum value of type RTCRtcpMuxPolicy.. PASS new RTCPeerConnection({iceCandidatePoolSize:0}); did not throw exception. PASS new RTCPeerConnection({iceCandidatePoolSize:1}); did not throw exception. PASS new RTCPeerConnection({iceCandidatePoolSize:255}); did not throw exception. -PASS new RTCPeerConnection({iceCandidatePoolSize:-1}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Value is outside the 'octet' value range.. -PASS new RTCPeerConnection({iceCandidatePoolSize:99999999}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Value is outside the 'octet' value range.. -PASS new RTCPeerConnection({iceCandidatePoolSize:256}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Value is outside the 'octet' value range.. -PASS new RTCPeerConnection({iceCandidatePoolSize:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Value is not of type 'octet'.. +PASS new RTCPeerConnection({iceCandidatePoolSize:-1}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceCandidatePoolSize' property from 'RTCConfiguration': Value is outside the 'octet' value range.. +PASS new RTCPeerConnection({iceCandidatePoolSize:99999999}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceCandidatePoolSize' property from 'RTCConfiguration': Value is outside the 'octet' value range.. +PASS new RTCPeerConnection({iceCandidatePoolSize:256}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceCandidatePoolSize' property from 'RTCConfiguration': Value is outside the 'octet' value range.. +PASS new RTCPeerConnection({iceCandidatePoolSize:'foo'}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'iceCandidatePoolSize' property from 'RTCConfiguration': Value is not of type 'octet'.. PASS new RTCPeerConnection(null, {mandatory:{valid_and_supported_1:1}}); did not throw exception. PASS new RTCPeerConnection(null, {mandatory:{valid_and_supported_1:1, valid_and_supported_2:1}}); did not throw exception. PASS new RTCPeerConnection(null, {optional:[{valid_and_supported_1:0}]}); did not throw exception. @@ -63,11 +63,11 @@ PASS new RTCPeerConnection(null, {valid_and_supported_1:1}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Malformed constraints object.. PASS new RTCPeerConnection(null, {valid_but_unsupported_1:1}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Malformed constraints object.. PASS new RTCPeerConnection(null, {valid_and_supported_2:1, mandatory:{valid_and_supported_1:1}}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Malformed constraints object.. -PASS new RTCPeerConnection({iceServers:[], certificates:null}); threw exception TypeError: Failed to construct 'RTCPeerConnection': The provided value cannot be converted to a sequence.. +PASS new RTCPeerConnection({iceServers:[], certificates:null}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'certificates' property from 'RTCConfiguration': The provided value cannot be converted to a sequence.. PASS new RTCPeerConnection({iceServers:[], certificates:undefined}); did not throw exception. PASS new RTCPeerConnection({iceServers:[], certificates:[]}); did not throw exception. -PASS new RTCPeerConnection({iceServers:[], certificates:[null]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to convert value to 'RTCCertificate'.. -PASS new RTCPeerConnection({iceServers:[], certificates:[1337]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to convert value to 'RTCCertificate'.. +PASS new RTCPeerConnection({iceServers:[], certificates:[null]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'certificates' property from 'RTCConfiguration': Failed to convert value to 'RTCCertificate'.. +PASS new RTCPeerConnection({iceServers:[], certificates:[1337]}); threw exception TypeError: Failed to construct 'RTCPeerConnection': Failed to read the 'certificates' property from 'RTCConfiguration': Failed to convert value to 'RTCCertificate'.. PASS new RTCPeerConnection({iceServers:[], certificates:[certRSA]}, null); did not throw exception. PASS new RTCPeerConnection({iceServers:[], certificates:[certECDSA]}, null); did not throw exception. PASS certExpired.expires <= new Date().getTime() is true
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCSessionDescription-expected.txt b/third_party/blink/web_tests/fast/peerconnection/RTCSessionDescription-expected.txt index 31b17aac..a607da1b 100644 --- a/third_party/blink/web_tests/fast/peerconnection/RTCSessionDescription-expected.txt +++ b/third_party/blink/web_tests/fast/peerconnection/RTCSessionDescription-expected.txt
@@ -11,9 +11,9 @@ PASS sessionDescription.sdp is "foobar" PASS new RTCSessionDescription(); did not throw exception. PASS new RTCSessionDescription({}); did not throw exception. -PASS new RTCSessionDescription(5); threw exception TypeError: Failed to construct 'RTCSessionDescription': cannot convert to dictionary.. -PASS new RTCSessionDescription('foobar'); threw exception TypeError: Failed to construct 'RTCSessionDescription': cannot convert to dictionary.. -PASS new RTCSessionDescription({type:'foobar', sdp:'x'}); threw exception TypeError: Failed to construct 'RTCSessionDescription': The provided value 'foobar' is not a valid enum value of type RTCSdpType.. +PASS new RTCSessionDescription(5); threw exception TypeError: Failed to construct 'RTCSessionDescription': The provided value is not of type 'RTCSessionDescriptionInit'.. +PASS new RTCSessionDescription('foobar'); threw exception TypeError: Failed to construct 'RTCSessionDescription': The provided value is not of type 'RTCSessionDescriptionInit'.. +PASS new RTCSessionDescription({type:'foobar', sdp:'x'}); threw exception TypeError: Failed to construct 'RTCSessionDescription': Failed to read the 'type' property from 'RTCSessionDescriptionInit': The provided value 'foobar' is not a valid enum value of type RTCSdpType.. PASS new RTCSessionDescription({type:'offer', sdp:''}); did not throw exception. PASS new RTCSessionDescription({type:'offer', sdp:'x'}); did not throw exception. PASS new RTCSessionDescription({type:'answer', sdp:'x'}); did not throw exception.
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt index 1d75606..0061740 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/layer-creation/fixed-position-change-out-of-view-in-view-expected.txt
@@ -76,28 +76,10 @@ "backgroundColor": "#FFFFFF" }, { - "name": "LayoutNGBlockFlow (positioned) DIV id='fixed1'", - "bounds": [10, 10], - "contentsOpaque": true, - "backgroundColor": "#C0C0C0", - "transform": 1 - }, - { "name": "VerticalScrollbar", "position": [785, 0], "bounds": [15, 600] } - ], - "transforms": [ - { - "id": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [100, -100, 0, 1] - ] - } ] }
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt index db345e7..be76fff 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/compositing/scrolling-neg-z-index-descendants-expected.txt
@@ -10,6 +10,7 @@ "name": "LayoutNGBlockFlow (relative positioned) DIV id='neg-z'", "position": [1, 11], "bounds": [100, 410], + "contentsOpaqueForText": true, "backfaceVisibility": "hidden", "transform": 2 },
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt index 75b6385..118a1b84 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt
@@ -6,8 +6,7 @@ "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ - [8, 2046, 774, 107], - [8, 2196, 655, 107] + [8, 2046, 774, 257] ], "transform": 1 },
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/outline/inline-outline-repaint-2-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/outline/inline-outline-repaint-2-expected.txt index b26e74c..230f7fe 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/outline/inline-outline-repaint-2-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/outline/inline-outline-repaint-2-expected.txt
@@ -3,7 +3,7 @@ { "name": "Scrolling background of LayoutView #document", "bounds": [800, 600], - "contentsOpaqueForText": true, + "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ [210, 0, 50, 15]
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt index f6343af..2b4c04b 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt
@@ -12,7 +12,9 @@ "bounds": [754, 210], "contentsOpaqueForText": true, "invalidations": [ - [0, 0, 310, 210] + [0, 0, 120, 210], + [210, 20, 100, 100], + [200, 10, 100, 100] ], "transform": 1 }
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt index ec324564..39ee6e6 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/abspos-shift-image-incorrect-repaint-expected.txt
@@ -6,10 +6,11 @@ "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ - [450, 0, 218, 236], [704, 0, 214, 232], + [454, 0, 214, 232], [0, 0, 214, 232], - [700, 217, 4, 19] + [700, 217, 4, 19], + [450, 217, 4, 19] ] }, {
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt index 569cc7b..8971e737 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt
@@ -7,8 +7,8 @@ "backgroundColor": "#FFFFFF", "invalidations": [ [8, 92, 732, 94], - [58, 241, 489, 537], - [58, 142, 489, 537] + [58, 142, 489, 537], + [58, 241, 489, 501] ] }, {
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/scroll-fixed-layer-with-no-visible-content-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/scroll-fixed-layer-with-no-visible-content-expected.txt index bd3eb95..6d7aaba 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/scroll-fixed-layer-with-no-visible-content-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/scroll/scroll-fixed-layer-with-no-visible-content-expected.txt
@@ -5,9 +5,6 @@ "bounds": [785, 2016], "contentsOpaque": true, "backgroundColor": "#FFFFFF", - "invalidations": [ - [0, 0, 100, 100] - ], "transform": 1 }, {
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/table/table-section-visual-overflow-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/table/table-section-visual-overflow-expected.txt index 903380e..4b1d0b3 100644 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/table/table-section-visual-overflow-expected.txt +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/paint/invalidation/table/table-section-visual-overflow-expected.txt
@@ -3,7 +3,7 @@ { "name": "Scrolling background of LayoutView #document", "bounds": [800, 600], - "contentsOpaqueForText": true, + "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ [143, 0, 120, 118],
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update-expected.txt b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update-expected.txt new file mode 100644 index 0000000..899961a --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update-expected.txt
@@ -0,0 +1,14 @@ +{ + "layers": [ + { + "name": "Scrolling background of LayoutView #document", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF", + "invalidations": [ + [10, 0, 41, 14] + ] + } + ] +} +
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt deleted file mode 100644 index 85850a6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt +++ /dev/null
@@ -1,35 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling Contents Layer", - "bounds": [785, 2350], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [8, 2046, 774, 57], - [8, 2196, 655, 57], - [8, 2096, 543, 57], - [8, 2246, 141, 57] - ], - "transform": 1 - }, - { - "name": "ContentsLayer for Vertical Scrollbar Layer", - "position": [785, 0], - "bounds": [15, 600], - "contentsOpaque": true - } - ], - "transforms": [ - { - "id": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, -1750, 0, 1] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt index 652b942..38cc5a4 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt
@@ -11,7 +11,9 @@ "position": [-10, -10], "bounds": [754, 210], "invalidations": [ - [0, 0, 310, 210] + [0, 0, 120, 210], + [210, 20, 100, 100], + [200, 10, 100, 100] ], "transform": 1 }
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/transform/transform-inline-layered-child-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/transform/transform-inline-layered-child-expected.txt deleted file mode 100644 index 978b7eb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/transform/transform-inline-layered-child-expected.txt +++ /dev/null
@@ -1,23 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling Contents Layer", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [135, 361, 159, 194], - [300, 442, 80, 16], - [300, 422, 80, 16], - [300, 402, 80, 16], - [300, 382, 80, 16], - [300, 362, 80, 16], - [300, 342, 80, 16], - [300, 322, 80, 16], - [300, 302, 80, 16], - [300, 462, 48, 16] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/http/tests/notifications/serviceworkerregistration-document-actions-throw.html b/third_party/blink/web_tests/http/tests/notifications/serviceworkerregistration-document-actions-throw.html index 72c6c46..61a651c5 100644 --- a/third_party/blink/web_tests/http/tests/notifications/serviceworkerregistration-document-actions-throw.html +++ b/third_party/blink/web_tests/http/tests/notifications/serviceworkerregistration-document-actions-throw.html
@@ -25,7 +25,7 @@ actions: [{ title: "Foo" }] }).then(unreached_fulfillment(test)).catch(function(error) { assert_equals(error.name, 'TypeError'); - assert_equals(error.message, "Failed to execute 'showNotification' on 'ServiceWorkerRegistration': required member action is undefined."); + assert_equals(error.message, "Failed to execute 'showNotification' on 'ServiceWorkerRegistration': Failed to read the 'actions' property from 'NotificationOptions': Failed to read the 'action' property from 'NotificationAction': Failed to read the 'action' property from 'NotificationAction': Required member is undefined."); test.done(); }); }).catch(unreached_rejection(test)); @@ -42,7 +42,7 @@ actions: [{ action: "foo" }] }).then(unreached_fulfillment(test)).catch(function(error) { assert_equals(error.name, 'TypeError'); - assert_equals(error.message, "Failed to execute 'showNotification' on 'ServiceWorkerRegistration': required member title is undefined."); + assert_equals(error.message, "Failed to execute 'showNotification' on 'ServiceWorkerRegistration': Failed to read the 'actions' property from 'NotificationOptions': Failed to read the 'title' property from 'NotificationAction': Failed to read the 'title' property from 'NotificationAction': Required member is undefined."); test.done(); }); }).catch(unreached_rejection(test));
diff --git a/third_party/blink/web_tests/http/tests/payments/payment-request-app-store-billing-optional-total.html b/third_party/blink/web_tests/http/tests/payments/payment-request-app-store-billing-optional-total.html index e047251..45819f7 100644 --- a/third_party/blink/web_tests/http/tests/payments/payment-request-app-store-billing-optional-total.html +++ b/third_party/blink/web_tests/http/tests/payments/payment-request-app-store-billing-optional-total.html
@@ -33,9 +33,9 @@ } catch (err) { let expectedMessage; if (total === null) { - expectedMessage = "Failed to construct 'PaymentRequest': Missing required member(s): amount, label."; + expectedMessage = "Failed to construct 'PaymentRequest': Failed to read the 'total' property from 'PaymentDetailsInit': The provided value is not of type 'PaymentItem'."; } else { - expectedMessage = "Failed to construct 'PaymentRequest': required member amount is undefined."; + expectedMessage = "Failed to construct 'PaymentRequest': Failed to read the 'total' property from 'PaymentDetailsInit': Failed to read the 'amount' property from 'PaymentItem': Failed to read the 'amount' property from 'PaymentItem': Required member is undefined."; } assert_equals(err.message, expectedMessage, `Error messages mismatch.`); return; @@ -53,11 +53,11 @@ } catch (err) { let expectedMessage; if (total === null) { - expectedMessage = "Failed to construct 'PaymentRequest': Missing required member(s): amount, label."; + expectedMessage = "Failed to construct 'PaymentRequest': Failed to read the 'total' property from 'PaymentDetailsInit': The provided value is not of type 'PaymentItem'."; } else if (["omitted", undefined].includes(total)) { expectedMessage = "Failed to construct 'PaymentRequest': required member total is undefined."; } else { - expectedMessage = "Failed to construct 'PaymentRequest': required member amount is undefined."; + expectedMessage = "Failed to construct 'PaymentRequest': Failed to read the 'total' property from 'PaymentDetailsInit': Failed to read the 'amount' property from 'PaymentItem': Failed to read the 'amount' property from 'PaymentItem': Required member is undefined."; } assert_equals(err.message, expectedMessage, `Error messages mismatch.`);
diff --git a/third_party/blink/web_tests/media/encrypted-media/encrypted-media-session-closed-event.html b/third_party/blink/web_tests/media/encrypted-media/encrypted-media-session-closed-event.html index 2be5a51..cf59ab6 100644 --- a/third_party/blink/web_tests/media/encrypted-media/encrypted-media-session-closed-event.html +++ b/third_party/blink/web_tests/media/encrypted-media/encrypted-media-session-closed-event.html
@@ -23,14 +23,14 @@ return mediaKeySession.generateRequest(initDataType, initData); }).then(function() { // Wait for the session to be closed. - mediaKeySession.closed.then(function(result) { - assert_equals(result, undefined); + mediaKeySession.closed.then(function(reason) { + assert_equals(reason, "closed-by-application"); // Now that the session is closed, verify that the // closed attribute immediately returns a fulfilled // promise. return mediaKeySession.closed; - }).then(function(result) { - assert_equals(result, undefined); + }).then(function(reason) { + assert_equals(reason, "closed-by-application"); test.done(); });
diff --git a/third_party/blink/web_tests/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt b/third_party/blink/web_tests/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt index df1bc49..5ce8b84b 100644 --- a/third_party/blink/web_tests/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt +++ b/third_party/blink/web_tests/paint/invalidation/overflow/overflow-changed-on-child-of-composited-layer-expected.txt
@@ -11,7 +11,9 @@ "position": [-10, -10], "bounds": [754, 210], "invalidations": [ - [0, 0, 310, 210] + [0, 0, 120, 210], + [210, 20, 100, 100], + [200, 10, 100, 100] ], "transform": 1 }
diff --git a/third_party/blink/web_tests/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt b/third_party/blink/web_tests/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt index ca3b157..a9e4fda 100644 --- a/third_party/blink/web_tests/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt +++ b/third_party/blink/web_tests/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt
@@ -7,8 +7,8 @@ "backgroundColor": "#FFFFFF", "invalidations": [ [8, 92, 732, 94], - [58, 241, 489, 537], - [58, 142, 489, 537] + [58, 142, 489, 537], + [58, 241, 489, 501] ] }, {
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/linux/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/linux/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/linux/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/linux/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt index 9c67362..b3be8fc 100644 --- a/third_party/blink/web_tests/platform/linux/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt +++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt
@@ -6,8 +6,7 @@ "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ - [8, 2046, 774, 107], - [8, 2196, 655, 107] + [8, 2046, 774, 257] ], "transform": 1 },
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png new file mode 100644 index 0000000..84a0dba --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update-expected.txt new file mode 100644 index 0000000..4a16ece --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-update-expected.txt
@@ -0,0 +1,14 @@ +{ + "layers": [ + { + "name": "Scrolling Contents Layer", + "bounds": [800, 600], + "contentsOpaque": true, + "backgroundColor": "#FFFFFF", + "invalidations": [ + [10, 0, 41, 14] + ] + } + ] +} +
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png new file mode 100644 index 0000000..762b9e2 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/custom/text-dom-01-f-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/custom/text-dom-01-f-expected.png new file mode 100644 index 0000000..e3aa3ee --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/custom/text-dom-01-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png new file mode 100644 index 0000000..0bc118a --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png new file mode 100644 index 0000000..5dfbabe --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png new file mode 100644 index 0000000..ed89f4631 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png new file mode 100644 index 0000000..93e22e4 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png new file mode 100644 index 0000000..b1faf4c --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png new file mode 100644 index 0000000..22b423b --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png new file mode 100644 index 0000000..374a146 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png new file mode 100644 index 0000000..3566329 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png new file mode 100644 index 0000000..4ecad0ee --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png new file mode 100644 index 0000000..07b7928 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png new file mode 100644 index 0000000..529ad07 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png new file mode 100644 index 0000000..4f8c05b --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png new file mode 100644 index 0000000..4614eba --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png new file mode 100644 index 0000000..c40aa6e --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png new file mode 100644 index 0000000..2650730 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png new file mode 100644 index 0000000..be3126c --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png new file mode 100644 index 0000000..a77a022 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png new file mode 100644 index 0000000..c6f76e17 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png new file mode 100644 index 0000000..3a24202 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png new file mode 100644 index 0000000..776c67f --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/mac-mac10.13/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt similarity index 95% rename from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt rename to third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt index 737b8a52f..35dcb33 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt
@@ -1,6 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Basic check assert_unreached: Reached unreachable code +PASS Basic check PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 PASS WebSocket blocked port test 9 @@ -59,6 +58,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt deleted file mode 100644 index 737b8a52f..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,80 +0,0 @@ -This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Basic check assert_unreached: Reached unreachable code -PASS WebSocket blocked port test 1 -PASS WebSocket blocked port test 7 -PASS WebSocket blocked port test 9 -PASS WebSocket blocked port test 11 -PASS WebSocket blocked port test 13 -PASS WebSocket blocked port test 15 -PASS WebSocket blocked port test 17 -PASS WebSocket blocked port test 19 -PASS WebSocket blocked port test 20 -PASS WebSocket blocked port test 21 -PASS WebSocket blocked port test 22 -PASS WebSocket blocked port test 23 -PASS WebSocket blocked port test 25 -PASS WebSocket blocked port test 37 -PASS WebSocket blocked port test 42 -PASS WebSocket blocked port test 43 -PASS WebSocket blocked port test 53 -PASS WebSocket blocked port test 69 -PASS WebSocket blocked port test 77 -PASS WebSocket blocked port test 79 -PASS WebSocket blocked port test 87 -PASS WebSocket blocked port test 95 -PASS WebSocket blocked port test 101 -PASS WebSocket blocked port test 102 -PASS WebSocket blocked port test 103 -PASS WebSocket blocked port test 104 -PASS WebSocket blocked port test 109 -PASS WebSocket blocked port test 110 -PASS WebSocket blocked port test 111 -PASS WebSocket blocked port test 113 -PASS WebSocket blocked port test 115 -PASS WebSocket blocked port test 117 -PASS WebSocket blocked port test 119 -PASS WebSocket blocked port test 123 -PASS WebSocket blocked port test 135 -PASS WebSocket blocked port test 137 -PASS WebSocket blocked port test 139 -PASS WebSocket blocked port test 143 -PASS WebSocket blocked port test 179 -PASS WebSocket blocked port test 389 -PASS WebSocket blocked port test 427 -PASS WebSocket blocked port test 465 -PASS WebSocket blocked port test 512 -PASS WebSocket blocked port test 513 -PASS WebSocket blocked port test 514 -PASS WebSocket blocked port test 515 -PASS WebSocket blocked port test 526 -PASS WebSocket blocked port test 530 -PASS WebSocket blocked port test 531 -PASS WebSocket blocked port test 532 -PASS WebSocket blocked port test 540 -PASS WebSocket blocked port test 548 -PASS WebSocket blocked port test 554 -PASS WebSocket blocked port test 556 -PASS WebSocket blocked port test 563 -PASS WebSocket blocked port test 587 -PASS WebSocket blocked port test 601 -PASS WebSocket blocked port test 636 -PASS WebSocket blocked port test 993 -PASS WebSocket blocked port test 995 -PASS WebSocket blocked port test 1719 -PASS WebSocket blocked port test 1720 -PASS WebSocket blocked port test 1723 -PASS WebSocket blocked port test 2049 -PASS WebSocket blocked port test 3659 -PASS WebSocket blocked port test 4045 -PASS WebSocket blocked port test 6000 -PASS WebSocket blocked port test 6566 -PASS WebSocket blocked port test 6665 -PASS WebSocket blocked port test 6666 -PASS WebSocket blocked port test 6667 -PASS WebSocket blocked port test 6668 -PASS WebSocket blocked port test 6669 -PASS WebSocket blocked port test 6697 -PASS WebSocket blocked port test 10080 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png new file mode 100644 index 0000000..6a26c46 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png new file mode 100644 index 0000000..7feb193f --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png new file mode 100644 index 0000000..e1d783be --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https-expected.txt new file mode 100644 index 0000000..010886b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https-expected.txt
@@ -0,0 +1,79 @@ +This is a testharness.js-based test. +Found 75 tests; 70 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS getStats succeeds +PASS Validating stats +PASS RTCRtpStreamStats's ssrc +PASS RTCRtpStreamStats's kind +PASS RTCRtpStreamStats's transportId +PASS RTCRtpStreamStats's codecId +PASS RTCReceivedRtpStreamStats's packetsReceived +PASS RTCReceivedRtpStreamStats's packetsLost +PASS RTCReceivedRtpStreamStats's jitter +FAIL RTCReceivedRtpStreamStats's packetsDiscarded assert_true: Is packetsDiscarded present expected true got false +PASS RTCReceivedRtpStreamStats's framesDropped +FAIL RTCInboundRtpStreamStats's receiverId assert_true: Is receiverId present expected true got false +PASS RTCInboundRtpStreamStats's remoteId +PASS RTCInboundRtpStreamStats's framesDecoded +PASS RTCInboundRtpStreamStats's nackCount +PASS RTCInboundRtpStreamStats's framesReceived +PASS RTCInboundRtpStreamStats's bytesReceived +PASS RTCInboundRtpStreamStats's totalAudioEnergy +PASS RTCInboundRtpStreamStats's totalSamplesDuration +PASS RTCRemoteInboundRtpStreamStats's localId +PASS RTCRemoteInboundRtpStreamStats's roundTripTime +PASS RTCSentRtpStreamStats's packetsSent +PASS RTCSentRtpStreamStats's bytesSent +FAIL RTCOutboundRtpStreamStats's senderId assert_true: Is senderId present expected true got false +PASS RTCOutboundRtpStreamStats's remoteId +PASS RTCOutboundRtpStreamStats's framesEncoded +PASS RTCOutboundRtpStreamStats's nackCount +PASS RTCOutboundRtpStreamStats's framesSent +PASS RTCRemoteOutboundRtpStreamStats's localId +PASS RTCRemoteOutboundRtpStreamStats's remoteTimestamp +PASS RTCPeerConnectionStats's dataChannelsOpened +PASS RTCPeerConnectionStats's dataChannelsClosed +PASS RTCDataChannelStats's label +PASS RTCDataChannelStats's protocol +PASS RTCDataChannelStats's dataChannelIdentifier +PASS RTCDataChannelStats's state +PASS RTCDataChannelStats's messagesSent +PASS RTCDataChannelStats's bytesSent +PASS RTCDataChannelStats's messagesReceived +PASS RTCDataChannelStats's bytesReceived +PASS RTCMediaSourceStats's trackIdentifier +PASS RTCMediaSourceStats's kind +PASS RTCAudioSourceStats's totalAudioEnergy +PASS RTCAudioSourceStats's totalSamplesDuration +PASS RTCVideoSourceStats's width +PASS RTCVideoSourceStats's height +PASS RTCVideoSourceStats's framesPerSecond +FAIL RTCMediaHandlerStats's trackIdentifier assert_true: Is trackIdentifier present expected true got false +PASS RTCCodecStats's payloadType +PASS RTCCodecStats's mimeType +PASS RTCCodecStats's clockRate +PASS RTCCodecStats's channels +PASS RTCCodecStats's sdpFmtpLine +PASS RTCTransportStats's bytesSent +PASS RTCTransportStats's bytesReceived +PASS RTCTransportStats's selectedCandidatePairId +PASS RTCTransportStats's localCertificateId +PASS RTCTransportStats's remoteCertificateId +PASS RTCIceCandidatePairStats's transportId +PASS RTCIceCandidatePairStats's localCandidateId +PASS RTCIceCandidatePairStats's remoteCandidateId +PASS RTCIceCandidatePairStats's state +PASS RTCIceCandidatePairStats's nominated +PASS RTCIceCandidatePairStats's bytesSent +PASS RTCIceCandidatePairStats's bytesReceived +PASS RTCIceCandidatePairStats's totalRoundTripTime +PASS RTCIceCandidatePairStats's currentRoundTripTime +PASS RTCIceCandidateStats's address +PASS RTCIceCandidateStats's port +PASS RTCIceCandidateStats's protocol +PASS RTCIceCandidateStats's candidateType +FAIL RTCIceCandidateStats's url assert_true: Is url present expected true got false +PASS RTCCertificateStats's fingerprint +PASS RTCCertificateStats's fingerprintAlgorithm +PASS RTCCertificateStats's base64Certificate +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/mac/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/mac/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/mac/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/mac/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt index 5716533..307972f 100644 --- a/third_party/blink/web_tests/platform/mac/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt +++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt
@@ -6,8 +6,7 @@ "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ - [8, 2045, 774, 109], - [8, 2195, 653, 109] + [8, 2045, 774, 259] ], "transform": 1 },
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt index f499e3a..b8e1f65 100644 --- a/third_party/blink/web_tests/platform/mac/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt +++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/position/shift-relative-positioned-container-with-image-removal-expected.txt
@@ -7,8 +7,8 @@ "backgroundColor": "#FFFFFF", "invalidations": [ [8, 86, 732, 94], - [58, 234, 489, 537], - [58, 136, 489, 537] + [58, 136, 489, 537], + [58, 234, 489, 501] ] }, {
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png new file mode 100644 index 0000000..686cc51 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png new file mode 100644 index 0000000..2690ea9f --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/text-dom-01-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/text-dom-01-f-expected.png new file mode 100644 index 0000000..4784e20 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/custom/text-dom-01-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png new file mode 100644 index 0000000..b294e686 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png new file mode 100644 index 0000000..da07a695 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png new file mode 100644 index 0000000..3b15b412 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png new file mode 100644 index 0000000..2c0f70d --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png new file mode 100644 index 0000000..b86b5be --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png new file mode 100644 index 0000000..635e467 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png new file mode 100644 index 0000000..c1fee36 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png new file mode 100644 index 0000000..c8a9b719 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png new file mode 100644 index 0000000..0eb722f --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png new file mode 100644 index 0000000..f9bd8cb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png new file mode 100644 index 0000000..065cf5c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png new file mode 100644 index 0000000..990e6b0 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png new file mode 100644 index 0000000..ff8185b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png new file mode 100644 index 0000000..f1e9ae6 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png new file mode 100644 index 0000000..5b97712 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png new file mode 100644 index 0000000..ea8be85f --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png new file mode 100644 index 0000000..647efa90 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png new file mode 100644 index 0000000..b93e66f --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https-expected.txt new file mode 100644 index 0000000..9cf3f18 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-mandatory-getStats.https-expected.txt
@@ -0,0 +1,79 @@ +This is a testharness.js-based test. +Found 75 tests; 49 PASS, 26 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS getStats succeeds +PASS Validating stats +PASS RTCRtpStreamStats's ssrc +PASS RTCRtpStreamStats's kind +PASS RTCRtpStreamStats's transportId +PASS RTCRtpStreamStats's codecId +PASS RTCReceivedRtpStreamStats's packetsReceived +PASS RTCReceivedRtpStreamStats's packetsLost +PASS RTCReceivedRtpStreamStats's jitter +FAIL RTCReceivedRtpStreamStats's packetsDiscarded assert_true: Is packetsDiscarded present expected true got false +PASS RTCReceivedRtpStreamStats's framesDropped +FAIL RTCInboundRtpStreamStats's receiverId assert_true: Is receiverId present expected true got false +FAIL RTCInboundRtpStreamStats's remoteId assert_true: Is remoteId present expected true got false +PASS RTCInboundRtpStreamStats's framesDecoded +PASS RTCInboundRtpStreamStats's nackCount +PASS RTCInboundRtpStreamStats's framesReceived +PASS RTCInboundRtpStreamStats's bytesReceived +PASS RTCInboundRtpStreamStats's totalAudioEnergy +PASS RTCInboundRtpStreamStats's totalSamplesDuration +FAIL RTCRemoteInboundRtpStreamStats's localId assert_true: Is localId present expected true got false +FAIL RTCRemoteInboundRtpStreamStats's roundTripTime assert_true: Is roundTripTime present expected true got false +PASS RTCSentRtpStreamStats's packetsSent +PASS RTCSentRtpStreamStats's bytesSent +FAIL RTCOutboundRtpStreamStats's senderId assert_true: Is senderId present expected true got false +FAIL RTCOutboundRtpStreamStats's remoteId assert_true: Is remoteId present expected true got false +PASS RTCOutboundRtpStreamStats's framesEncoded +PASS RTCOutboundRtpStreamStats's nackCount +PASS RTCOutboundRtpStreamStats's framesSent +FAIL RTCRemoteOutboundRtpStreamStats's localId assert_true: Is localId present expected true got false +FAIL RTCRemoteOutboundRtpStreamStats's remoteTimestamp assert_true: Is remoteTimestamp present expected true got false +PASS RTCPeerConnectionStats's dataChannelsOpened +PASS RTCPeerConnectionStats's dataChannelsClosed +PASS RTCDataChannelStats's label +PASS RTCDataChannelStats's protocol +PASS RTCDataChannelStats's dataChannelIdentifier +PASS RTCDataChannelStats's state +PASS RTCDataChannelStats's messagesSent +PASS RTCDataChannelStats's bytesSent +PASS RTCDataChannelStats's messagesReceived +PASS RTCDataChannelStats's bytesReceived +PASS RTCMediaSourceStats's trackIdentifier +PASS RTCMediaSourceStats's kind +PASS RTCAudioSourceStats's totalAudioEnergy +PASS RTCAudioSourceStats's totalSamplesDuration +PASS RTCVideoSourceStats's width +PASS RTCVideoSourceStats's height +PASS RTCVideoSourceStats's framesPerSecond +FAIL RTCMediaHandlerStats's trackIdentifier assert_true: Is trackIdentifier present expected true got false +PASS RTCCodecStats's payloadType +PASS RTCCodecStats's mimeType +PASS RTCCodecStats's clockRate +PASS RTCCodecStats's channels +PASS RTCCodecStats's sdpFmtpLine +PASS RTCTransportStats's bytesSent +PASS RTCTransportStats's bytesReceived +FAIL RTCTransportStats's selectedCandidatePairId assert_true: Is selectedCandidatePairId present expected true got false +PASS RTCTransportStats's localCertificateId +FAIL RTCTransportStats's remoteCertificateId assert_true: Is remoteCertificateId present expected true got false +FAIL RTCIceCandidatePairStats's transportId assert_true: Is transportId present expected true got false +FAIL RTCIceCandidatePairStats's localCandidateId assert_true: Is localCandidateId present expected true got false +FAIL RTCIceCandidatePairStats's remoteCandidateId assert_true: Is remoteCandidateId present expected true got false +FAIL RTCIceCandidatePairStats's state assert_true: Is state present expected true got false +FAIL RTCIceCandidatePairStats's nominated assert_true: Is nominated present expected true got false +FAIL RTCIceCandidatePairStats's bytesSent assert_true: Is bytesSent present expected true got false +FAIL RTCIceCandidatePairStats's bytesReceived assert_true: Is bytesReceived present expected true got false +FAIL RTCIceCandidatePairStats's totalRoundTripTime assert_true: Is totalRoundTripTime present expected true got false +FAIL RTCIceCandidatePairStats's currentRoundTripTime assert_true: Is currentRoundTripTime present expected true got false +FAIL RTCIceCandidateStats's address assert_true: Is address present expected true got false +FAIL RTCIceCandidateStats's port assert_true: Is port present expected true got false +FAIL RTCIceCandidateStats's protocol assert_true: Is protocol present expected true got false +FAIL RTCIceCandidateStats's candidateType assert_true: Is candidateType present expected true got false +FAIL RTCIceCandidateStats's url assert_true: Is url present expected true got false +PASS RTCCertificateStats's fingerprint +PASS RTCCertificateStats's fingerprintAlgorithm +PASS RTCCertificateStats's base64Certificate +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt deleted file mode 100644 index 737b8a52f..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,80 +0,0 @@ -This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Basic check assert_unreached: Reached unreachable code -PASS WebSocket blocked port test 1 -PASS WebSocket blocked port test 7 -PASS WebSocket blocked port test 9 -PASS WebSocket blocked port test 11 -PASS WebSocket blocked port test 13 -PASS WebSocket blocked port test 15 -PASS WebSocket blocked port test 17 -PASS WebSocket blocked port test 19 -PASS WebSocket blocked port test 20 -PASS WebSocket blocked port test 21 -PASS WebSocket blocked port test 22 -PASS WebSocket blocked port test 23 -PASS WebSocket blocked port test 25 -PASS WebSocket blocked port test 37 -PASS WebSocket blocked port test 42 -PASS WebSocket blocked port test 43 -PASS WebSocket blocked port test 53 -PASS WebSocket blocked port test 69 -PASS WebSocket blocked port test 77 -PASS WebSocket blocked port test 79 -PASS WebSocket blocked port test 87 -PASS WebSocket blocked port test 95 -PASS WebSocket blocked port test 101 -PASS WebSocket blocked port test 102 -PASS WebSocket blocked port test 103 -PASS WebSocket blocked port test 104 -PASS WebSocket blocked port test 109 -PASS WebSocket blocked port test 110 -PASS WebSocket blocked port test 111 -PASS WebSocket blocked port test 113 -PASS WebSocket blocked port test 115 -PASS WebSocket blocked port test 117 -PASS WebSocket blocked port test 119 -PASS WebSocket blocked port test 123 -PASS WebSocket blocked port test 135 -PASS WebSocket blocked port test 137 -PASS WebSocket blocked port test 139 -PASS WebSocket blocked port test 143 -PASS WebSocket blocked port test 179 -PASS WebSocket blocked port test 389 -PASS WebSocket blocked port test 427 -PASS WebSocket blocked port test 465 -PASS WebSocket blocked port test 512 -PASS WebSocket blocked port test 513 -PASS WebSocket blocked port test 514 -PASS WebSocket blocked port test 515 -PASS WebSocket blocked port test 526 -PASS WebSocket blocked port test 530 -PASS WebSocket blocked port test 531 -PASS WebSocket blocked port test 532 -PASS WebSocket blocked port test 540 -PASS WebSocket blocked port test 548 -PASS WebSocket blocked port test 554 -PASS WebSocket blocked port test 556 -PASS WebSocket blocked port test 563 -PASS WebSocket blocked port test 587 -PASS WebSocket blocked port test 601 -PASS WebSocket blocked port test 636 -PASS WebSocket blocked port test 993 -PASS WebSocket blocked port test 995 -PASS WebSocket blocked port test 1719 -PASS WebSocket blocked port test 1720 -PASS WebSocket blocked port test 1723 -PASS WebSocket blocked port test 2049 -PASS WebSocket blocked port test 3659 -PASS WebSocket blocked port test 4045 -PASS WebSocket blocked port test 6000 -PASS WebSocket blocked port test 6566 -PASS WebSocket blocked port test 6665 -PASS WebSocket blocked port test 6666 -PASS WebSocket blocked port test 6667 -PASS WebSocket blocked port test 6668 -PASS WebSocket blocked port test 6669 -PASS WebSocket blocked port test 6697 -PASS WebSocket blocked port test 10080 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt deleted file mode 100644 index 737b8a52f..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,80 +0,0 @@ -This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Basic check assert_unreached: Reached unreachable code -PASS WebSocket blocked port test 1 -PASS WebSocket blocked port test 7 -PASS WebSocket blocked port test 9 -PASS WebSocket blocked port test 11 -PASS WebSocket blocked port test 13 -PASS WebSocket blocked port test 15 -PASS WebSocket blocked port test 17 -PASS WebSocket blocked port test 19 -PASS WebSocket blocked port test 20 -PASS WebSocket blocked port test 21 -PASS WebSocket blocked port test 22 -PASS WebSocket blocked port test 23 -PASS WebSocket blocked port test 25 -PASS WebSocket blocked port test 37 -PASS WebSocket blocked port test 42 -PASS WebSocket blocked port test 43 -PASS WebSocket blocked port test 53 -PASS WebSocket blocked port test 69 -PASS WebSocket blocked port test 77 -PASS WebSocket blocked port test 79 -PASS WebSocket blocked port test 87 -PASS WebSocket blocked port test 95 -PASS WebSocket blocked port test 101 -PASS WebSocket blocked port test 102 -PASS WebSocket blocked port test 103 -PASS WebSocket blocked port test 104 -PASS WebSocket blocked port test 109 -PASS WebSocket blocked port test 110 -PASS WebSocket blocked port test 111 -PASS WebSocket blocked port test 113 -PASS WebSocket blocked port test 115 -PASS WebSocket blocked port test 117 -PASS WebSocket blocked port test 119 -PASS WebSocket blocked port test 123 -PASS WebSocket blocked port test 135 -PASS WebSocket blocked port test 137 -PASS WebSocket blocked port test 139 -PASS WebSocket blocked port test 143 -PASS WebSocket blocked port test 179 -PASS WebSocket blocked port test 389 -PASS WebSocket blocked port test 427 -PASS WebSocket blocked port test 465 -PASS WebSocket blocked port test 512 -PASS WebSocket blocked port test 513 -PASS WebSocket blocked port test 514 -PASS WebSocket blocked port test 515 -PASS WebSocket blocked port test 526 -PASS WebSocket blocked port test 530 -PASS WebSocket blocked port test 531 -PASS WebSocket blocked port test 532 -PASS WebSocket blocked port test 540 -PASS WebSocket blocked port test 548 -PASS WebSocket blocked port test 554 -PASS WebSocket blocked port test 556 -PASS WebSocket blocked port test 563 -PASS WebSocket blocked port test 587 -PASS WebSocket blocked port test 601 -PASS WebSocket blocked port test 636 -PASS WebSocket blocked port test 993 -PASS WebSocket blocked port test 995 -PASS WebSocket blocked port test 1719 -PASS WebSocket blocked port test 1720 -PASS WebSocket blocked port test 1723 -PASS WebSocket blocked port test 2049 -PASS WebSocket blocked port test 3659 -PASS WebSocket blocked port test 4045 -PASS WebSocket blocked port test 6000 -PASS WebSocket blocked port test 6566 -PASS WebSocket blocked port test 6665 -PASS WebSocket blocked port test 6666 -PASS WebSocket blocked port test 6667 -PASS WebSocket blocked port test 6668 -PASS WebSocket blocked port test 6669 -PASS WebSocket blocked port test 6697 -PASS WebSocket blocked port test 10080 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt index 847f420..21225cd 100644 --- a/third_party/blink/web_tests/platform/win/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt +++ b/third_party/blink/web_tests/platform/win/paint/invalidation/invalidation-after-opacity-change-subtree-expected.txt
@@ -6,8 +6,7 @@ "contentsOpaque": true, "backgroundColor": "#FFFFFF", "invalidations": [ - [8, 2046, 766, 107], - [8, 2196, 639, 107] + [8, 2046, 766, 257] ], "transform": 1 },
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png new file mode 100644 index 0000000..4274660 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/paint/invalidation/svg/text-selection-text-05-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png new file mode 100644 index 0000000..499e6e3b --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/W3C-SVG-1.1/text-tselect-02-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png new file mode 100644 index 0000000..49df21b3 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png new file mode 100644 index 0000000..3ac3fbb --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-02-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png new file mode 100644 index 0000000..2f22a52 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-03-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png new file mode 100644 index 0000000..d885aa6 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-04-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png new file mode 100644 index 0000000..87636c4 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-05-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png new file mode 100644 index 0000000..2e17d49 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-align-06-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png new file mode 100644 index 0000000..5b1d5e9 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png new file mode 100644 index 0000000..e74a74f --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-fonts-02-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png new file mode 100644 index 0000000..d904cac --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-intro-05-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png new file mode 100644 index 0000000..8fc06321 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-spacing-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png new file mode 100644 index 0000000..e221dc29 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png new file mode 100644 index 0000000..6d354b5 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-04-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png new file mode 100644 index 0000000..dfc1e0f --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-06-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png new file mode 100644 index 0000000..df5ac39 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-07-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png new file mode 100644 index 0000000..42cfb5ec2 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-text-08-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png new file mode 100644 index 0000000..648f4b2d --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png new file mode 100644 index 0000000..1f50d8a --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tselect-02-f-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png new file mode 100644 index 0000000..78bf694e --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-tspan-01-b-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png new file mode 100644 index 0000000..a0597ac --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-ws-01-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png new file mode 100644 index 0000000..bfc1508 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/layout_ng_svg_text/svg/text/text-selection-ws-02-t-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/win7/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/win7/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/platform/win7/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt similarity index 95% copy from third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt copy to third_party/blink/web_tests/platform/win7/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt index 737b8a52f..09e47e3 100644 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/websockets/Create-blocked-port.any.worker_wpt_flags=h2-expected.txt +++ b/third_party/blink/web_tests/platform/win7/external/wpt/websockets/Create-blocked-port.any_wpt_flags=h2-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 76 tests; 75 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 78 tests; 77 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. FAIL Basic check assert_unreached: Reached unreachable code PASS WebSocket blocked port test 1 PASS WebSocket blocked port test 7 @@ -59,6 +59,8 @@ PASS WebSocket blocked port test 587 PASS WebSocket blocked port test 601 PASS WebSocket blocked port test 636 +PASS WebSocket blocked port test 989 +PASS WebSocket blocked port test 990 PASS WebSocket blocked port test 993 PASS WebSocket blocked port test 995 PASS WebSocket blocked port test 1719
diff --git a/third_party/blink/web_tests/storage/indexeddb/create-object-store-options-expected.txt b/third_party/blink/web_tests/storage/indexeddb/create-object-store-options-expected.txt index 590a7dac..e8fa5e9 100644 --- a/third_party/blink/web_tests/storage/indexeddb/create-object-store-options-expected.txt +++ b/third_party/blink/web_tests/storage/indexeddb/create-object-store-options-expected.txt
@@ -13,10 +13,10 @@ trans.objectStore('a').put({'a': 0}) Expecting TypeError exception from db.createObjectStore('d', 'bar'); PASS Exception was thrown. -PASS db.createObjectStore('d', 'bar'); threw TypeError: Failed to execute 'createObjectStore' on 'IDBDatabase': cannot convert to dictionary. +PASS db.createObjectStore('d', 'bar'); threw TypeError: Failed to execute 'createObjectStore' on 'IDBDatabase': The provided value is not of type 'IDBObjectStoreParameters'. Expecting TypeError exception from db.createObjectStore('e', false); PASS Exception was thrown. -PASS db.createObjectStore('e', false); threw TypeError: Failed to execute 'createObjectStore' on 'IDBDatabase': cannot convert to dictionary. +PASS db.createObjectStore('e', false); threw TypeError: Failed to execute 'createObjectStore' on 'IDBDatabase': The provided value is not of type 'IDBObjectStoreParameters'. trans.objectStore('b').put({'a': 0}, 0) trans.objectStore('a').get(0) PASS event.target.result.a is {a: 0}
diff --git a/third_party/blink/web_tests/storage/indexeddb/index-basics-expected.txt b/third_party/blink/web_tests/storage/indexeddb/index-basics-expected.txt index 31d5858..b45cbd5 100644 --- a/third_party/blink/web_tests/storage/indexeddb/index-basics-expected.txt +++ b/third_party/blink/web_tests/storage/indexeddb/index-basics-expected.txt
@@ -17,10 +17,10 @@ PASS indexObject3.unique is true Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', true) PASS Exception was thrown. -PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': cannot convert to dictionary. +PASS store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': The provided value is not of type 'IDBIndexParameters'. Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', 'string') PASS Exception was thrown. -PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': cannot convert to dictionary. +PASS store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': The provided value is not of type 'IDBIndexParameters'. PASS 'name' in indexObject is true PASS indexObject.name is "indexName" PASS 'objectStore' in indexObject is true
diff --git a/third_party/blink/web_tests/storage/indexeddb/index-basics-workers-expected.txt b/third_party/blink/web_tests/storage/indexeddb/index-basics-workers-expected.txt index f0ad73b2..27236d15 100644 --- a/third_party/blink/web_tests/storage/indexeddb/index-basics-workers-expected.txt +++ b/third_party/blink/web_tests/storage/indexeddb/index-basics-workers-expected.txt
@@ -17,10 +17,10 @@ PASS [Worker] indexObject3.unique is true [Worker] Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', true) PASS [Worker] Exception was thrown. -PASS [Worker] store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': cannot convert to dictionary. +PASS [Worker] store.createIndex('failureIndex', 'zzz', true) threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': The provided value is not of type 'IDBIndexParameters'. [Worker] Expecting TypeError exception from store.createIndex('failureIndex', 'zzz', 'string') PASS [Worker] Exception was thrown. -PASS [Worker] store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': cannot convert to dictionary. +PASS [Worker] store.createIndex('failureIndex', 'zzz', 'string') threw TypeError: Failed to execute 'createIndex' on 'IDBObjectStore': The provided value is not of type 'IDBIndexParameters'. PASS [Worker] 'name' in indexObject is true PASS [Worker] indexObject.name is "indexName" PASS [Worker] 'objectStore' in indexObject is true
diff --git a/third_party/blink/web_tests/virtual/scroll-unification/fast/events/constructors/midi-message-event-constructor-expected.txt b/third_party/blink/web_tests/virtual/scroll-unification/fast/events/constructors/midi-message-event-constructor-expected.txt index a995b14..3de3f44c 100644 --- a/third_party/blink/web_tests/virtual/scroll-unification/fast/events/constructors/midi-message-event-constructor-expected.txt +++ b/third_party/blink/web_tests/virtual/scroll-unification/fast/events/constructors/midi-message-event-constructor-expected.txt
@@ -14,7 +14,7 @@ PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).bubbles is true PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).cancelable is true PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).data == '0,0,0' is true -PASS new MIDIMessageEvent('eventType', { data: data }) threw exception TypeError: Failed to construct 'MIDIMessageEvent': The provided ArrayBufferView value must not be shared.. +PASS new MIDIMessageEvent('eventType', { data: data }) threw exception TypeError: Failed to construct 'MIDIMessageEvent': Failed to read the 'data' property from 'MIDIMessageEventInit': The provided ArrayBufferView value must not be shared.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/virtual/shared_array_buffer_on_desktop/fast/events/constructors/midi-message-event-constructor-expected.txt b/third_party/blink/web_tests/virtual/shared_array_buffer_on_desktop/fast/events/constructors/midi-message-event-constructor-expected.txt index a995b14..3de3f44c 100644 --- a/third_party/blink/web_tests/virtual/shared_array_buffer_on_desktop/fast/events/constructors/midi-message-event-constructor-expected.txt +++ b/third_party/blink/web_tests/virtual/shared_array_buffer_on_desktop/fast/events/constructors/midi-message-event-constructor-expected.txt
@@ -14,7 +14,7 @@ PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).bubbles is true PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).cancelable is true PASS new MIDIMessageEvent('eventType', { bubbles: true, cancelable: true, data: data }).data == '0,0,0' is true -PASS new MIDIMessageEvent('eventType', { data: data }) threw exception TypeError: Failed to construct 'MIDIMessageEvent': The provided ArrayBufferView value must not be shared.. +PASS new MIDIMessageEvent('eventType', { data: data }) threw exception TypeError: Failed to construct 'MIDIMessageEvent': Failed to read the 'data' property from 'MIDIMessageEventInit': The provided ArrayBufferView value must not be shared.. PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/blink/web_tests/webgpu/internal_cts_test_splits.pyl b/third_party/blink/web_tests/webgpu/internal_cts_test_splits.pyl index 0a8c9fd..2de343e 100644 --- a/third_party/blink/web_tests/webgpu/internal_cts_test_splits.pyl +++ b/third_party/blink/web_tests/webgpu/internal_cts_test_splits.pyl
@@ -31,11 +31,11 @@ 'wpt_internal/webgpu/cts.html?q=webgpu:shader,execution,robust_access_vertex:vertexAccess:indexed=false;indirect=false;*', 'wpt_internal/webgpu/cts.html?q=webgpu:shader,execution,robust_access_vertex:vertexAccess:indexed=true;indirect=false;*', - 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="_undef_";*', - 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="_undef_";*', - 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="_undef_";*', - 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="_undef_";*', - 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="_undef_";*', + 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="_undef_";*', + 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="_undef_";*', + 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="_undef_";*', + 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="_undef_";*', + 'wpt_internal/webgpu/cts.html?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="_undef_";*', 'wpt_internal/webgpu/cts.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="1d";*',
diff --git a/third_party/blink/web_tests/wpt_internal/webgpu/cts.html b/third_party/blink/web_tests/wpt_internal/webgpu/cts.html index 84c461f..4f2bdbe3c 100644 --- a/third_party/blink/web_tests/wpt_internal/webgpu/cts.html +++ b/third_party/blink/web_tests/wpt_internal/webgpu/cts.html
@@ -715,76 +715,76 @@ <meta name=variant content='?q=webgpu:shader,execution,robust_access_vertex:vertexAccess:indexed=false;indirect=true;*'> <meta name=variant content='?q=webgpu:shader,execution,robust_access_vertex:vertexAccess:indexed=true;indirect=false;*'> <meta name=variant content='?q=webgpu:shader,execution,robust_access_vertex:vertexAccess:indexed=true;indirect=true;*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="_undef_";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="vec2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="vec3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="vec4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat2x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat2x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat2x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat3x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat3x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat3x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat4x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat4x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="mat4x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="var";lhsContainerType="array";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="_undef_";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="vec2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="vec3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="vec4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat2x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat2x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat2x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat3x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat3x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat3x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat4x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat4x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="mat4x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0033:variableOrConstant="const";lhsContainerType="array";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="_undef_";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="vec2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="vec3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="vec4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat2x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat2x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat2x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat3x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat3x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat3x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat4x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat4x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="mat4x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="in";containerType="array";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="_undef_";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="vec2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="vec3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="vec4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat2x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat2x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat2x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat3x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat3x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat3x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat4x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat4x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="mat4x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="out";containerType="array";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="_undef_";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="vec2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="vec3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="vec4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat2x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat2x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat2x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat3x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat3x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat3x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat4x2";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat4x3";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="mat4x4";*'> -<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:v_0038:storageClass="private";containerType="array";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="_undef_";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="vec2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="vec3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="vec4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat2x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat2x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat2x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat3x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat3x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat3x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat4x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat4x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="mat4x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="var";lhsContainerType="array";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="_undef_";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="vec2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="vec3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="vec4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat2x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat2x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat2x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat3x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat3x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat3x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat4x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat4x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="mat4x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:initializer_type:variableOrConstant="const";lhsContainerType="array";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="_undef_";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="vec2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="vec3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="vec4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat2x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat2x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat2x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat3x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat3x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat3x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat4x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat4x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="mat4x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="in";containerType="array";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="_undef_";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="vec2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="vec3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="vec4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat2x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat2x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat2x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat3x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat3x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat3x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat4x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat4x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="mat4x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="out";containerType="array";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="_undef_";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="vec2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="vec3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="vec4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat2x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat2x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat2x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat3x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat3x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat3x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat4x2";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat4x3";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="mat4x4";*'> +<meta name=variant content='?q=webgpu:shader,validation,variable_and_const:io_shareable_type:storageClass="private";containerType="array";*'> <meta name=variant content='?q=webgpu:shader,validation,wgsl,basic:trivial:*'> <meta name=variant content='?q=webgpu:shader,validation,wgsl,basic:nonsense:*'> <meta name=variant content='?q=webgpu:util,texture,texel_data:unorm_texel_data_in_shader:*'>
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index cf4fd68..56e74f1a 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: a6494f9df645b360b13b76fa2df32e38f0c6f8ac +Revision: 8804387c75b5ea6b2ac7ef978104972996c721d1 License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes
diff --git a/third_party/crashpad/crashpad/BUILD.gn b/third_party/crashpad/crashpad/BUILD.gn index 1c72f88..578104c46 100644 --- a/third_party/crashpad/crashpad/BUILD.gn +++ b/third_party/crashpad/crashpad/BUILD.gn
@@ -25,6 +25,7 @@ deps = [ "client:client_test", "minidump:minidump_test", + "snapshot:snapshot_test", "test:googlemock_main", "test:test_test", "util:util_test", @@ -32,9 +33,6 @@ data_deps = [ "//testing/buildbot/filters:crashpad_tests_filters" ] - if (!crashpad_is_ios) { - deps += [ "snapshot:snapshot_test" ] - } if (!crashpad_is_ios && !crashpad_is_fuchsia) { deps += [ "handler:handler_test" ] } @@ -84,6 +82,12 @@ fuchsia_test_package("crashpad-test") { test_components = [ ":crashpad-test-component" ] + + test_specs = { + log_settings = { + max_severity = "FATAL" + } + } } _resource_files = [ @@ -153,9 +157,6 @@ "snapshot:snapshot_test", "test:googletest_main", ] - if (crashpad_is_ios) { - deps -= [ "snapshot:snapshot_test" ] - } } test("crashpad_test_test") {
diff --git a/third_party/crashpad/crashpad/DEPS b/third_party/crashpad/crashpad/DEPS index 52c88ba..84b742f 100644 --- a/third_party/crashpad/crashpad/DEPS +++ b/third_party/crashpad/crashpad/DEPS
@@ -42,7 +42,7 @@ '7bde79cc274d06451bf65ae82c012a5d3e476b5a', 'crashpad/third_party/mini_chromium/mini_chromium': Var('chromium_git') + '/chromium/mini_chromium@' + - 'c0c965a19b442c2ecc38d5c4a90e23ac8b69b804', + '2470faf722b0fd259ca11c045fdb370e09037c4e', 'crashpad/third_party/libfuzzer/src': Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' + 'fda403cf93ecb8792cb1d061564d89a6553ca020',
diff --git a/third_party/crashpad/crashpad/client/crash_report_database.cc b/third_party/crashpad/crashpad/client/crash_report_database.cc index 122e62e..68393333 100644 --- a/third_party/crashpad/crashpad/client/crash_report_database.cc +++ b/third_party/crashpad/crashpad/client/crash_report_database.cc
@@ -87,7 +87,7 @@ } } -bool CrashReportDatabase::UploadReport::Initialize(const base::FilePath path, +bool CrashReportDatabase::UploadReport::Initialize(const base::FilePath& path, CrashReportDatabase* db) { database_ = db; InitializeAttachments();
diff --git a/third_party/crashpad/crashpad/client/crash_report_database.h b/third_party/crashpad/crashpad/client/crash_report_database.h index ce317f7..2cec726 100644 --- a/third_party/crashpad/crashpad/client/crash_report_database.h +++ b/third_party/crashpad/crashpad/client/crash_report_database.h
@@ -181,7 +181,7 @@ friend class CrashReportDatabaseMac; friend class CrashReportDatabaseWin; - bool Initialize(const base::FilePath path, CrashReportDatabase* database); + bool Initialize(const base::FilePath& path, CrashReportDatabase* database); void InitializeAttachments(); std::unique_ptr<FileReader> reader_;
diff --git a/third_party/crashpad/crashpad/client/crash_report_database_mac.mm b/third_party/crashpad/crashpad/client/crash_report_database_mac.mm index 1f8fec9b..485d05f3 100644 --- a/third_party/crashpad/crashpad/client/crash_report_database_mac.mm +++ b/third_party/crashpad/crashpad/client/crash_report_database_mac.mm
@@ -25,11 +25,11 @@ #include <unistd.h> #include <uuid/uuid.h> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/mac/scoped_nsautorelease_pool.h" #include "base/posix/eintr_wrapper.h" #include "base/scoped_generic.h" -#include "base/stl_util.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h"
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_ios.cc b/third_party/crashpad/crashpad/client/crashpad_client_ios.cc index 8ff0704..69e90d8c 100644 --- a/third_party/crashpad/crashpad/client/crashpad_client_ios.cc +++ b/third_party/crashpad/crashpad/client/crashpad_client_ios.cc
@@ -18,11 +18,10 @@ #include <ios> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/mac/mach_logging.h" #include "base/mac/scoped_mach_port.h" -#include "base/stl_util.h" -#include "snapshot/ios/process_snapshot_ios.h" #include "util/ios/exception_processor.h" #include "util/ios/ios_system_data_collector.h" #include "util/mach/exc_server_variants.h" @@ -168,16 +167,6 @@ ConstThreadState old_state, mach_msg_type_number_t old_state_count) { // TODO(justincohen): This is incomplete. - ProcessSnapshotIOS process_snapshot; - process_snapshot.Initialize(system_data_); - process_snapshot.SetExceptionFromMachException(behavior, - thread, - exception, - code, - code_count, - flavor, - old_state, - old_state_count); } // The signal handler installed at OS-level. @@ -190,9 +179,6 @@ siginfo_t* siginfo, ucontext_t* context) { // TODO(justincohen): This is incomplete. - ProcessSnapshotIOS process_snapshot; - process_snapshot.Initialize(system_data_); - process_snapshot.SetExceptionFromSignal(siginfo, context); // Always call system handler. Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, &old_action_);
diff --git a/third_party/crashpad/crashpad/client/simulate_crash_mac.cc b/third_party/crashpad/crashpad/client/simulate_crash_mac.cc index b700632..48d81a0d 100644 --- a/third_party/crashpad/crashpad/client/simulate_crash_mac.cc +++ b/third_party/crashpad/crashpad/client/simulate_crash_mac.cc
@@ -18,10 +18,10 @@ #include <sys/types.h> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/mac/mach_logging.h" #include "base/mac/scoped_mach_port.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "util/mach/exc_client_variants.h" #include "util/mach/exception_behaviors.h"
diff --git a/third_party/crashpad/crashpad/client/simulate_crash_mac_test.cc b/third_party/crashpad/crashpad/client/simulate_crash_mac_test.cc index dde298d..92ae73e7 100644 --- a/third_party/crashpad/crashpad/client/simulate_crash_mac_test.cc +++ b/third_party/crashpad/crashpad/client/simulate_crash_mac_test.cc
@@ -18,8 +18,8 @@ #include <string.h> #include <sys/types.h> +#include "base/cxx17_backports.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/handler/mac/file_limit_annotation.cc b/third_party/crashpad/crashpad/handler/mac/file_limit_annotation.cc index a01e87d9..0813b950 100644 --- a/third_party/crashpad/crashpad/handler/mac/file_limit_annotation.cc +++ b/third_party/crashpad/crashpad/handler/mac/file_limit_annotation.cc
@@ -23,8 +23,8 @@ #include <string> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "client/crashpad_info.h" #include "client/simple_string_dictionary.h"
diff --git a/third_party/crashpad/crashpad/handler/win/crashy_test_program.cc b/third_party/crashpad/crashpad/handler/win/crashy_test_program.cc index 9c8adbb..4fb2554 100644 --- a/third_party/crashpad/crashpad/handler/win/crashy_test_program.cc +++ b/third_party/crashpad/crashpad/handler/win/crashy_test_program.cc
@@ -24,9 +24,9 @@ #include <type_traits> #include <vector> +#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/logging.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "client/crashpad_client.h" #include "client/crashpad_info.h"
diff --git a/third_party/crashpad/crashpad/handler/win/hanging_program.cc b/third_party/crashpad/crashpad/handler/win/hanging_program.cc index 04c093a..b65d46d 100644 --- a/third_party/crashpad/crashpad/handler/win/hanging_program.cc +++ b/third_party/crashpad/crashpad/handler/win/hanging_program.cc
@@ -15,10 +15,10 @@ #include <stdio.h> #include <windows.h> +#include "base/cxx17_backports.h" #include "base/debug/alias.h" #include "base/logging.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "client/crashpad_client.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_annotation_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_annotation_writer_test.cc index dc05cc64..c862f02 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_annotation_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_annotation_writer_test.cc
@@ -16,7 +16,7 @@ #include <memory> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "minidump/minidump_extensions.h" #include "minidump/test/minidump_byte_array_writer_test_util.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_byte_array_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_byte_array_writer_test.cc index e4cd526e..526e38b 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_byte_array_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_byte_array_writer_test.cc
@@ -16,8 +16,8 @@ #include <memory> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "minidump/test/minidump_writable_test_util.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc index 72837bba..0243c175 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_exception_writer_test.cc
@@ -17,7 +17,7 @@ #include <string> #include <utility> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "minidump/minidump_context.h" #include "minidump/minidump_context_writer.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc index 19eaae4..c5d2845 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_file_writer_test.cc
@@ -20,7 +20,7 @@ #include <string> #include <utility> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "minidump/minidump_stream_writer.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_memory_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_memory_writer.cc index 868c356..a3b1f75 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_memory_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_memory_writer.cc
@@ -172,11 +172,11 @@ } void MinidumpMemoryListWriter::CoalesceOwnedMemory() { + DropRangesThatOverlapNonOwned(); + if (children_.empty()) return; - DropRangesThatOverlapNonOwned(); - std::sort(children_.begin(), children_.end(), [](const std::unique_ptr<SnapshotMinidumpMemoryWriter>& a_ptr,
diff --git a/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc index 90287cb..24dac9bc 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_memory_writer_test.cc
@@ -16,8 +16,8 @@ #include <utility> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "minidump/minidump_extensions.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc index 0974e3dd..64c3c23 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer.cc
@@ -17,9 +17,9 @@ #include <limits> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc index 8a25aee..18ac2966 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_misc_info_writer_test.cc
@@ -20,8 +20,8 @@ #include <utility> #include "base/compiler_specific.h" +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "gtest/gtest.h" @@ -774,12 +774,12 @@ debug_build_string_utf16.c_str(), base::size(expect_misc_info.DbgBldStr)); - const timeval kStartTime = - { static_cast<time_t>(expect_misc_info.ProcessCreateTime), 0 }; - const timeval kUserCPUTime = - { static_cast<time_t>(expect_misc_info.ProcessUserTime), 0 }; - const timeval kSystemCPUTime = - { static_cast<time_t>(expect_misc_info.ProcessKernelTime), 0 }; + const timeval kStartTime = { + static_cast<long>(expect_misc_info.ProcessCreateTime), 0}; + const timeval kUserCPUTime = { + static_cast<long>(expect_misc_info.ProcessUserTime), 0}; + const timeval kSystemCPUTime = { + static_cast<long>(expect_misc_info.ProcessKernelTime), 0}; TestProcessSnapshot process_snapshot; process_snapshot.SetProcessID(expect_misc_info.ProcessId);
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc index ba4ab05..613314b 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_module_crashpad_info_writer_test.cc
@@ -19,7 +19,7 @@ #include <utility> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "minidump/minidump_annotation_writer.h" #include "minidump/minidump_simple_string_dictionary_writer.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc index ee15b5b..131575f 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_module_writer_test.cc
@@ -19,8 +19,8 @@ #include <utility> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_rva_list_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_rva_list_writer_test.cc index 3807432..8ae2b9e 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_rva_list_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_rva_list_writer_test.cc
@@ -16,8 +16,8 @@ #include <utility> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "minidump/test/minidump_rva_list_test_util.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_string_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_string_writer_test.cc index f1afd75..bfaf3a9 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_string_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_string_writer_test.cc
@@ -17,8 +17,8 @@ #include <string> #include "base/compiler_specific.h" +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc index caec8f8..13501010 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc
@@ -17,8 +17,8 @@ #include <string.h> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "minidump/minidump_string_writer.h" #include "snapshot/system_snapshot.h" #include "util/file/file_writer.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_thread_id_map_test.cc b/third_party/crashpad/crashpad/minidump/minidump_thread_id_map_test.cc index 548729e..0c48c01 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_thread_id_map_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_thread_id_map_test.cc
@@ -18,8 +18,8 @@ #include <vector> +#include "base/cxx17_backports.h" #include "base/macros.h" -#include "base/stl_util.h" #include "gtest/gtest.h" #include "snapshot/test/test_thread_snapshot.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc b/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc index 3f3d56e..924c5c1 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_thread_writer_test.cc
@@ -18,8 +18,8 @@ #include <utility> #include "base/compiler_specific.h" +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "minidump/minidump_context_writer.h"
diff --git a/third_party/crashpad/crashpad/minidump/minidump_writable.cc b/third_party/crashpad/crashpad/minidump/minidump_writable.cc index fa3e2f1..8f69c9c 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_writable.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_writable.cc
@@ -16,8 +16,8 @@ #include <stdint.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "util/file/file_writer.h" #include "util/numeric/safe_assignment.h"
diff --git a/third_party/crashpad/crashpad/minidump/test/minidump_context_test_util.cc b/third_party/crashpad/crashpad/minidump/test/minidump_context_test_util.cc index 1125c96..446e5a1 100644 --- a/third_party/crashpad/crashpad/minidump/test/minidump_context_test_util.cc +++ b/third_party/crashpad/crashpad/minidump/test/minidump_context_test_util.cc
@@ -17,8 +17,8 @@ #include <string.h> #include <sys/types.h> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "snapshot/cpu_context.h"
diff --git a/third_party/crashpad/crashpad/snapshot/BUILD.gn b/third_party/crashpad/crashpad/snapshot/BUILD.gn index b9ee959..70e4a31 100644 --- a/third_party/crashpad/crashpad/snapshot/BUILD.gn +++ b/third_party/crashpad/crashpad/snapshot/BUILD.gn
@@ -107,18 +107,20 @@ if (crashpad_is_ios) { sources += [ - "ios/exception_snapshot_ios.cc", - "ios/exception_snapshot_ios.h", - "ios/memory_snapshot_ios.cc", - "ios/memory_snapshot_ios.h", - "ios/module_snapshot_ios.cc", - "ios/module_snapshot_ios.h", - "ios/process_snapshot_ios.cc", - "ios/process_snapshot_ios.h", - "ios/system_snapshot_ios.cc", - "ios/system_snapshot_ios.h", - "ios/thread_snapshot_ios.cc", - "ios/thread_snapshot_ios.h", + "ios/exception_snapshot_ios_intermediate_dump.cc", + "ios/exception_snapshot_ios_intermediate_dump.h", + "ios/intermediate_dump_reader_util.cc", + "ios/intermediate_dump_reader_util.h", + "ios/memory_snapshot_ios_intermediate_dump.cc", + "ios/memory_snapshot_ios_intermediate_dump.h", + "ios/module_snapshot_ios_intermediate_dump.cc", + "ios/module_snapshot_ios_intermediate_dump.h", + "ios/process_snapshot_ios_intermediate_dump.cc", + "ios/process_snapshot_ios_intermediate_dump.h", + "ios/system_snapshot_ios_intermediate_dump.cc", + "ios/system_snapshot_ios_intermediate_dump.h", + "ios/thread_snapshot_ios_intermediate_dump.cc", + "ios/thread_snapshot_ios_intermediate_dump.h", "mac/cpu_context_mac.cc", "mac/cpu_context_mac.h", ] @@ -358,6 +360,13 @@ ] } + if (crashpad_is_ios) { + sources += [ + "ios/process_snapshot_ios_intermediate_dump_test.cc", + "mac/cpu_context_mac_test.cc", + ] + } + if (crashpad_is_linux || crashpad_is_android) { sources += [ "linux/debug_rendezvous_test.cc", @@ -433,6 +442,10 @@ deps += [ "../client" ] } + if (crashpad_is_ios) { + deps += [ "../minidump" ] + } + data_deps = [ ":crashpad_snapshot_test_module", ":crashpad_snapshot_test_module_large",
diff --git a/third_party/crashpad/crashpad/snapshot/capture_memory.cc b/third_party/crashpad/crashpad/snapshot/capture_memory.cc index 7a1b276..5c7ded46 100644 --- a/third_party/crashpad/crashpad/snapshot/capture_memory.cc +++ b/third_party/crashpad/crashpad/snapshot/capture_memory.cc
@@ -19,8 +19,8 @@ #include <limits> #include <memory> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "snapshot/memory_snapshot.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/snapshot/cpu_context.cc b/third_party/crashpad/crashpad/snapshot/cpu_context.cc index c75b555..643ad80 100644 --- a/third_party/crashpad/crashpad/snapshot/cpu_context.cc +++ b/third_party/crashpad/crashpad/snapshot/cpu_context.cc
@@ -17,8 +17,8 @@ #include <stddef.h> #include <string.h> +#include "base/cxx17_backports.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "util/misc/arraysize.h" #include "util/misc/implicit_cast.h"
diff --git a/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc b/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc index 109510d..b1340d6 100644 --- a/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc +++ b/third_party/crashpad/crashpad/snapshot/cpu_context_test.cc
@@ -18,7 +18,7 @@ #include <string.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "test/hex_string.h"
diff --git a/third_party/crashpad/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc b/third_party/crashpad/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc index 6c74ac64..a5885b0 100644 --- a/third_party/crashpad/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc +++ b/third_party/crashpad/crashpad/snapshot/fuchsia/memory_map_region_snapshot_fuchsia.cc
@@ -15,7 +15,7 @@ #include "snapshot/fuchsia/memory_map_region_snapshot_fuchsia.h" #include "base/check_op.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" namespace crashpad { namespace internal {
diff --git a/third_party/crashpad/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc b/third_party/crashpad/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc index 581fb4e4..4fcf6a4 100644 --- a/third_party/crashpad/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc +++ b/third_party/crashpad/crashpad/snapshot/fuchsia/process_reader_fuchsia_test.cc
@@ -20,7 +20,7 @@ #include <zircon/syscalls/port.h> #include <zircon/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "test/multiprocess_exec.h" #include "test/test_paths.h"
diff --git a/third_party/crashpad/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc b/third_party/crashpad/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc index e1b83ac6..04730117 100644 --- a/third_party/crashpad/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc +++ b/third_party/crashpad/crashpad/snapshot/fuchsia/process_snapshot_fuchsia_test.cc
@@ -17,9 +17,9 @@ #include <dbghelp.h> #include <zircon/syscalls.h> +#include "base/cxx17_backports.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "snapshot/fuchsia/process_snapshot_fuchsia.h"
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.cc deleted file mode 100644 index 0fad921..0000000 --- a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.cc +++ /dev/null
@@ -1,275 +0,0 @@ -// Copyright 2020 The Crashpad Authors. 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. -// 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. - -#include "snapshot/ios/exception_snapshot_ios.h" - -#include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "snapshot/cpu_context.h" -#include "snapshot/mac/cpu_context_mac.h" -#include "util/misc/from_pointer_cast.h" - -namespace crashpad { - -namespace internal { - -ExceptionSnapshotIOS::ExceptionSnapshotIOS() - : ExceptionSnapshot(), - context_(), - codes_(), - thread_id_(0), - exception_address_(0), - exception_(0), - exception_info_(0), - initialized_() {} - -ExceptionSnapshotIOS::~ExceptionSnapshotIOS() {} - -void ExceptionSnapshotIOS::InitializeFromSignal(const siginfo_t* siginfo, - const ucontext_t* context) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - mcontext_t mcontext = context->uc_mcontext; -#if defined(ARCH_CPU_X86_64) - context_.architecture = kCPUArchitectureX86_64; - context_.x86_64 = &context_x86_64_; - x86_debug_state64_t empty_debug_state = {}; - InitializeCPUContextX86_64(&context_x86_64_, - THREAD_STATE_NONE, - nullptr, - 0, - &mcontext->__ss, - &mcontext->__fs, - &empty_debug_state); -#elif defined(ARCH_CPU_ARM64) - context_.architecture = kCPUArchitectureARM64; - context_.arm64 = &context_arm64_; - arm_debug_state64_t empty_debug_state = {}; - InitializeCPUContextARM64(&context_arm64_, - THREAD_STATE_NONE, - nullptr, - 0, - &mcontext->__ss, - &mcontext->__ns, - &empty_debug_state); -#else -#error Port to your CPU architecture -#endif - - // Thread ID. - thread_identifier_info identifier_info; - mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; - kern_return_t kr = - thread_info(mach_thread_self(), - THREAD_IDENTIFIER_INFO, - reinterpret_cast<thread_info_t>(&identifier_info), - &count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_identifier_info"; - } else { - thread_id_ = identifier_info.thread_id; - } - - exception_ = siginfo->si_signo; - exception_info_ = siginfo->si_code; - - // TODO(justincohen): Investigate recording more codes_. - - exception_address_ = FromPointerCast<uintptr_t>(siginfo->si_addr); - - // TODO(justincohen): Record the source of the exception (signal, mach, etc). - - INITIALIZATION_STATE_SET_VALID(initialized_); -} - -void ExceptionSnapshotIOS::InitializeFromMachException( - exception_behavior_t behavior, - thread_t exception_thread, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t flavor, - ConstThreadState state, - mach_msg_type_number_t state_count) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - codes_.push_back(exception); - // TODO: rationalize with the macOS implementation. - for (mach_msg_type_number_t code_index = 0; code_index < code_count; - ++code_index) { - codes_.push_back(code[code_index]); - } - exception_ = exception; - exception_info_ = code[0]; - - // For serialization, float_state and, on x86, debug_state, will be identical - // between here and the thread_snapshot version for thread_id. That means - // this block getting float_state and debug_state can be skipped when doing - // proper serialization. -#if defined(ARCH_CPU_X86_64) - x86_thread_state64_t thread_state; - x86_float_state64_t float_state; - x86_debug_state64_t debug_state; - mach_msg_type_number_t thread_state_count = x86_THREAD_STATE64_COUNT; - mach_msg_type_number_t float_state_count = x86_FLOAT_STATE64_COUNT; - mach_msg_type_number_t debug_state_count = x86_DEBUG_STATE64_COUNT; - const thread_state_flavor_t kThreadStateFlavor = x86_THREAD_STATE64; - const thread_state_flavor_t kFloatStateFlavor = x86_FLOAT_STATE64; - const thread_state_flavor_t kDebugStateFlavor = x86_DEBUG_STATE64; -#elif defined(ARCH_CPU_ARM64) - arm_thread_state64_t thread_state; - arm_neon_state64_t float_state; - arm_debug_state64_t debug_state; - mach_msg_type_number_t float_state_count = ARM_NEON_STATE64_COUNT; - mach_msg_type_number_t thread_state_count = ARM_THREAD_STATE64_COUNT; - mach_msg_type_number_t debug_state_count = ARM_DEBUG_STATE64_COUNT; - const thread_state_flavor_t kThreadStateFlavor = ARM_THREAD_STATE64; - const thread_state_flavor_t kFloatStateFlavor = ARM_NEON_STATE64; - const thread_state_flavor_t kDebugStateFlavor = ARM_DEBUG_STATE64; -#endif - - kern_return_t kr = - thread_get_state(exception_thread, - kThreadStateFlavor, - reinterpret_cast<thread_state_t>(&thread_state), - &thread_state_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_get_state(" << kThreadStateFlavor << ")"; - } - - kr = thread_get_state(exception_thread, - kFloatStateFlavor, - reinterpret_cast<thread_state_t>(&float_state), - &float_state_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_get_state(" << kFloatStateFlavor << ")"; - } - - kr = thread_get_state(exception_thread, - kDebugStateFlavor, - reinterpret_cast<thread_state_t>(&debug_state), - &debug_state_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_get_state(" << kDebugStateFlavor << ")"; - } - -#if defined(ARCH_CPU_X86_64) - context_.architecture = kCPUArchitectureX86_64; - context_.x86_64 = &context_x86_64_; - InitializeCPUContextX86_64(&context_x86_64_, - flavor, - state, - state_count, - &thread_state, - &float_state, - &debug_state); -#elif defined(ARCH_CPU_ARM64) - context_.architecture = kCPUArchitectureARM64; - context_.arm64 = &context_arm64_; - InitializeCPUContextARM64(&context_arm64_, - flavor, - state, - state_count, - &thread_state, - &float_state, - &debug_state); -#else -#error Port to your CPU architecture -#endif - - // Thread ID. - thread_identifier_info identifier_info; - mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; - kr = thread_info(mach_thread_self(), - THREAD_IDENTIFIER_INFO, - reinterpret_cast<thread_info_t>(&identifier_info), - &count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_identifier_info"; - } else { - thread_id_ = identifier_info.thread_id; - } - - // Normally, for EXC_BAD_ACCESS exceptions, the exception address is present - // in code[1]. It may or may not be the instruction pointer address (usually - // it’s not). code[1] may carry the exception address for other exception - // types too, but it’s not guaranteed. But for all other exception types, the - // instruction pointer will be the exception address, and in fact will be - // equal to codes[1] when it’s carrying the exception address. In those cases, - // just use the instruction pointer directly. - bool code_1_is_exception_address = exception_ == EXC_BAD_ACCESS; - -#if defined(ARCH_CPU_X86_64) - // For x86 and x86_64 EXC_BAD_ACCESS exceptions, some code[0] values - // indicate that code[1] does not (or may not) carry the exception address: - // EXC_I386_GPFLT (10.9.5 xnu-2422.115.4/osfmk/i386/trap.c user_trap() for - // T_GENERAL_PROTECTION) and the oddball (VM_PROT_READ | VM_PROT_EXECUTE) - // which collides with EXC_I386_BOUNDFLT (10.9.5 - // xnu-2422.115.4/osfmk/i386/fpu.c fpextovrflt()). Other EXC_BAD_ACCESS - // exceptions come through 10.9.5 xnu-2422.115.4/osfmk/i386/trap.c - // user_page_fault_continue() and do contain the exception address in - // code[1]. - if (exception_ == EXC_BAD_ACCESS && - (exception_info_ == EXC_I386_GPFLT || - exception_info_ == (VM_PROT_READ | VM_PROT_EXECUTE))) { - code_1_is_exception_address = false; - } -#endif - - if (code_1_is_exception_address) { - exception_address_ = code[1]; - } else { - exception_address_ = context_.InstructionPointer(); - } - - INITIALIZATION_STATE_SET_VALID(initialized_); -} - -const CPUContext* ExceptionSnapshotIOS::Context() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return &context_; -} - -uint64_t ExceptionSnapshotIOS::ThreadID() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return thread_id_; -} - -uint32_t ExceptionSnapshotIOS::Exception() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return exception_; -} - -uint32_t ExceptionSnapshotIOS::ExceptionInfo() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return exception_info_; -} - -uint64_t ExceptionSnapshotIOS::ExceptionAddress() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return exception_address_; -} - -const std::vector<uint64_t>& ExceptionSnapshotIOS::Codes() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return codes_; -} - -std::vector<const MemorySnapshot*> ExceptionSnapshotIOS::ExtraMemory() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<const MemorySnapshot*>(); -} - -} // namespace internal -} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.h deleted file mode 100644 index 5c1337d..0000000 --- a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.h +++ /dev/null
@@ -1,92 +0,0 @@ -// Copyright 2020 The Crashpad Authors. 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. -// 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. - -#ifndef CRASHPAD_SNAPSHOT_IOS_EXCEPTION_SNAPSHOT_IOS_H_ -#define CRASHPAD_SNAPSHOT_IOS_EXCEPTION_SNAPSHOT_IOS_H_ - -#include <mach/mach.h> -#include <stdint.h> - -#include <vector> - -#include "base/macros.h" -#include "build/build_config.h" -#include "snapshot/cpu_context.h" -#include "snapshot/exception_snapshot.h" -#include "util/mach/mach_extensions.h" -#include "util/misc/initialization_state_dcheck.h" - -namespace crashpad { - -namespace internal { - -//! \brief An ExceptionSnapshot of an exception sustained by a running (or -//! crashed) process on an iOS system. -class ExceptionSnapshotIOS final : public ExceptionSnapshot { - public: - ExceptionSnapshotIOS(); - ~ExceptionSnapshotIOS() override; - - //! \brief Initializes the object from a signal. - //! - //! \return `true` if the snapshot could be created, `false` otherwise with - //! an appropriate message logged. - void InitializeFromSignal(const siginfo_t* siginfo, - const ucontext_t* context); - - //! \brief Initialize the object from a Mach exception for the current task. - //! - //! \return `true` if the snapshot could be created, `false` otherwise with - //! an appropriate message logged. - void InitializeFromMachException(exception_behavior_t behavior, - thread_t exception_thread, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t flavor, - ConstThreadState state, - mach_msg_type_number_t state_count); - // ExceptionSnapshot: - - const CPUContext* Context() const override; - uint64_t ThreadID() const override; - uint32_t Exception() const override; - uint32_t ExceptionInfo() const override; - uint64_t ExceptionAddress() const override; - const std::vector<uint64_t>& Codes() const override; - virtual std::vector<const MemorySnapshot*> ExtraMemory() const override; - - private: -#if defined(ARCH_CPU_X86_64) - CPUContextX86_64 context_x86_64_; -#elif defined(ARCH_CPU_ARM64) - CPUContextARM64 context_arm64_; -#else -#error Port. -#endif // ARCH_CPU_X86_64 - CPUContext context_; - std::vector<uint64_t> codes_; - uint64_t thread_id_; - uintptr_t exception_address_; - uint32_t exception_; - uint32_t exception_info_; - InitializationStateDcheck initialized_; - - DISALLOW_COPY_AND_ASSIGN(ExceptionSnapshotIOS); -}; - -} // namespace internal -} // namespace crashpad - -#endif // CRASHPAD_SNAPSHOT_IOS_EXCEPTION_SNAPSHOT_IOS_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc new file mode 100644 index 0000000..0d24029 --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.cc
@@ -0,0 +1,390 @@ +// Copyright 2020 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/exception_snapshot_ios_intermediate_dump.h" + +#include "base/logging.h" +#include "base/mac/mach_logging.h" +#include "snapshot/cpu_context.h" +#include "snapshot/ios/intermediate_dump_reader_util.h" +#include "snapshot/mac/cpu_context_mac.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/ios/ios_intermediate_dump_writer.h" +#include "util/misc/from_pointer_cast.h" + +namespace crashpad { + +namespace internal { + +size_t ThreadStateLengthForFlavor(thread_state_flavor_t flavor) { +#if defined(ARCH_CPU_X86_64) + switch (flavor) { + case x86_THREAD_STATE: + return sizeof(x86_thread_state_t); + case x86_FLOAT_STATE: + return sizeof(x86_float_state_t); + case x86_DEBUG_STATE: + return sizeof(x86_debug_state_t); + case x86_THREAD_STATE64: + return sizeof(x86_thread_state64_t); + case x86_FLOAT_STATE64: + return sizeof(x86_float_state64_t); + case x86_DEBUG_STATE64: + return sizeof(x86_debug_state64_t); + default: + return 0; + } +#elif defined(ARCH_CPU_ARM64) + switch (flavor) { + case ARM_UNIFIED_THREAD_STATE: + return sizeof(arm_unified_thread_state_t); + case ARM_THREAD_STATE64: + return sizeof(arm_thread_state64_t); + case ARM_NEON_STATE64: + return sizeof(arm_neon_state64_t); + case ARM_DEBUG_STATE64: + return sizeof(arm_debug_state64_t); + default: + return 0; + } +#endif +} + +using Key = IntermediateDumpKey; + +ExceptionSnapshotIOSIntermediateDump::ExceptionSnapshotIOSIntermediateDump() + : ExceptionSnapshot(), + context_(), + codes_(), + thread_id_(0), + exception_address_(0), + exception_(0), + exception_info_(0), + initialized_() { +#if defined(ARCH_CPU_X86_64) + context_.architecture = kCPUArchitectureX86_64; + context_.x86_64 = &context_x86_64_; +#elif defined(ARCH_CPU_ARM64) + context_.architecture = kCPUArchitectureARM64; + context_.arm64 = &context_arm64_; +#else +#error Port to your CPU architecture +#endif +} + +ExceptionSnapshotIOSIntermediateDump::~ExceptionSnapshotIOSIntermediateDump() {} + +bool ExceptionSnapshotIOSIntermediateDump::InitializeFromSignal( + const IOSIntermediateDumpMap* exception_data) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + DCHECK(exception_data); + + if (!GetDataValueFromMap(exception_data, Key::kThreadID, &thread_id_)) { + LOG(ERROR) << "Exceptions require a thread id."; + return false; + } + +#if defined(ARCH_CPU_X86_64) + typedef x86_thread_state64_t thread_state_type; + typedef x86_float_state64_t float_state_type; +#elif defined(ARCH_CPU_ARM64) + typedef arm_thread_state64_t thread_state_type; + typedef arm_neon_state64_t float_state_type; +#endif + + thread_state_type thread_state; + float_state_type float_state; + if (GetDataValueFromMap(exception_data, Key::kThreadState, &thread_state) && + GetDataValueFromMap(exception_data, Key::kFloatState, &float_state)) { +#if defined(ARCH_CPU_X86_64) + x86_debug_state64_t empty_debug_state = {}; + InitializeCPUContextX86_64(&context_x86_64_, + THREAD_STATE_NONE, + nullptr, + 0, + &thread_state, + &float_state, + &empty_debug_state); +#elif defined(ARCH_CPU_ARM64) + arm_debug_state64_t empty_debug_state = {}; + InitializeCPUContextARM64(&context_arm64_, + THREAD_STATE_NONE, + nullptr, + 0, + &thread_state, + &float_state, + &empty_debug_state); +#else +#error Port to your CPU architecture +#endif + } + + GetDataValueFromMap(exception_data, Key::kSignalNumber, &exception_); + GetDataValueFromMap(exception_data, Key::kSignalCode, &exception_info_); + GetDataValueFromMap(exception_data, Key::kSignalAddress, &exception_address_); + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +bool ExceptionSnapshotIOSIntermediateDump::InitializeFromMachException( + const IOSIntermediateDumpMap* exception_data, + const IOSIntermediateDumpList* thread_list) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + DCHECK(exception_data); + + if (!GetDataValueFromMap(exception_data, Key::kThreadID, &thread_id_)) { + LOG(ERROR) << "Exceptions require a thread id."; + return false; + } + + exception_type_t exception; + if (GetDataValueFromMap(exception_data, Key::kException, &exception)) { + codes_.push_back(exception); + exception_ = exception; + } + + mach_msg_type_number_t code_count; + GetDataValueFromMap(exception_data, Key::kCodeCount, &code_count); + + const IOSIntermediateDumpData* code_dump = + GetDataFromMap(exception_data, Key::kCode); + if (code_dump) { + const std::vector<uint8_t>& bytes = code_dump->bytes(); + const mach_exception_data_type_t* code = + reinterpret_cast<const mach_exception_data_type_t*>(bytes.data()); + if (!code || + bytes.size() != sizeof(mach_exception_data_type_t) * code_count) { + LOG(ERROR) << "Invalid mach exception code."; + } else { + // TODO: rationalize with the macOS implementation. + for (mach_msg_type_number_t code_index = 0; code_index < code_count; + ++code_index) { + codes_.push_back(code[code_index]); + } + exception_info_ = code[0]; + exception_address_ = code[1]; + } + } + + if (thread_list) { + for (const auto& other_thread : *thread_list) { + uint64_t other_thread_id; + if (GetDataValueFromMap( + other_thread.get(), Key::kThreadID, &other_thread_id)) { + if (thread_id_ == other_thread_id) { + LoadContextFromThread(exception_data, other_thread.get()); + break; + } + } + } + } + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +bool ExceptionSnapshotIOSIntermediateDump::InitializeFromNSException( + const IOSIntermediateDumpMap* exception_data, + const IOSIntermediateDumpList* thread_list) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + DCHECK(exception_data); + + exception_ = EXC_SOFTWARE; + exception_info_ = 0xDEADC0DE; /* uncaught NSException */ + + if (!GetDataValueFromMap(exception_data, Key::kThreadID, &thread_id_)) { + LOG(ERROR) << "Exceptions require a thread id."; + return false; + } + + if (thread_list) { + for (const auto& other_thread : *thread_list) { + uint64_t other_thread_id; + if (GetDataValueFromMap( + other_thread.get(), Key::kThreadID, &other_thread_id)) { + if (thread_id_ == other_thread_id) { + const IOSIntermediateDumpData* uncaught_exceptions = + other_thread->GetAsData(Key::kThreadUncaughtNSExceptionFrames); + if (uncaught_exceptions) { + LoadContextFromUncaughtNSExceptionFrames(uncaught_exceptions, + other_thread.get()); + } else { + LoadContextFromThread(exception_data, other_thread.get()); + } + break; + } + } + } + } + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +const CPUContext* ExceptionSnapshotIOSIntermediateDump::Context() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return &context_; +} + +uint64_t ExceptionSnapshotIOSIntermediateDump::ThreadID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return thread_id_; +} + +uint32_t ExceptionSnapshotIOSIntermediateDump::Exception() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return exception_; +} + +uint32_t ExceptionSnapshotIOSIntermediateDump::ExceptionInfo() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return exception_info_; +} + +uint64_t ExceptionSnapshotIOSIntermediateDump::ExceptionAddress() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return exception_address_; +} + +const std::vector<uint64_t>& ExceptionSnapshotIOSIntermediateDump::Codes() + const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return codes_; +} + +std::vector<const MemorySnapshot*> +ExceptionSnapshotIOSIntermediateDump::ExtraMemory() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<const MemorySnapshot*>(); +} + +void ExceptionSnapshotIOSIntermediateDump::LoadContextFromThread( + const IOSIntermediateDumpMap* exception_data, + const IOSIntermediateDumpMap* other_thread) { +#if defined(ARCH_CPU_X86_64) + typedef x86_thread_state64_t thread_state_type; + typedef x86_float_state64_t float_state_type; + typedef x86_debug_state64_t debug_state_type; +#elif defined(ARCH_CPU_ARM64) + typedef arm_thread_state64_t thread_state_type; + typedef arm_neon_state64_t float_state_type; + typedef arm_debug_state64_t debug_state_type; +#endif + + thread_state_type thread_state; + float_state_type float_state; + debug_state_type debug_state; + + mach_msg_type_number_t state_count = 0; + thread_state_flavor_t flavor = THREAD_STATE_NONE; + if (GetDataValueFromMap(exception_data, Key::kStateCount, &state_count) && + GetDataValueFromMap(exception_data, Key::kFlavor, &flavor) && + GetDataValueFromMap(other_thread, Key::kThreadState, &thread_state) && + GetDataValueFromMap(other_thread, Key::kFloatState, &float_state) && + GetDataValueFromMap(other_thread, Key::kDebugState, &debug_state)) { + size_t expected_length = ThreadStateLengthForFlavor(flavor); + const IOSIntermediateDumpData* state_dump = + GetDataFromMap(exception_data, Key::kState); + if (state_dump) { + const std::vector<uint8_t>& bytes = state_dump->bytes(); + size_t actual_length = bytes.size(); + if (expected_length == actual_length) { + const ConstThreadState state = + reinterpret_cast<const ConstThreadState>(bytes.data()); +#if defined(ARCH_CPU_X86_64) + InitializeCPUContextX86_64(&context_x86_64_, + flavor, + state, + state_count, + &thread_state, + &float_state, + &debug_state); +#elif defined(ARCH_CPU_ARM64) + InitializeCPUContextARM64(&context_arm64_, + flavor, + state, + state_count, + &thread_state, + &float_state, + &debug_state); +#else +#error Port to your CPU architecture +#endif + } + } + } + + // Normally, for EXC_BAD_ACCESS exceptions, the exception address is present + // in code[1]. It may or may not be the instruction pointer address (usually + // it’s not). code[1] may carry the exception address for other exception + // types too, but it’s not guaranteed. But for all other exception types, the + // instruction pointer will be the exception address, and in fact will be + // equal to codes[1] when it’s carrying the exception address. In those cases, + // just use the instruction pointer directly. + bool code_1_is_exception_address = exception_ == EXC_BAD_ACCESS; + +#if defined(ARCH_CPU_X86_64) + // For x86 and x86_64 EXC_BAD_ACCESS exceptions, some code[0] values + // indicate that code[1] does not (or may not) carry the exception address: + // EXC_I386_GPFLT (10.9.5 xnu-2422.115.4/osfmk/i386/trap.c user_trap() for + // T_GENERAL_PROTECTION) and the oddball (VM_PROT_READ | VM_PROT_EXECUTE) + // which collides with EXC_I386_BOUNDFLT (10.9.5 + // xnu-2422.115.4/osfmk/i386/fpu.c fpextovrflt()). Other EXC_BAD_ACCESS + // exceptions come through 10.9.5 xnu-2422.115.4/osfmk/i386/trap.c + // user_page_fault_continue() and do contain the exception address in + // code[1]. + if (exception_ == EXC_BAD_ACCESS && + (exception_info_ == EXC_I386_GPFLT || + exception_info_ == (VM_PROT_READ | VM_PROT_EXECUTE))) { + code_1_is_exception_address = false; + } +#endif + + if (!code_1_is_exception_address) { + exception_address_ = context_.InstructionPointer(); + } +} + +void ExceptionSnapshotIOSIntermediateDump:: + LoadContextFromUncaughtNSExceptionFrames( + const IOSIntermediateDumpData* frames_dump, + const IOSIntermediateDumpMap* other_thread) { + const std::vector<uint8_t>& bytes = frames_dump->bytes(); + const uint64_t* frames = reinterpret_cast<const uint64_t*>(bytes.data()); + size_t num_frames = bytes.size() / sizeof(uint64_t); + if (num_frames < 2) { + return; + } + +#if defined(ARCH_CPU_X86_64) + context_x86_64_ = {}; + context_x86_64_.rip = frames[0]; // instruction pointer + context_x86_64_.rsp = frames[1]; +#elif defined(ARCH_CPU_ARM64) + context_arm64_ = {}; + context_arm64_.sp = 0; + context_arm64_.pc = frames[0]; + context_arm64_.regs[30] = frames[1]; // link register + context_arm64_.regs[29] = sizeof(uintptr_t); // function pointers +#else +#error Port to your CPU architecture +#endif + + exception_address_ = frames[0]; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h new file mode 100644 index 0000000..88d5ea6c --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios_intermediate_dump.h
@@ -0,0 +1,112 @@ +// Copyright 2020 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_EXCEPTION_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_EXCEPTION_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ + +#include <mach/mach.h> +#include <stdint.h> + +#include <vector> + +#include "base/macros.h" +#include "build/build_config.h" +#include "snapshot/cpu_context.h" +#include "snapshot/exception_snapshot.h" +#include "util/ios/ios_intermediate_dump_map.h" +#include "util/mach/mach_extensions.h" +#include "util/misc/initialization_state_dcheck.h" + +namespace crashpad { + +namespace internal { + +//! \brief An ExceptionSnapshot of an exception sustained by a running (or +//! crashed) process on an iOS system. +class ExceptionSnapshotIOSIntermediateDump final : public ExceptionSnapshot { + public: + ExceptionSnapshotIOSIntermediateDump(); + ~ExceptionSnapshotIOSIntermediateDump() override; + + //! \brief Initialize the snapshot as a signal exception. + //! + //! \param[in] exception_data The intermediate dump map used to initialize + //! this object. + //! + //! \return `true` if the snapshot could be created, `false` otherwise with + //! an appropriate message logged. + bool InitializeFromSignal(const IOSIntermediateDumpMap* exception_data); + + //! \brief Initialize the object as a Mach exception from an intermediate + //! dump. + //! + //! \param[in] exception_data The intermediate dump map used to initialize + //! this object. + //! \param[in] thread_list The intermediate dump map containing list of + //! threads. + //! + //! \return `true` if the snapshot could be created, `false` otherwise with + //! an appropriate message logged. + bool InitializeFromMachException(const IOSIntermediateDumpMap* exception_data, + const IOSIntermediateDumpList* thread_list); + + //! \brief Initialize the object as an NSException from an intermediate dump. + //! + //! \param[in] exception_data The intermediate dump map used to initialize + //! this object. + //! \param[in] thread_list The intermediate dump map containing list of + //! threads. + //! + //! \return `true` if the snapshot could be created, `false` otherwise with + //! an appropriate message logged. + bool InitializeFromNSException(const IOSIntermediateDumpMap* exception_data, + const IOSIntermediateDumpList* thread_list); + + // ExceptionSnapshot: + const CPUContext* Context() const override; + uint64_t ThreadID() const override; + uint32_t Exception() const override; + uint32_t ExceptionInfo() const override; + uint64_t ExceptionAddress() const override; + const std::vector<uint64_t>& Codes() const override; + virtual std::vector<const MemorySnapshot*> ExtraMemory() const override; + + private: + void LoadContextFromUncaughtNSExceptionFrames( + const IOSIntermediateDumpData* data, + const IOSIntermediateDumpMap* other_thread); + void LoadContextFromThread(const IOSIntermediateDumpMap* exception_data, + const IOSIntermediateDumpMap* other_thread); +#if defined(ARCH_CPU_X86_64) + CPUContextX86_64 context_x86_64_; +#elif defined(ARCH_CPU_ARM64) + CPUContextARM64 context_arm64_; +#else +#error Port. +#endif // ARCH_CPU_X86_64 + CPUContext context_; + std::vector<uint64_t> codes_; + uint64_t thread_id_; + uintptr_t exception_address_; + uint32_t exception_; + uint32_t exception_info_; + InitializationStateDcheck initialized_; + + DISALLOW_COPY_AND_ASSIGN(ExceptionSnapshotIOSIntermediateDump); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_EXCEPTION_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/intermediate_dump_reader_util.cc b/third_party/crashpad/crashpad/snapshot/ios/intermediate_dump_reader_util.cc new file mode 100644 index 0000000..74c0842c --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/intermediate_dump_reader_util.cc
@@ -0,0 +1,93 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/intermediate_dump_reader_util.h" + +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_map.h" +#include "util/misc/metrics.h" + +namespace crashpad { +namespace internal { + +std::ostream& operator<<(std::ostream& os, const IntermediateDumpKey& t) { + switch (t) { +#define X(Name, Value) \ + case IntermediateDumpKey::Name: \ + os << #Name; \ + break; + INTERMEDIATE_DUMP_KEYS(X) +#undef X + } + return os; +} + +const IOSIntermediateDumpData* GetDataFromMap( + const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key, + LogMissingDataValueFromMap logging) { + const IOSIntermediateDumpData* data = map->GetAsData(key); + if (!data) { + if (logging != LogMissingDataValueFromMap::kDontLogIfMissing) { + LOG(ERROR) << "Missing expected data for key " << key; + Metrics::MissingIntermediateDumpKey(key); + } + return nullptr; + } + return data; +} + +const IOSIntermediateDumpMap* GetMapFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key) { + const IOSIntermediateDumpMap* map_dump = map->GetAsMap(key); + if (!map_dump) { + LOG(ERROR) << "Missing expected map for key " << key; + Metrics::MissingIntermediateDumpKey(key); + return nullptr; + } + return map_dump; +} + +const IOSIntermediateDumpList* GetListFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key) { + const IOSIntermediateDumpList* list = map->GetAsList(key); + if (!list) { + LOG(ERROR) << "Missing expected list for key " << key; + Metrics::MissingIntermediateDumpKey(key); + return nullptr; + } + return list; +} + +bool GetDataStringFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key, + std::string* value) { + const IOSIntermediateDumpData* data = GetDataFromMap(map, key); + if (!data) { + LOG(ERROR) << "Missing expected string for key " << key; + Metrics::MissingIntermediateDumpKey(key); + return false; + } + + *value = data->GetString(); + return true; +} + +void GetDataValueFromMapErrorInternal(const IntermediateDumpKey& key) { + LOG(ERROR) << "Invalid key size: " << key; + Metrics::InvalidIntermediateDumpKeySize(key); +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/intermediate_dump_reader_util.h b/third_party/crashpad/crashpad/snapshot/ios/intermediate_dump_reader_util.h new file mode 100644 index 0000000..4d33d965 --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/intermediate_dump_reader_util.h
@@ -0,0 +1,116 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include <ostream> + +#include "base/logging.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_map.h" + +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_READER_UTILS_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_READER_UTILS_H_ + +namespace crashpad { + +namespace internal { + +//! \brief Overload the ostream output operator to make logged keys readable. +std::ostream& operator<<(std::ostream& os, const IntermediateDumpKey& t); + +//! \brief Determine if GetDataFromMap will log and report missing keys. +enum class LogMissingDataValueFromMap : bool { + //! \brief Do not log an error and report to UMA if a key is missing. + kDontLogIfMissing, + + //! \brief Log an error and report to UMA if a key is missing. + kLogIfMissing, +}; + +//! \brief Call GetAsData with error and UMA logging. +//! +//! \param[in] map The map to load from. +//! \param[in] key The key to load from \a map. +//! \param[in] logging This call will log missing keys unless \a logging is +//! LogDataValueFromMap::kDontLogIfMissing +//! +//! \return The IOSIntermediateDumpData pointer or a nullptr; +const IOSIntermediateDumpData* GetDataFromMap( + const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key, + LogMissingDataValueFromMap logging = + LogMissingDataValueFromMap::kLogIfMissing); + +//! \brief Call GetAsMap with error and UMA logging. +//! +//! \param[in] map The map to load from. +//! \param[in] key The key to load from \a map. +//! +//! \return The IOSIntermediateDumpMap pointer or a nullptr; +const IOSIntermediateDumpMap* GetMapFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key); + +//! \brief Call GetAsList with error and UMA logging. +//! +//! \param[in] map The map to load from. +//! \param[in] key The key to load from \a map. +//! +//! \return The IOSIntermediateDumpList pointer or a nullptr; +const IOSIntermediateDumpList* GetListFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key); + +//! \brief Call GetAsList with error and UMA logging. +//! +//! \param[in] map The map to load from. +//! \param[in] key The key to load from \a map. +//! +//! \return Returns `true` if the string could be loaded, otherwise returns +//! `false` and logs an error. +bool GetDataStringFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key, + std::string* value); + +//! \brief Log key size error and record error with UMA. +void GetDataValueFromMapErrorInternal(const IntermediateDumpKey& key); + +//! \brief Call GetAsData and GetValue with error and UMA logging. +//! +//! \param[in] map The map to load from. +//! \param[in] key The key to load from \a map. +//! \param[out] value The data to populate. +//! \param[in] logging This call will log missing keys unless \a logging is +//! LogDataValueFromMap::kDontLogIfMissing. This call will always log +//! keys with an invalid size. +//! +//! \return On success, returns `true`, otherwise returns `false`. +template <typename T> +bool GetDataValueFromMap(const IOSIntermediateDumpMap* map, + const IntermediateDumpKey& key, + T* value, + LogMissingDataValueFromMap logging = + LogMissingDataValueFromMap::kLogIfMissing) { + const IOSIntermediateDumpData* data = GetDataFromMap(map, key, logging); + if (!data) { + return false; + } + if (!data->GetValue(value)) { + GetDataValueFromMapErrorInternal(key); + return false; + } + return true; +} + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_READER_UTILS_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc similarity index 62% rename from third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios.cc rename to third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc index e760465..8e521d90 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios.cc +++ b/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.cc
@@ -12,52 +12,50 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "snapshot/ios/memory_snapshot_ios.h" +#include "snapshot/ios/memory_snapshot_ios_intermediate_dump.h" namespace crashpad { namespace internal { -void MemorySnapshotIOS::Initialize(vm_address_t address, vm_size_t size) { +void MemorySnapshotIOSIntermediateDump::Initialize(vm_address_t address, + vm_address_t data, + vm_size_t size) { INITIALIZATION_STATE_SET_INITIALIZING(initialized_); address_ = address; + data_ = data; size_ = base::checked_cast<size_t>(size); - - // TODO(justincohen): This is temporary, as MemorySnapshotIOS will likely be - // able to point directly to the deserialized data dump rather than copying - // data around. - buffer_ = std::unique_ptr<uint8_t[]>(new uint8_t[size_]); - memcpy(buffer_.get(), reinterpret_cast<void*>(address_), size_); INITIALIZATION_STATE_SET_VALID(initialized_); } -uint64_t MemorySnapshotIOS::Address() const { +uint64_t MemorySnapshotIOSIntermediateDump::Address() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); return address_; } -size_t MemorySnapshotIOS::Size() const { +size_t MemorySnapshotIOSIntermediateDump::Size() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); return size_; } -bool MemorySnapshotIOS::Read(Delegate* delegate) const { +bool MemorySnapshotIOSIntermediateDump::Read(Delegate* delegate) const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); if (size_ == 0) { return delegate->MemorySnapshotDelegateRead(nullptr, size_); } - return delegate->MemorySnapshotDelegateRead(buffer_.get(), size_); + return delegate->MemorySnapshotDelegateRead(reinterpret_cast<void*>(data_), + size_); } -const MemorySnapshot* MemorySnapshotIOS::MergeWithOtherSnapshot( +const MemorySnapshot* MemorySnapshotIOSIntermediateDump::MergeWithOtherSnapshot( const MemorySnapshot* other) const { CheckedRange<uint64_t, size_t> merged(0, 0); if (!LoggingDetermineMergedRange(this, other, &merged)) return nullptr; - auto result = std::make_unique<MemorySnapshotIOS>(); - result->Initialize(merged.base(), merged.size()); + auto result = std::make_unique<MemorySnapshotIOSIntermediateDump>(); + result->Initialize(merged.base(), data_, merged.size()); return result.release(); }
diff --git a/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h similarity index 72% rename from third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios.h rename to third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h index be991056..895cbd0 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/memory_snapshot_ios_intermediate_dump.h
@@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef CRASHPAD_SNAPSHOT_IOS_MEMORY_SNAPSHOT_IOS_H_ -#define CRASHPAD_SNAPSHOT_IOS_MEMORY_SNAPSHOT_IOS_H_ +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_MEMORY_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_MEMORY_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #include "base/macros.h" #include "snapshot/memory_snapshot.h" @@ -24,16 +24,16 @@ namespace internal { //! \brief A MemorySnapshot of a memory region. -class MemorySnapshotIOS final : public MemorySnapshot { +class MemorySnapshotIOSIntermediateDump final : public MemorySnapshot { public: - MemorySnapshotIOS() = default; - ~MemorySnapshotIOS() = default; + MemorySnapshotIOSIntermediateDump() = default; + ~MemorySnapshotIOSIntermediateDump() = default; //! \brief Initializes the object. //! //! \param[in] address The base address of the memory region to snapshot. //! \param[in] size The size of the memory region to snapshot. - void Initialize(vm_address_t address, vm_size_t size); + void Initialize(vm_address_t address, vm_address_t data, vm_size_t size); // MemorySnapshot: uint64_t Address() const override; @@ -48,16 +48,15 @@ const T* self, const MemorySnapshot* other); - // TODO(justincohen): This is temporary until deserialization is worked out. - std::unique_ptr<uint8_t[]> buffer_; vm_address_t address_; + vm_address_t data_; vm_size_t size_; InitializationStateDcheck initialized_; - DISALLOW_COPY_AND_ASSIGN(MemorySnapshotIOS); + DISALLOW_COPY_AND_ASSIGN(MemorySnapshotIOSIntermediateDump); }; } // namespace internal } // namespace crashpad -#endif // CRASHPAD_SNAPSHOT_IOS_MEMORY_SNAPSHOT_IOS_H_ +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_MEMORY_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.cc deleted file mode 100644 index 8b251eb..0000000 --- a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.cc +++ /dev/null
@@ -1,238 +0,0 @@ -// Copyright 2020 The Crashpad Authors. 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. -// 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. - -#include "snapshot/ios/module_snapshot_ios.h" - -#include <mach-o/loader.h> -#include <mach/mach.h> - -#include "base/files/file_path.h" -#include "base/mac/mach_logging.h" -#include "util/misc/from_pointer_cast.h" -#include "util/misc/uuid.h" - -namespace crashpad { -namespace internal { - -ModuleSnapshotIOS::ModuleSnapshotIOS() - : ModuleSnapshot(), - name_(), - address_(0), - size_(0), - timestamp_(0), - dylib_version_(0), - source_version_(0), - filetype_(0), - initialized_() {} - -ModuleSnapshotIOS::~ModuleSnapshotIOS() {} - -// static. -const dyld_all_image_infos* ModuleSnapshotIOS::DyldAllImageInfo() { - task_dyld_info_data_t dyld_info; - mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT; - - kern_return_t kr = task_info(mach_task_self(), - TASK_DYLD_INFO, - reinterpret_cast<task_info_t>(&dyld_info), - &count); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "task_info"; - return 0; - } - - return reinterpret_cast<dyld_all_image_infos*>(dyld_info.all_image_info_addr); -} - -bool ModuleSnapshotIOS::InitializeDyld(const dyld_all_image_infos* images) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - name_ = images->dyldPath; - address_ = FromPointerCast<uint64_t>(images->dyldImageLoadAddress); - return FinishInitialization(); -} - -bool ModuleSnapshotIOS::Initialize(const dyld_image_info* image) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - name_ = image->imageFilePath; - address_ = FromPointerCast<uint64_t>(image->imageLoadAddress); - timestamp_ = image->imageFileModDate; - return FinishInitialization(); -} - -bool ModuleSnapshotIOS::FinishInitialization() { -#ifndef ARCH_CPU_64_BITS -#error Only 64-bit Mach-O is supported -#endif - DCHECK(address_); - const mach_header_64* header = - reinterpret_cast<const mach_header_64*>(address_); - const load_command* command = - reinterpret_cast<const load_command*>(header + 1); - // Make sure that the basic load command structure doesn’t overflow the - // space allotted for load commands, as well as iterating through ncmds. - for (uint32_t cmd_index = 0, cumulative_cmd_size = 0; - cmd_index <= header->ncmds && cumulative_cmd_size < header->sizeofcmds; - ++cmd_index, cumulative_cmd_size += command->cmdsize) { - if (command->cmd == LC_SEGMENT_64) { - const segment_command_64* segment = - reinterpret_cast<const segment_command_64*>(command); - if (strcmp(segment->segname, SEG_TEXT) == 0) { - size_ = segment->vmsize; - } - } else if (command->cmd == LC_ID_DYLIB) { - const dylib_command* dylib = - reinterpret_cast<const dylib_command*>(command); - dylib_version_ = dylib->dylib.current_version; - } else if (command->cmd == LC_SOURCE_VERSION) { - const source_version_command* source_version = - reinterpret_cast<const source_version_command*>(command); - source_version_ = source_version->version; - } else if (command->cmd == LC_UUID) { - const uuid_command* uuid = reinterpret_cast<const uuid_command*>(command); - uuid_.InitializeFromBytes(uuid->uuid); - } - - command = reinterpret_cast<const load_command*>( - reinterpret_cast<const uint8_t*>(command) + command->cmdsize); - - // TODO(justincohen): Warn-able things: - // - Bad Mach-O magic (and give up trying to process the module) - // - Unrecognized Mach-O type - // - No SEG_TEXT - // - More than one SEG_TEXT - // - More than one LC_ID_DYLIB, LC_SOURCE_VERSION, or LC_UUID - // - No LC_ID_DYLIB in a dylib file - // - LC_ID_DYLIB in a non-dylib file - // And more optional: - // - Missing LC_UUID (although it leaves us with a big "?") - // - Missing LC_SOURCE_VERSION. - } - - filetype_ = header->filetype; - - INITIALIZATION_STATE_SET_VALID(initialized_); - return true; -} - -std::string ModuleSnapshotIOS::Name() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return name_; -} - -uint64_t ModuleSnapshotIOS::Address() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return address_; -} - -uint64_t ModuleSnapshotIOS::Size() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return size_; -} - -time_t ModuleSnapshotIOS::Timestamp() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return timestamp_; -} - -void ModuleSnapshotIOS::FileVersion(uint16_t* version_0, - uint16_t* version_1, - uint16_t* version_2, - uint16_t* version_3) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - if (filetype_ == MH_DYLIB) { - *version_0 = (dylib_version_ & 0xffff0000) >> 16; - *version_1 = (dylib_version_ & 0x0000ff00) >> 8; - *version_2 = (dylib_version_ & 0x000000ff); - *version_3 = 0; - } else { - *version_0 = 0; - *version_1 = 0; - *version_2 = 0; - *version_3 = 0; - } -} - -void ModuleSnapshotIOS::SourceVersion(uint16_t* version_0, - uint16_t* version_1, - uint16_t* version_2, - uint16_t* version_3) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *version_0 = (source_version_ & 0xffff000000000000u) >> 48; - *version_1 = (source_version_ & 0x0000ffff00000000u) >> 32; - *version_2 = (source_version_ & 0x00000000ffff0000u) >> 16; - *version_3 = source_version_ & 0x000000000000ffffu; -} - -ModuleSnapshot::ModuleType ModuleSnapshotIOS::GetModuleType() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - switch (filetype_) { - case MH_EXECUTE: - return kModuleTypeExecutable; - case MH_DYLIB: - return kModuleTypeSharedLibrary; - case MH_DYLINKER: - return kModuleTypeDynamicLoader; - case MH_BUNDLE: - return kModuleTypeLoadableModule; - default: - return kModuleTypeUnknown; - } -} - -void ModuleSnapshotIOS::UUIDAndAge(crashpad::UUID* uuid, uint32_t* age) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *uuid = uuid_; - *age = 0; -} - -std::string ModuleSnapshotIOS::DebugFileName() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return base::FilePath(Name()).BaseName().value(); -} - -std::vector<uint8_t> ModuleSnapshotIOS::BuildID() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<uint8_t>(); -} - -std::vector<std::string> ModuleSnapshotIOS::AnnotationsVector() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<std::string>(); -} - -std::map<std::string, std::string> ModuleSnapshotIOS::AnnotationsSimpleMap() - const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::map<std::string, std::string>(); -} - -std::vector<AnnotationSnapshot> ModuleSnapshotIOS::AnnotationObjects() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<AnnotationSnapshot>(); -} - -std::set<CheckedRange<uint64_t>> ModuleSnapshotIOS::ExtraMemoryRanges() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::set<CheckedRange<uint64_t>>(); -} - -std::vector<const UserMinidumpStream*> -ModuleSnapshotIOS::CustomMinidumpStreams() const { - return std::vector<const UserMinidumpStream*>(); -} - -} // namespace internal -} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc new file mode 100644 index 0000000..cdef7697 --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.cc
@@ -0,0 +1,266 @@ +// Copyright 2020 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/module_snapshot_ios_intermediate_dump.h" + +#include <mach-o/loader.h> +#include <mach/mach.h> + +#include "base/files/file_path.h" +#include "base/mac/mach_logging.h" +#include "snapshot/ios/intermediate_dump_reader_util.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/misc/from_pointer_cast.h" +#include "util/misc/uuid.h" + +namespace crashpad { +namespace internal { + +using Key = IntermediateDumpKey; + +ModuleSnapshotIOSIntermediateDump::ModuleSnapshotIOSIntermediateDump() + : ModuleSnapshot(), + name_(), + address_(0), + size_(0), + timestamp_(0), + dylib_version_(0), + source_version_(0), + filetype_(0), + initialized_() {} + +ModuleSnapshotIOSIntermediateDump::~ModuleSnapshotIOSIntermediateDump() {} + +bool ModuleSnapshotIOSIntermediateDump::Initialize( + const IOSIntermediateDumpMap* image_data) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + GetDataStringFromMap(image_data, Key::kName, &name_); + GetDataValueFromMap(image_data, Key::kAddress, &address_); + GetDataValueFromMap(image_data, Key::kSize, &size_); + GetDataValueFromMap(image_data, Key::kSourceVersion, &source_version_); + GetDataValueFromMap(image_data, Key::kFileType, &filetype_); + + // These keys are often missing. + GetDataValueFromMap(image_data, + Key::kTimestamp, + ×tamp_, + LogMissingDataValueFromMap::kDontLogIfMissing); + GetDataValueFromMap(image_data, + Key::kDylibCurrentVersion, + &dylib_version_, + LogMissingDataValueFromMap::kDontLogIfMissing); + + const IOSIntermediateDumpData* uuid_dump = + GetDataFromMap(image_data, IntermediateDumpKey::kUUID); + if (uuid_dump) { + const std::vector<uint8_t>& bytes = uuid_dump->bytes(); + if (!bytes.data() || bytes.size() != 16) { + LOG(ERROR) << "Invalid module uuid."; + } else { + uuid_.InitializeFromBytes(bytes.data()); + } + } + + const IOSIntermediateDumpList* annotation_list = + image_data->GetAsList(IntermediateDumpKey::kAnnotationObjects); + if (annotation_list) { + for (auto& annotation : *annotation_list) { + std::string name; + if (!GetDataStringFromMap( + annotation.get(), Key::kAnnotationName, &name) || + name.empty() || name.length() > 64) { // Annotation::kNameMaxLength + LOG(ERROR) << "Invalid annotation name length."; + continue; + } + + uint16_t type; + const IOSIntermediateDumpData* type_dump = + annotation->GetAsData(IntermediateDumpKey::kAnnotationType); + const IOSIntermediateDumpData* value_dump = + annotation->GetAsData(IntermediateDumpKey::kAnnotationValue); + if (type_dump && value_dump && type_dump->GetValue<uint16_t>(&type)) { + const std::vector<uint8_t>& bytes = value_dump->bytes(); + uint64_t length = bytes.size(); + if (!bytes.data() || length > 20480) { // Annotation::kValueMaxSize + LOG(ERROR) << "Invalid annotation value length."; + continue; + } + annotation_objects_.push_back(AnnotationSnapshot(name, type, bytes)); + } + } + } + + const IOSIntermediateDumpList* simple_map_dump = + image_data->GetAsList(IntermediateDumpKey::kAnnotationsSimpleMap); + if (simple_map_dump) { + for (auto& annotation : *simple_map_dump) { + const IOSIntermediateDumpData* name_dump = + annotation->GetAsData(IntermediateDumpKey::kAnnotationName); + const IOSIntermediateDumpData* value_dump = + annotation->GetAsData(IntermediateDumpKey::kAnnotationValue); + if (name_dump && value_dump) { + annotations_simple_map_.insert( + make_pair(name_dump->GetString(), value_dump->GetString())); + } + } + } + + const IOSIntermediateDumpMap* crash_info_dump = + image_data->GetAsMap(IntermediateDumpKey::kAnnotationsCrashInfo); + if (crash_info_dump) { + const IOSIntermediateDumpData* message1_dump = crash_info_dump->GetAsData( + IntermediateDumpKey::kAnnotationsCrashInfoMessage1); + if (message1_dump) { + std::string message1 = message1_dump->GetString(); + if (!message1.empty()) + annotations_vector_.push_back(message1); + } + const IOSIntermediateDumpData* message2_dump = crash_info_dump->GetAsData( + IntermediateDumpKey::kAnnotationsCrashInfoMessage2); + if (message2_dump) { + std::string message2 = message2_dump->GetString(); + if (!message2.empty()) + annotations_vector_.push_back(message2); + } + } + + const IOSIntermediateDumpData* dyld_error_dump = + image_data->GetAsData(IntermediateDumpKey::kAnnotationsDyldErrorString); + if (dyld_error_dump) { + std::string dyld_error_string = dyld_error_dump->GetString(); + if (!dyld_error_string.empty()) + annotations_vector_.push_back(dyld_error_string); + } + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +std::string ModuleSnapshotIOSIntermediateDump::Name() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return name_; +} + +uint64_t ModuleSnapshotIOSIntermediateDump::Address() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return address_; +} + +uint64_t ModuleSnapshotIOSIntermediateDump::Size() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return size_; +} + +time_t ModuleSnapshotIOSIntermediateDump::Timestamp() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return timestamp_; +} + +void ModuleSnapshotIOSIntermediateDump::FileVersion(uint16_t* version_0, + uint16_t* version_1, + uint16_t* version_2, + uint16_t* version_3) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + if (filetype_ == MH_DYLIB) { + *version_0 = (dylib_version_ & 0xffff0000) >> 16; + *version_1 = (dylib_version_ & 0x0000ff00) >> 8; + *version_2 = (dylib_version_ & 0x000000ff); + *version_3 = 0; + } else { + *version_0 = 0; + *version_1 = 0; + *version_2 = 0; + *version_3 = 0; + } +} + +void ModuleSnapshotIOSIntermediateDump::SourceVersion( + uint16_t* version_0, + uint16_t* version_1, + uint16_t* version_2, + uint16_t* version_3) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *version_0 = (source_version_ & 0xffff000000000000u) >> 48; + *version_1 = (source_version_ & 0x0000ffff00000000u) >> 32; + *version_2 = (source_version_ & 0x00000000ffff0000u) >> 16; + *version_3 = source_version_ & 0x000000000000ffffu; +} + +ModuleSnapshot::ModuleType ModuleSnapshotIOSIntermediateDump::GetModuleType() + const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + switch (filetype_) { + case MH_EXECUTE: + return kModuleTypeExecutable; + case MH_DYLIB: + return kModuleTypeSharedLibrary; + case MH_DYLINKER: + return kModuleTypeDynamicLoader; + case MH_BUNDLE: + return kModuleTypeLoadableModule; + default: + return kModuleTypeUnknown; + } +} + +void ModuleSnapshotIOSIntermediateDump::UUIDAndAge(crashpad::UUID* uuid, + uint32_t* age) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *uuid = uuid_; + *age = 0; +} + +std::string ModuleSnapshotIOSIntermediateDump::DebugFileName() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return base::FilePath(Name()).BaseName().value(); +} + +std::vector<uint8_t> ModuleSnapshotIOSIntermediateDump::BuildID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<uint8_t>(); +} + +std::vector<std::string> ModuleSnapshotIOSIntermediateDump::AnnotationsVector() + const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return annotations_vector_; +} + +std::map<std::string, std::string> +ModuleSnapshotIOSIntermediateDump::AnnotationsSimpleMap() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return annotations_simple_map_; +} + +std::vector<AnnotationSnapshot> +ModuleSnapshotIOSIntermediateDump::AnnotationObjects() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return annotation_objects_; +} + +std::set<CheckedRange<uint64_t>> +ModuleSnapshotIOSIntermediateDump::ExtraMemoryRanges() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::set<CheckedRange<uint64_t>>(); +} + +std::vector<const UserMinidumpStream*> +ModuleSnapshotIOSIntermediateDump::CustomMinidumpStreams() const { + return std::vector<const UserMinidumpStream*>(); +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h similarity index 61% rename from third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h rename to third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h index 505c08f8..cd85c44f 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios_intermediate_dump.h
@@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef CRASHPAD_SNAPSHOT_IOS_MODULE_SNAPSHOT_IOS_H_ -#define CRASHPAD_SNAPSHOT_IOS_MODULE_SNAPSHOT_IOS_H_ +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_MODULE_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_MODULE_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #include <mach-o/dyld_images.h> #include <stdint.h> @@ -26,6 +26,7 @@ #include "base/macros.h" #include "snapshot/crashpad_info_client_options.h" #include "snapshot/module_snapshot.h" +#include "util/ios/ios_intermediate_dump_map.h" #include "util/misc/initialization_state_dcheck.h" namespace crashpad { @@ -33,37 +34,18 @@ //! \brief A ModuleSnapshot of a code module (binary image) loaded into a //! running (or crashed) process on an iOS system. -class ModuleSnapshotIOS final : public ModuleSnapshot { +class ModuleSnapshotIOSIntermediateDump final : public ModuleSnapshot { public: - ModuleSnapshotIOS(); - ~ModuleSnapshotIOS() override; + ModuleSnapshotIOSIntermediateDump(); + ~ModuleSnapshotIOSIntermediateDump() override; - // TODO(justincohen): This function is temporary, and will be broken into two - // parts. One to do an in-process dump of all the relevant information, and - // two to initialize the snapshot after the in-process dump is loaded. - //! \brief Initializes the object. + //! \brief Initialize the snapshot //! - //! \param[in] image The mach-o image to be loaded. + //! \param[in] exception_data The intermediate dump map used to initialize + //! this object. //! //! \return `true` if the snapshot could be created. - bool Initialize(const dyld_image_info* image); - - // TODO(justincohen): This function is temporary, and will be broken into two - // parts. One to do an in-process dump of all the relevant information, and - // two to initialize the snapshot after the in-process dump is loaded. - //! \brief Initializes the object specifically for the dyld module. - //! - //! \param[in] images The structure containing the necessary dyld information. - //! - //! \return `true` if the snapshot could be created. - bool InitializeDyld(const dyld_all_image_infos* images); - - //! \brief Returns options from the module’s CrashpadInfo structure. - //! - //! \param[out] options Options set in the module’s CrashpadInfo structure. - void GetCrashpadOptions(CrashpadInfoClientOptions* options); - - static const dyld_all_image_infos* DyldAllImageInfo(); + bool Initialize(const IOSIntermediateDumpMap* image_data); // ModuleSnapshot: std::string Name() const override; @@ -89,9 +71,6 @@ std::vector<const UserMinidumpStream*> CustomMinidumpStreams() const override; private: - // Gather the the module information based off of a mach_header_64 |address_|. - bool FinishInitialization(); - std::string name_; uint64_t address_; uint64_t size_; @@ -100,12 +79,16 @@ uint64_t source_version_; uint32_t filetype_; UUID uuid_; + std::vector<std::string> annotations_vector_; + std::map<std::string, std::string> annotations_simple_map_; + std::vector<AnnotationSnapshot> annotation_objects_; + InitializationStateDcheck initialized_; - DISALLOW_COPY_AND_ASSIGN(ModuleSnapshotIOS); + DISALLOW_COPY_AND_ASSIGN(ModuleSnapshotIOSIntermediateDump); }; } // namespace internal } // namespace crashpad -#endif // CRASHPAD_SNAPSHOT_IOS_MODULE_SNAPSHOT_IOS_H_ +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_MODULE_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc deleted file mode 100644 index 07ac7579..0000000 --- a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc +++ /dev/null
@@ -1,288 +0,0 @@ -// Copyright 2020 The Crashpad Authors. 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. -// 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. - -#include "snapshot/ios/process_snapshot_ios.h" - -#include <mach-o/loader.h> -#include <mach/mach.h> - -#include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/stl_util.h" - -namespace { - -void MachTimeValueToTimeval(const time_value& mach, timeval* tv) { - tv->tv_sec = mach.seconds; - tv->tv_usec = mach.microseconds; -} - -} // namespace - -namespace crashpad { - -ProcessSnapshotIOS::ProcessSnapshotIOS() - : ProcessSnapshot(), - kern_proc_info_(), - basic_info_user_time_(), - basic_info_system_time_(), - thread_times_user_time_(), - thread_times_system_time_(), - system_(), - threads_(), - modules_(), - exception_(), - report_id_(), - client_id_(), - annotations_simple_map_(), - snapshot_time_(), - initialized_() {} - -ProcessSnapshotIOS::~ProcessSnapshotIOS() {} - -bool ProcessSnapshotIOS::Initialize( - const internal::IOSSystemDataCollector& system_data) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - // Used by pid, parent pid and snapshot time. - int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; - size_t len = sizeof(kern_proc_info_); - if (sysctl(mib, base::size(mib), &kern_proc_info_, &len, nullptr, 0)) { - PLOG(ERROR) << "sysctl"; - return false; - } - - // Used by user time and system time. - task_basic_info_64 task_basic_info; - mach_msg_type_number_t task_basic_info_count = TASK_BASIC_INFO_64_COUNT; - kern_return_t kr = task_info(mach_task_self(), - TASK_BASIC_INFO_64, - reinterpret_cast<task_info_t>(&task_basic_info), - &task_basic_info_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "task_info TASK_BASIC_INFO_64"; - return false; - } - - task_thread_times_info_data_t task_thread_times; - mach_msg_type_number_t task_thread_times_count = TASK_THREAD_TIMES_INFO_COUNT; - kr = task_info(mach_task_self(), - TASK_THREAD_TIMES_INFO, - reinterpret_cast<task_info_t>(&task_thread_times), - &task_thread_times_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "task_info TASK_THREAD_TIMES"; - } - - basic_info_user_time_ = task_basic_info.user_time; - basic_info_system_time_ = task_basic_info.system_time; - thread_times_user_time_ = task_thread_times.user_time; - thread_times_system_time_ = task_thread_times.system_time; - - if (gettimeofday(&snapshot_time_, nullptr) != 0) { - PLOG(ERROR) << "gettimeofday"; - return false; - } - - system_.Initialize(system_data); - InitializeThreads(); - InitializeModules(); - - INITIALIZATION_STATE_SET_VALID(initialized_); - return true; -} - -void ProcessSnapshotIOS::SetExceptionFromSignal(const siginfo_t* siginfo, - const ucontext_t* context) { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - DCHECK(!exception_.get()); - - exception_.reset(new internal::ExceptionSnapshotIOS()); - exception_->InitializeFromSignal(siginfo, context); -} - -void ProcessSnapshotIOS::SetExceptionFromMachException( - exception_behavior_t behavior, - thread_t exception_thread, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t flavor, - ConstThreadState old_state, - mach_msg_type_number_t old_state_count) { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - DCHECK(!exception_.get()); - - exception_.reset(new internal::ExceptionSnapshotIOS()); - exception_->InitializeFromMachException(behavior, - exception_thread, - exception, - code, - code_count, - flavor, - old_state, - old_state_count); -} - -pid_t ProcessSnapshotIOS::ProcessID() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return kern_proc_info_.kp_proc.p_pid; -} - -pid_t ProcessSnapshotIOS::ParentProcessID() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return kern_proc_info_.kp_eproc.e_ppid; -} - -void ProcessSnapshotIOS::SnapshotTime(timeval* snapshot_time) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *snapshot_time = snapshot_time_; -} - -void ProcessSnapshotIOS::ProcessStartTime(timeval* start_time) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *start_time = kern_proc_info_.kp_proc.p_starttime; -} - -void ProcessSnapshotIOS::ProcessCPUTimes(timeval* user_time, - timeval* system_time) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - - // Calculate user and system time the same way the kernel does for - // getrusage(). See 10.15.0 xnu-6153.11.26/bsd/kern/kern_resource.c calcru(). - timerclear(user_time); - timerclear(system_time); - - MachTimeValueToTimeval(basic_info_user_time_, user_time); - MachTimeValueToTimeval(basic_info_system_time_, system_time); - - timeval thread_user_time; - MachTimeValueToTimeval(thread_times_user_time_, &thread_user_time); - timeval thread_system_time; - MachTimeValueToTimeval(thread_times_system_time_, &thread_system_time); - - timeradd(user_time, &thread_user_time, user_time); - timeradd(system_time, &thread_system_time, system_time); -} - -void ProcessSnapshotIOS::ReportID(UUID* report_id) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *report_id = report_id_; -} - -void ProcessSnapshotIOS::ClientID(UUID* client_id) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *client_id = client_id_; -} - -const std::map<std::string, std::string>& -ProcessSnapshotIOS::AnnotationsSimpleMap() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return annotations_simple_map_; -} - -const SystemSnapshot* ProcessSnapshotIOS::System() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return &system_; -} - -std::vector<const ThreadSnapshot*> ProcessSnapshotIOS::Threads() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - std::vector<const ThreadSnapshot*> threads; - for (const auto& thread : threads_) { - threads.push_back(thread.get()); - } - return threads; -} - -std::vector<const ModuleSnapshot*> ProcessSnapshotIOS::Modules() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - std::vector<const ModuleSnapshot*> modules; - for (const auto& module : modules_) { - modules.push_back(module.get()); - } - return modules; -} - -std::vector<UnloadedModuleSnapshot> ProcessSnapshotIOS::UnloadedModules() - const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<UnloadedModuleSnapshot>(); -} - -const ExceptionSnapshot* ProcessSnapshotIOS::Exception() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return exception_.get(); -} - -std::vector<const MemoryMapRegionSnapshot*> ProcessSnapshotIOS::MemoryMap() - const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<const MemoryMapRegionSnapshot*>(); -} - -std::vector<HandleSnapshot> ProcessSnapshotIOS::Handles() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<HandleSnapshot>(); -} - -std::vector<const MemorySnapshot*> ProcessSnapshotIOS::ExtraMemory() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return std::vector<const MemorySnapshot*>(); -} - -const ProcessMemory* ProcessSnapshotIOS::Memory() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return nullptr; -} - -void ProcessSnapshotIOS::InitializeThreads() { - mach_msg_type_number_t thread_count = 0; - const thread_act_array_t threads = - internal::ThreadSnapshotIOS::GetThreads(&thread_count); - for (uint32_t thread_index = 0; thread_index < thread_count; ++thread_index) { - thread_t thread = threads[thread_index]; - auto thread_snapshot = std::make_unique<internal::ThreadSnapshotIOS>(); - if (thread_snapshot->Initialize(thread)) { - threads_.push_back(std::move(thread_snapshot)); - } - mach_port_deallocate(mach_task_self(), thread); - } - // TODO(justincohen): This dealloc above and below needs to move with the - // call to task_threads inside internal::ThreadSnapshotIOS::GetThreads. - vm_deallocate(mach_task_self(), - reinterpret_cast<vm_address_t>(threads), - sizeof(thread_t) * thread_count); -} - -void ProcessSnapshotIOS::InitializeModules() { - const dyld_all_image_infos* image_infos = - internal::ModuleSnapshotIOS::DyldAllImageInfo(); - - uint32_t image_count = image_infos->infoArrayCount; - const dyld_image_info* image_array = image_infos->infoArray; - for (uint32_t image_index = 0; image_index < image_count; ++image_index) { - const dyld_image_info* image = &image_array[image_index]; - auto module = std::make_unique<internal::ModuleSnapshotIOS>(); - if (module->Initialize(image)) { - modules_.push_back(std::move(module)); - } - } - auto module = std::make_unique<internal::ModuleSnapshotIOS>(); - if (module->InitializeDyld(image_infos)) { - modules_.push_back(std::move(module)); - } -} - -} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc new file mode 100644 index 0000000..7f02200 --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.cc
@@ -0,0 +1,273 @@ +// Copyright 2020 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/process_snapshot_ios_intermediate_dump.h" + +#include <sys/stat.h> + +#include "base/logging.h" +#include "snapshot/ios/intermediate_dump_reader_util.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/ios/ios_intermediate_dump_map.h" + +namespace { + +void MachTimeValueToTimeval(const time_value& mach, timeval* tv) { + tv->tv_sec = mach.seconds; + tv->tv_usec = mach.microseconds; +} + +} // namespace + +namespace crashpad { +namespace internal { + +using Key = internal::IntermediateDumpKey; + +bool ProcessSnapshotIOSIntermediateDump::Initialize( + const base::FilePath& dump_path, + const std::map<std::string, std::string>& annotations) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + annotations_simple_map_ = annotations; + + if (!reader_.Initialize(dump_path)) { + return false; + } + + const IOSIntermediateDumpMap* root_map = reader_.RootMap(); + if (root_map->empty()) + return false; + + uint8_t version; + if (!GetDataValueFromMap(root_map, Key::kVersion, &version) || version != 1) { + LOG(ERROR) << "Root map version mismatch"; + return false; + } + + const internal::IOSIntermediateDumpMap* process_info = + GetMapFromMap(root_map, Key::kProcessInfo); + if (!process_info) { + LOG(ERROR) << "Process snapshot missing required process info map."; + return false; + } + + GetDataValueFromMap(process_info, Key::kPID, &p_pid_); + GetDataValueFromMap(process_info, Key::kParentPID, &e_ppid_); + GetDataValueFromMap(process_info, Key::kStartTime, &p_starttime_); + const IOSIntermediateDumpMap* basic_info = + process_info->GetAsMap(Key::kTaskBasicInfo); + if (basic_info) { + GetDataValueFromMap(basic_info, Key::kUserTime, &basic_info_user_time_); + GetDataValueFromMap(basic_info, Key::kSystemTime, &basic_info_system_time_); + } + + const IOSIntermediateDumpMap* thread_times = + process_info->GetAsMap(Key::kTaskThreadTimes); + if (thread_times) { + GetDataValueFromMap(basic_info, Key::kUserTime, &thread_times_user_time_); + GetDataValueFromMap( + basic_info, Key::kSystemTime, &thread_times_system_time_); + } + + GetDataValueFromMap(process_info, Key::kSnapshotTime, &snapshot_time_); + + const IOSIntermediateDumpMap* system_info = + GetMapFromMap(root_map, Key::kSystemInfo); + if (!system_info) { + LOG(ERROR) << "Process snapshot missing required system info map."; + return false; + } + system_.Initialize(system_info); + + // Threads + const IOSIntermediateDumpList* thread_list = + GetListFromMap(root_map, Key::kThreads); + if (thread_list) { + for (const auto& value : *thread_list) { + auto thread = + std::make_unique<internal::ThreadSnapshotIOSIntermediateDump>(); + if (thread->Initialize(value.get())) { + threads_.push_back(std::move(thread)); + } + } + } + + const IOSIntermediateDumpList* module_list = + GetListFromMap(root_map, Key::kModules); + if (module_list) { + for (const auto& value : *module_list) { + auto module = + std::make_unique<internal::ModuleSnapshotIOSIntermediateDump>(); + if (module->Initialize(value.get())) { + modules_.push_back(std::move(module)); + } + } + } + + // Exceptions + const IOSIntermediateDumpMap* signal_exception = + root_map->GetAsMap(Key::kSignalException); + const IOSIntermediateDumpMap* mach_exception = + root_map->GetAsMap(Key::kMachException); + const IOSIntermediateDumpMap* ns_exception = + root_map->GetAsMap(Key::kNSException); + if (signal_exception) { + exception_.reset(new internal::ExceptionSnapshotIOSIntermediateDump()); + if (!exception_->InitializeFromSignal(signal_exception)) { + LOG(ERROR) << "Process snapshot could not initialize signal exception."; + return false; + } + } else if (mach_exception) { + exception_.reset(new internal::ExceptionSnapshotIOSIntermediateDump()); + if (!exception_->InitializeFromMachException( + mach_exception, GetListFromMap(root_map, Key::kThreads))) { + LOG(ERROR) << "Process snapshot could not initialize Mach exception."; + return false; + } + } else if (ns_exception) { + exception_.reset(new internal::ExceptionSnapshotIOSIntermediateDump()); + if (!exception_->InitializeFromNSException( + ns_exception, GetListFromMap(root_map, Key::kThreads))) { + LOG(ERROR) << "Process snapshot could not initialize NSException."; + return false; + } + } + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +pid_t ProcessSnapshotIOSIntermediateDump::ProcessID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return p_pid_; +} + +pid_t ProcessSnapshotIOSIntermediateDump::ParentProcessID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return e_ppid_; +} + +void ProcessSnapshotIOSIntermediateDump::SnapshotTime( + timeval* snapshot_time) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *snapshot_time = snapshot_time_; +} + +void ProcessSnapshotIOSIntermediateDump::ProcessStartTime( + timeval* start_time) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *start_time = p_starttime_; +} + +void ProcessSnapshotIOSIntermediateDump::ProcessCPUTimes( + timeval* user_time, + timeval* system_time) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + // Calculate user and system time the same way the kernel does for + // getrusage(). See 10.15.0 xnu-6153.11.26/bsd/kern/kern_resource.c calcru(). + timerclear(user_time); + timerclear(system_time); + + MachTimeValueToTimeval(basic_info_user_time_, user_time); + MachTimeValueToTimeval(basic_info_system_time_, system_time); + + timeval thread_user_time; + MachTimeValueToTimeval(thread_times_user_time_, &thread_user_time); + timeval thread_system_time; + MachTimeValueToTimeval(thread_times_system_time_, &thread_system_time); + + timeradd(user_time, &thread_user_time, user_time); + timeradd(system_time, &thread_system_time, system_time); +} + +void ProcessSnapshotIOSIntermediateDump::ReportID(UUID* report_id) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *report_id = report_id_; +} + +void ProcessSnapshotIOSIntermediateDump::ClientID(UUID* client_id) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *client_id = client_id_; +} + +const std::map<std::string, std::string>& +ProcessSnapshotIOSIntermediateDump::AnnotationsSimpleMap() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return annotations_simple_map_; +} + +const SystemSnapshot* ProcessSnapshotIOSIntermediateDump::System() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return &system_; +} + +std::vector<const ThreadSnapshot*> ProcessSnapshotIOSIntermediateDump::Threads() + const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + std::vector<const ThreadSnapshot*> threads; + for (const auto& thread : threads_) { + threads.push_back(thread.get()); + } + return threads; +} + +std::vector<const ModuleSnapshot*> ProcessSnapshotIOSIntermediateDump::Modules() + const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + std::vector<const ModuleSnapshot*> modules; + for (const auto& module : modules_) { + modules.push_back(module.get()); + } + return modules; +} + +std::vector<UnloadedModuleSnapshot> +ProcessSnapshotIOSIntermediateDump::UnloadedModules() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<UnloadedModuleSnapshot>(); +} + +const ExceptionSnapshot* ProcessSnapshotIOSIntermediateDump::Exception() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return exception_.get(); +} + +std::vector<const MemoryMapRegionSnapshot*> +ProcessSnapshotIOSIntermediateDump::MemoryMap() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<const MemoryMapRegionSnapshot*>(); +} + +std::vector<HandleSnapshot> ProcessSnapshotIOSIntermediateDump::Handles() + const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<HandleSnapshot>(); +} + +std::vector<const MemorySnapshot*> +ProcessSnapshotIOSIntermediateDump::ExtraMemory() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<const MemorySnapshot*>(); +} + +const ProcessMemory* ProcessSnapshotIOSIntermediateDump::Memory() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return nullptr; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h similarity index 61% rename from third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h rename to third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h index 6301447..70a4d7d 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump.h
@@ -12,54 +12,42 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef CRASHPAD_SNAPSHOT_IOS_PROCESS_SNAPSHOT_IOS_H_ -#define CRASHPAD_SNAPSHOT_IOS_PROCESS_SNAPSHOT_IOS_H_ +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_PROCESS_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_PROCESS_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #include <sys/sysctl.h> #include <vector> -#include "snapshot/ios/exception_snapshot_ios.h" -#include "snapshot/ios/module_snapshot_ios.h" -#include "snapshot/ios/system_snapshot_ios.h" -#include "snapshot/ios/thread_snapshot_ios.h" +#include "base/files/file_path.h" +#include "snapshot/ios/exception_snapshot_ios_intermediate_dump.h" +#include "snapshot/ios/module_snapshot_ios_intermediate_dump.h" +#include "snapshot/ios/process_snapshot_ios_intermediate_dump.h" +#include "snapshot/ios/system_snapshot_ios_intermediate_dump.h" +#include "snapshot/ios/thread_snapshot_ios_intermediate_dump.h" #include "snapshot/process_snapshot.h" #include "snapshot/thread_snapshot.h" #include "snapshot/unloaded_module_snapshot.h" +#include "util/ios/ios_intermediate_dump_reader.h" namespace crashpad { +namespace internal { //! \brief A ProcessSnapshot of a running (or crashed) process running on a //! iphoneOS system. -class ProcessSnapshotIOS final : public ProcessSnapshot { +class ProcessSnapshotIOSIntermediateDump final : public ProcessSnapshot { public: - ProcessSnapshotIOS(); - ~ProcessSnapshotIOS() override; + ProcessSnapshotIOSIntermediateDump() = default; //! \brief Initializes the object. //! - //! \param[in] system_data A class containing various system data points. + //! \param[in] dump_path A class containing various system data points. //! //! \return `true` if the snapshot could be created, `false` otherwise with //! an appropriate message logged. - bool Initialize(const internal::IOSSystemDataCollector& system_data); + bool Initialize(const base::FilePath& dump_path, + const std::map<std::string, std::string>& annotations); - //! \brief Initialize exception information from a signal. - void SetExceptionFromSignal(const siginfo_t* siginfo, - const ucontext_t* context); - - //! \brief Initialize exception information from a Mach exception. - void SetExceptionFromMachException(exception_behavior_t behavior, - thread_t exception_thread, - exception_type_t exception, - const mach_exception_data_type_t* code, - mach_msg_type_number_t code_count, - thread_state_flavor_t flavor, - ConstThreadState old_state, - mach_msg_type_number_t old_state_count); - - //! \brief Sets the value to be returned by ClientID(). - //! //! On iOS, the client ID is under the control of the snapshot producer, //! which may call this method to set the client ID. If this is not done, //! ClientID() will return an identifier consisting entirely of zeroes. @@ -93,30 +81,33 @@ const ProcessMemory* Memory() const override; private: - // Initializes modules_ on behalf of Initialize(). - void InitializeModules(); - - // Initializes threads_ on behalf of Initialize(). - void InitializeThreads(); - - kinfo_proc kern_proc_info_; + // Retain the reader for the lifetime of the ProcessSnapshot so large chunks + // of data do not need to be copied around (such as MemorySnapshot + // intermediate dumps). + IOSIntermediateDumpReader reader_; + pid_t p_pid_; + pid_t e_ppid_; + timeval p_starttime_; time_value_t basic_info_user_time_; time_value_t basic_info_system_time_; time_value_t thread_times_user_time_; time_value_t thread_times_system_time_; - internal::SystemSnapshotIOS system_; - std::vector<std::unique_ptr<internal::ThreadSnapshotIOS>> threads_; - std::vector<std::unique_ptr<internal::ModuleSnapshotIOS>> modules_; - std::unique_ptr<internal::ExceptionSnapshotIOS> exception_; + internal::SystemSnapshotIOSIntermediateDump system_; + std::vector<std::unique_ptr<internal::ThreadSnapshotIOSIntermediateDump>> + threads_; + std::vector<std::unique_ptr<internal::ModuleSnapshotIOSIntermediateDump>> + modules_; + std::unique_ptr<internal::ExceptionSnapshotIOSIntermediateDump> exception_; UUID report_id_; UUID client_id_; std::map<std::string, std::string> annotations_simple_map_; timeval snapshot_time_; InitializationStateDcheck initialized_; - DISALLOW_COPY_AND_ASSIGN(ProcessSnapshotIOS); + DISALLOW_COPY_AND_ASSIGN(ProcessSnapshotIOSIntermediateDump); }; +} // namespace internal } // namespace crashpad -#endif // CRASHPAD_SNAPSHOT_IOS_PROCESS_SNAPSHOT_IOS_H_ +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_PROCESS_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc new file mode 100644 index 0000000..9710439 --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios_intermediate_dump_test.cc
@@ -0,0 +1,641 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/process_snapshot_ios_intermediate_dump.h" + +#include <mach-o/loader.h> + +#include "base/cxx17_backports.h" +#include "base/files/scoped_file.h" +#include "base/posix/eintr_wrapper.h" +#include "build/build_config.h" +#include "client/annotation.h" +#include "gtest/gtest.h" +#include "minidump/minidump_file_writer.h" +#include "test/errors.h" +#include "test/scoped_temp_dir.h" +#include "util/file/file_io.h" +#include "util/file/filesystem.h" +#include "util/file/string_file.h" +#include "util/misc/uuid.h" + +namespace crashpad { +namespace test { +namespace { + +using Key = internal::IntermediateDumpKey; +using internal::IOSIntermediateDumpWriter; +using internal::ProcessSnapshotIOSIntermediateDump; + +class ReadToString : public crashpad::MemorySnapshot::Delegate { + public: + std::string result; + + bool MemorySnapshotDelegateRead(void* data, size_t size) override { + result = std::string(reinterpret_cast<const char*>(data), size); + return true; + } +}; + +class ProcessSnapshotIOSIntermediateDumpTest : public testing::Test { + protected: + // testing::Test: + + void SetUp() override { + path_ = temp_dir_.path().Append("dump_file"); + writer_ = std::make_unique<internal::IOSIntermediateDumpWriter>(); + EXPECT_TRUE(writer_->Open(path_)); + ASSERT_TRUE(IsRegularFile(path_)); + } + + void TearDown() override { + writer_.reset(); + EXPECT_FALSE(IsRegularFile(path_)); + } + + const auto& path() const { return path_; } + const auto& annotations() const { return annotations_; } + auto writer() const { return writer_.get(); } + + bool DumpSnapshot(const ProcessSnapshotIOSIntermediateDump& snapshot) { + MinidumpFileWriter minidump; + minidump.InitializeFromSnapshot(&snapshot); + StringFile string_file; + return minidump.WriteEverything(&string_file); + } + + void WriteProcessInfo(IOSIntermediateDumpWriter* writer) { + IOSIntermediateDumpWriter::ScopedMap map(writer, Key::kProcessInfo); + pid_t pid = 2; + pid_t parent = 1; + EXPECT_TRUE(writer->AddProperty(Key::kPID, &pid)); + EXPECT_TRUE(writer->AddProperty(Key::kParentPID, &parent)); + timeval start_time = {12, 0}; + EXPECT_TRUE(writer->AddProperty(Key::kStartTime, &start_time)); + + time_value_t user_time = {20, 0}; + time_value_t system_time = {30, 0}; + { + IOSIntermediateDumpWriter::ScopedMap taskInfo(writer, + Key::kTaskBasicInfo); + EXPECT_TRUE(writer->AddProperty(Key::kUserTime, &user_time)); + EXPECT_TRUE(writer->AddProperty(Key::kSystemTime, &system_time)); + } + { + IOSIntermediateDumpWriter::ScopedMap taskThreadTimesMap( + writer, Key::kTaskThreadTimes); + writer->AddProperty(Key::kUserTime, &user_time); + writer->AddProperty(Key::kSystemTime, &system_time); + } + + timeval snapshot_time = {42, 0}; + writer->AddProperty(Key::kSnapshotTime, &snapshot_time); + } + + void WriteSystemInfo(IOSIntermediateDumpWriter* writer) { + IOSIntermediateDumpWriter::ScopedMap map(writer, Key::kSystemInfo); + std::string machine_description = "Gibson"; + EXPECT_TRUE(writer->AddProperty(Key::kMachineDescription, + machine_description.c_str(), + machine_description.length())); + int os_version_major = 1995; + int os_version_minor = 9; + int os_version_bugfix = 15; + EXPECT_TRUE(writer->AddProperty(Key::kOSVersionMajor, &os_version_major)); + EXPECT_TRUE(writer->AddProperty(Key::kOSVersionMinor, &os_version_minor)); + EXPECT_TRUE(writer->AddProperty(Key::kOSVersionBugfix, &os_version_bugfix)); + std::string os_version_build = "Da Vinci"; + writer->AddProperty(Key::kOSVersionBuild, + os_version_build.c_str(), + os_version_build.length()); + + int cpu_count = 1; + EXPECT_TRUE(writer->AddProperty(Key::kCpuCount, &cpu_count)); + std::string cpu_vendor = "RISC"; + EXPECT_TRUE(writer->AddProperty( + Key::kCpuVendor, cpu_vendor.c_str(), cpu_vendor.length())); + + bool has_daylight_saving_time = true; + EXPECT_TRUE(writer->AddProperty(Key::kHasDaylightSavingTime, + &has_daylight_saving_time)); + bool is_daylight_saving_time = true; + EXPECT_TRUE(writer->AddProperty(Key::kIsDaylightSavingTime, + &is_daylight_saving_time)); + int standard_offset_seconds = 7200; + EXPECT_TRUE(writer->AddProperty(Key::kStandardOffsetSeconds, + &standard_offset_seconds)); + int daylight_offset_seconds = 3600; + EXPECT_TRUE(writer->AddProperty(Key::kDaylightOffsetSeconds, + &daylight_offset_seconds)); + std::string standard_name = "Standard"; + EXPECT_TRUE(writer->AddProperty( + Key::kStandardName, standard_name.c_str(), standard_name.length())); + std::string daylight_name = "Daylight"; + EXPECT_TRUE(writer->AddProperty( + Key::kDaylightName, daylight_name.c_str(), daylight_name.length())); + + vm_size_t page_size = getpagesize(); + EXPECT_TRUE(writer->AddProperty(Key::kPageSize, &page_size)); + { + natural_t count = 0; + IOSIntermediateDumpWriter::ScopedMap vmStatMap(writer, Key::kVMStat); + EXPECT_TRUE(writer->AddProperty(Key::kActive, &count)); + EXPECT_TRUE(writer->AddProperty(Key::kInactive, &count)); + EXPECT_TRUE(writer->AddProperty(Key::kWired, &count)); + EXPECT_TRUE(writer->AddProperty(Key::kFree, &count)); + } + } + + void WriteAnnotations(IOSIntermediateDumpWriter* writer) { + constexpr char annotation_name[] = "annotation_name"; + constexpr char annotation_value[] = "annotation_value"; + { + IOSIntermediateDumpWriter::ScopedArray annotationObjectArray( + writer, Key::kAnnotationObjects); + { + IOSIntermediateDumpWriter::ScopedArrayMap annotationMap(writer); + EXPECT_TRUE(writer->AddPropertyBytes( + Key::kAnnotationName, annotation_name, strlen(annotation_name))); + EXPECT_TRUE(writer->AddPropertyBytes( + Key::kAnnotationValue, annotation_value, strlen(annotation_value))); + Annotation::Type type = Annotation::Type::kString; + EXPECT_TRUE(writer->AddProperty(Key::kAnnotationType, &type)); + } + } + { + IOSIntermediateDumpWriter::ScopedArray annotationsSimpleArray( + writer, Key::kAnnotationsSimpleMap); + { + IOSIntermediateDumpWriter::ScopedArrayMap annotationMap(writer); + EXPECT_TRUE(writer->AddPropertyBytes( + Key::kAnnotationName, annotation_name, strlen(annotation_name))); + EXPECT_TRUE(writer->AddPropertyBytes( + Key::kAnnotationValue, annotation_value, strlen(annotation_value))); + } + } + + IOSIntermediateDumpWriter::ScopedMap annotationMap( + writer, Key::kAnnotationsCrashInfo); + { + EXPECT_TRUE(writer->AddPropertyBytes(Key::kAnnotationsCrashInfoMessage1, + annotation_value, + strlen(annotation_value))); + EXPECT_TRUE(writer->AddPropertyBytes(Key::kAnnotationsCrashInfoMessage2, + annotation_value, + strlen(annotation_value))); + } + } + + void WriteModules(IOSIntermediateDumpWriter* writer) { + IOSIntermediateDumpWriter::ScopedArray moduleArray(writer, Key::kModules); + for (uint32_t image_index = 0; image_index < 2; ++image_index) { + IOSIntermediateDumpWriter::ScopedArrayMap modules(writer); + + constexpr char image_file[] = "/path/to/module"; + EXPECT_TRUE( + writer->AddProperty(Key::kName, image_file, strlen(image_file))); + + uint64_t address = 0; + uint64_t vmsize = 1; + uintptr_t imageFileModDate = 2; + uint32_t current_version = 3; + uint32_t filetype = MH_DYLIB; + uint64_t source_version = 5; + static constexpr uint8_t uuid[16] = {0x00, + 0x01, + 0x02, + 0x03, + 0x04, + 0x05, + 0x06, + 0x07, + 0x08, + 0x09, + 0x0a, + 0x0b, + 0x0c, + 0x0d, + 0x0e, + 0x0f}; + EXPECT_TRUE(writer->AddProperty(Key::kAddress, &address)); + EXPECT_TRUE(writer->AddProperty(Key::kSize, &vmsize)); + EXPECT_TRUE(writer->AddProperty(Key::kTimestamp, &imageFileModDate)); + EXPECT_TRUE( + writer->AddProperty(Key::kDylibCurrentVersion, ¤t_version)); + EXPECT_TRUE(writer->AddProperty(Key::kSourceVersion, &source_version)); + EXPECT_TRUE(writer->AddProperty(Key::kUUID, &uuid)); + EXPECT_TRUE(writer->AddProperty(Key::kFileType, &filetype)); + WriteAnnotations(writer); + } + } + + void ExpectModules(const std::vector<const ModuleSnapshot*>& modules) { + for (auto module : modules) { + EXPECT_EQ(module->GetModuleType(), + ModuleSnapshot::kModuleTypeSharedLibrary); + EXPECT_STREQ(module->Name().c_str(), "/path/to/module"); + EXPECT_STREQ(module->DebugFileName().c_str(), "module"); + UUID uuid; + uint32_t age; + module->UUIDAndAge(&uuid, &age); + EXPECT_EQ(uuid.ToString(), "00010203-0405-0607-0809-0a0b0c0d0e0f"); + + for (auto annotation : module->AnnotationsVector()) { + EXPECT_STREQ(annotation.c_str(), "annotation_value"); + } + + for (const auto& it : module->AnnotationsSimpleMap()) { + EXPECT_STREQ(it.first.c_str(), "annotation_name"); + EXPECT_STREQ(it.second.c_str(), "annotation_value"); + } + + for (auto annotation_object : module->AnnotationObjects()) { + EXPECT_STREQ(annotation_object.name.c_str(), "annotation_name"); + EXPECT_EQ(annotation_object.type, (short)Annotation::Type::kString); + EXPECT_STREQ(std::string(reinterpret_cast<const char*>( + annotation_object.value.data()), + annotation_object.value.size()) + .c_str(), + "annotation_value"); + } + } + } + + void WriteMachException(IOSIntermediateDumpWriter* writer) { + IOSIntermediateDumpWriter::ScopedMap machExceptionMap(writer, + Key::kMachException); + exception_type_t exception = 5; + mach_exception_data_type_t code[] = {4, 3}; + mach_msg_type_number_t code_count = 2; + +#if defined(ARCH_CPU_X86_64) + thread_state_flavor_t flavor = x86_THREAD_STATE; + mach_msg_type_number_t state_count = x86_THREAD_STATE_COUNT; + x86_thread_state_t state = {}; + state.tsh.flavor = x86_THREAD_STATE64; + state.tsh.count = x86_THREAD_STATE64_COUNT; + state.uts.ts64.__rip = 0xdeadbeef; + size_t state_length = sizeof(x86_thread_state_t); +#elif defined(ARCH_CPU_ARM64) + thread_state_flavor_t flavor = ARM_UNIFIED_THREAD_STATE; + mach_msg_type_number_t state_count = ARM_UNIFIED_THREAD_STATE_COUNT; + arm_unified_thread_state_t state = {}; + state.ash.flavor = ARM_THREAD_STATE64; + state.ash.count = ARM_THREAD_STATE64_COUNT; + state.ts_64.__pc = 0xdeadbeef; + size_t state_length = sizeof(arm_unified_thread_state_t); +#endif + EXPECT_TRUE(writer->AddProperty(Key::kException, &exception)); + EXPECT_TRUE(writer->AddProperty(Key::kCode, code, code_count)); + EXPECT_TRUE(writer->AddProperty(Key::kCodeCount, &code_count)); + EXPECT_TRUE(writer->AddProperty(Key::kFlavor, &flavor)); + EXPECT_TRUE(writer->AddPropertyBytes( + Key::kState, reinterpret_cast<const void*>(&state), state_length)); + EXPECT_TRUE(writer->AddProperty(Key::kStateCount, &state_count)); + uint64_t thread_id = 1; + EXPECT_TRUE(writer->AddProperty(Key::kThreadID, &thread_id)); + } + + void WriteThreads(IOSIntermediateDumpWriter* writer) { + vm_address_t stack_region_address = 0; + IOSIntermediateDumpWriter::ScopedArray threadArray(writer, Key::kThreads); + for (uint64_t thread_id = 1; thread_id < 3; thread_id++) { + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer); + EXPECT_TRUE(writer->AddProperty(Key::kThreadID, &thread_id)); + + integer_t suspend_count = 666; + integer_t importance = 5; + uint64_t thread_handle = thread_id; + EXPECT_TRUE(writer->AddProperty(Key::kSuspendCount, &suspend_count)); + EXPECT_TRUE(writer->AddProperty(Key::kPriority, &importance)); + EXPECT_TRUE(writer->AddProperty(Key::kThreadDataAddress, &thread_handle)); + +#if defined(ARCH_CPU_X86_64) + x86_thread_state64_t thread_state = {}; + thread_state.__rip = 0xdeadbeef; + x86_float_state64_t float_state = {}; + x86_debug_state64_t debug_state = {}; +#elif defined(ARCH_CPU_ARM64) + arm_thread_state64_t thread_state = {}; + thread_state.__pc = 0xdeadbeef; + arm_neon_state64_t float_state = {}; + arm_debug_state64_t debug_state = {}; +#endif + EXPECT_TRUE(writer->AddProperty(Key::kThreadState, &thread_state)); + EXPECT_TRUE(writer->AddProperty(Key::kFloatState, &float_state)); + EXPECT_TRUE(writer->AddProperty(Key::kDebugState, &debug_state)); + + // Non-overlapping stack_region_address. + stack_region_address += 10; + EXPECT_TRUE( + writer->AddProperty(Key::kStackRegionAddress, &stack_region_address)); + constexpr char memory_region[] = "stack_data"; + EXPECT_TRUE( + writer->AddPropertyBytes(Key::kStackRegionData, memory_region, 10)); + { + IOSIntermediateDumpWriter::ScopedArray memoryRegions( + writer, Key::kThreadContextMemoryRegions); + { + IOSIntermediateDumpWriter::ScopedArrayMap memoryRegion(writer); + const vm_address_t memory_region_address = 0; + EXPECT_TRUE(writer->AddProperty( + Key::kThreadContextMemoryRegionAddress, &memory_region_address)); + constexpr char memory_region[] = "string"; + EXPECT_TRUE(writer->AddPropertyBytes( + Key::kThreadContextMemoryRegionData, memory_region, 6)); + } + } + } + } + + void ExpectMachException(const ExceptionSnapshot& exception) { + EXPECT_EQ(exception.ThreadID(), 1u); + EXPECT_EQ(exception.Exception(), 5u); + EXPECT_TRUE(exception.Context()->Is64Bit()); + EXPECT_EQ(exception.Context()->InstructionPointer(), 0xdeadbeef); + EXPECT_EQ(exception.ExceptionInfo(), 4u); + EXPECT_EQ(exception.ExceptionAddress(), 0xdeadbeef); + EXPECT_EQ(exception.Codes()[0], 5u); + EXPECT_EQ(exception.Codes()[1], 4u); + EXPECT_EQ(exception.Codes()[2], 3u); + } + + void ExpectThreads(const std::vector<const ThreadSnapshot*>& threads) { + uint64_t thread_id = 1; + for (auto thread : threads) { + EXPECT_EQ(thread->ThreadID(), thread_id); + EXPECT_EQ(thread->SuspendCount(), 666); + EXPECT_EQ(thread->Priority(), 5); + EXPECT_EQ(thread->ThreadSpecificDataAddress(), thread_id++); + ReadToString delegate; + for (auto memory : thread->ExtraMemory()) { + memory->Read(&delegate); + EXPECT_STREQ(delegate.result.c_str(), "string"); + } + + thread->Stack()->Read(&delegate); + EXPECT_STREQ(delegate.result.c_str(), "stack_data"); + + EXPECT_TRUE(thread->Context()->Is64Bit()); + EXPECT_EQ(thread->Context()->InstructionPointer(), 0xdeadbeef); + } + } + + void ExpectSystem(const SystemSnapshot& system) { + EXPECT_EQ(system.CPUCount(), 1u); + EXPECT_STREQ(system.CPUVendor().c_str(), "RISC"); + int major; + int minor; + int bugfix; + std::string build; + system.OSVersion(&major, &minor, &bugfix, &build); + EXPECT_EQ(major, 1995); + EXPECT_EQ(minor, 9); + EXPECT_EQ(bugfix, 15); + EXPECT_STREQ(build.c_str(), "Da Vinci"); + EXPECT_STREQ(system.OSVersionFull().c_str(), "1995.9.15 Da Vinci"); + EXPECT_STREQ(system.MachineDescription().c_str(), "Gibson"); + + SystemSnapshot::DaylightSavingTimeStatus dst_status; + int standard_offset_seconds; + int daylight_offset_seconds; + std::string standard_name; + std::string daylight_name; + + system.TimeZone(&dst_status, + &standard_offset_seconds, + &daylight_offset_seconds, + &standard_name, + &daylight_name); + EXPECT_EQ(standard_offset_seconds, 7200); + EXPECT_EQ(daylight_offset_seconds, 3600); + EXPECT_STREQ(standard_name.c_str(), "Standard"); + EXPECT_STREQ(daylight_name.c_str(), "Daylight"); + } + + void ExpectSnapshot(const ProcessSnapshot& snapshot) { + EXPECT_EQ(snapshot.ProcessID(), 2); + EXPECT_EQ(snapshot.ParentProcessID(), 1); + + timeval snapshot_time; + snapshot.SnapshotTime(&snapshot_time); + EXPECT_EQ(snapshot_time.tv_sec, 42); + EXPECT_EQ(snapshot_time.tv_usec, 0); + + timeval start_time; + snapshot.ProcessStartTime(&start_time); + EXPECT_EQ(start_time.tv_sec, 12); + EXPECT_EQ(start_time.tv_usec, 0); + + timeval user_time, system_time; + snapshot.ProcessCPUTimes(&user_time, &system_time); + EXPECT_EQ(user_time.tv_sec, 40); + EXPECT_EQ(user_time.tv_usec, 0); + EXPECT_EQ(system_time.tv_sec, 60); + EXPECT_EQ(system_time.tv_usec, 0); + + ExpectSystem(*snapshot.System()); + ExpectThreads(snapshot.Threads()); + ExpectModules(snapshot.Modules()); + ExpectMachException(*snapshot.Exception()); + } + + private: + std::unique_ptr<internal::IOSIntermediateDumpWriter> writer_; + ScopedTempDir temp_dir_; + base::FilePath path_; + std::map<std::string, std::string> annotations_; +}; + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, InitializeNoFile) { + const base::FilePath file; + ProcessSnapshotIOSIntermediateDump process_snapshot; + EXPECT_FALSE(process_snapshot.Initialize(file, annotations())); + EXPECT_TRUE(LoggingRemoveFile(path())); + EXPECT_FALSE(IsRegularFile(path())); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, InitializeEmpty) { + ProcessSnapshotIOSIntermediateDump process_snapshot; + EXPECT_FALSE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, InitializeMinimumDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kSystemInfo); } + { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kProcessInfo); } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); + EXPECT_TRUE(DumpSnapshot(process_snapshot)); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, MissingSystemDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kProcessInfo); } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_FALSE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, MissingProcessDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + { IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kSystemInfo); } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_FALSE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptySignalDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + WriteSystemInfo(writer()); + WriteProcessInfo(writer()); + { + IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kSignalException); + uint64_t thread_id = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kThreadID, &thread_id)); + } + { + IOSIntermediateDumpWriter::ScopedArray threadArray(writer(), + Key::kThreads); + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer()); + uint64_t thread_id = 1; + writer()->AddProperty(Key::kThreadID, &thread_id); + } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); + EXPECT_TRUE(DumpSnapshot(process_snapshot)); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptyMachDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + WriteSystemInfo(writer()); + WriteProcessInfo(writer()); + { + IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kMachException); + uint64_t thread_id = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kThreadID, &thread_id)); + } + { + IOSIntermediateDumpWriter::ScopedArray threadArray(writer(), + Key::kThreads); + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer()); + uint64_t thread_id = 1; + writer()->AddProperty(Key::kThreadID, &thread_id); + } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); + EXPECT_TRUE(DumpSnapshot(process_snapshot)); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptyExceptionDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + WriteSystemInfo(writer()); + WriteProcessInfo(writer()); + { + IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kNSException); + uint64_t thread_id = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kThreadID, &thread_id)); + } + { + IOSIntermediateDumpWriter::ScopedArray threadArray(writer(), + Key::kThreads); + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer()); + uint64_t thread_id = 1; + writer()->AddProperty(Key::kThreadID, &thread_id); + } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); + EXPECT_TRUE(DumpSnapshot(process_snapshot)); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, EmptyUncaughtNSExceptionDump) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + WriteSystemInfo(writer()); + WriteProcessInfo(writer()); + { + IOSIntermediateDumpWriter::ScopedMap map(writer(), Key::kNSException); + uint64_t thread_id = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kThreadID, &thread_id)); + } + { + IOSIntermediateDumpWriter::ScopedArray threadArray(writer(), + Key::kThreads); + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer()); + uint64_t thread_id = 1; + writer()->AddProperty(Key::kThreadID, &thread_id); + const uint64_t frames[] = {0, 0}; + const size_t num_frames = 2; + writer()->AddProperty( + Key::kThreadUncaughtNSExceptionFrames, frames, num_frames); + } + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); + EXPECT_TRUE(DumpSnapshot(process_snapshot)); +} + +TEST_F(ProcessSnapshotIOSIntermediateDumpTest, FullReport) { + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer()); + uint8_t version = 1; + EXPECT_TRUE(writer()->AddProperty(Key::kVersion, &version)); + WriteSystemInfo(writer()); + WriteProcessInfo(writer()); + WriteThreads(writer()); + WriteModules(writer()); + WriteMachException(writer()); + } + ProcessSnapshotIOSIntermediateDump process_snapshot; + ASSERT_TRUE(process_snapshot.Initialize(path(), annotations())); + EXPECT_FALSE(IsRegularFile(path())); + EXPECT_TRUE(DumpSnapshot(process_snapshot)); + ExpectSnapshot(process_snapshot); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.cc deleted file mode 100644 index 397b1f84..0000000 --- a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.cc +++ /dev/null
@@ -1,223 +0,0 @@ -// Copyright 2020 The Crashpad Authors. 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. -// 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. - -#include "snapshot/ios/system_snapshot_ios.h" - -#include <mach/mach.h> -#include <stddef.h> -#include <sys/sysctl.h> -#include <sys/types.h> -#include <sys/utsname.h> - -#include <algorithm> - -#include "base/logging.h" -#include "base/mac/mach_logging.h" -#include "base/strings/stringprintf.h" -#include "build/build_config.h" -#include "snapshot/cpu_context.h" -#include "snapshot/posix/timezone.h" -#include "util/mac/mac_util.h" -#include "util/numeric/in_range_cast.h" - -namespace crashpad { - -namespace internal { - -SystemSnapshotIOS::SystemSnapshotIOS() - : SystemSnapshot(), - os_version_build_(), - machine_description_(), - os_version_major_(0), - os_version_minor_(0), - os_version_bugfix_(0), - active_(0), - inactive_(0), - wired_(0), - free_(0), - cpu_count_(0), - cpu_vendor_(), - dst_status_(), - standard_offset_seconds_(0), - daylight_offset_seconds_(0), - standard_name_(), - daylight_name_(), - initialized_() {} - -SystemSnapshotIOS::~SystemSnapshotIOS() {} - -void SystemSnapshotIOS::Initialize(const IOSSystemDataCollector& system_data) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - system_data.OSVersion( - &os_version_major_, &os_version_minor_, &os_version_bugfix_); - os_version_build_ = system_data.Build(); - machine_description_ = system_data.MachineDescription(); - cpu_count_ = system_data.ProcessorCount(); - cpu_vendor_ = system_data.CPUVendor(); - if (system_data.HasDaylightSavingTime()) { - dst_status_ = system_data.IsDaylightSavingTime() - ? SystemSnapshot::kObservingDaylightSavingTime - : SystemSnapshot::kObservingStandardTime; - } else { - dst_status_ = SystemSnapshot::kDoesNotObserveDaylightSavingTime; - } - standard_offset_seconds_ = system_data.StandardOffsetSeconds(); - daylight_offset_seconds_ = system_data.DaylightOffsetSeconds(); - standard_name_ = system_data.StandardName(); - daylight_name_ = system_data.DaylightName(); - - // Currently unused by minidump. - vm_size_t page_size; - host_page_size(mach_host_self(), &page_size); - mach_msg_type_number_t host_size = - sizeof(vm_statistics_data_t) / sizeof(integer_t); - vm_statistics_data_t vm_stat; - kern_return_t kr = host_statistics(mach_host_self(), - HOST_VM_INFO, - reinterpret_cast<host_info_t>(&vm_stat), - &host_size); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "host_statistics"; - } - active_ = vm_stat.active_count * page_size; - inactive_ = vm_stat.inactive_count * page_size; - wired_ = vm_stat.wire_count * page_size; - free_ = vm_stat.free_count * page_size; - - INITIALIZATION_STATE_SET_VALID(initialized_); -} - -CPUArchitecture SystemSnapshotIOS::GetCPUArchitecture() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); -#if defined(ARCH_CPU_X86_64) - return kCPUArchitectureX86_64; -#elif defined(ARCH_CPU_ARM64) - return kCPUArchitectureARM64; -#endif -} - -uint32_t SystemSnapshotIOS::CPURevision() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): sysctlbyname machdep.cpu.* returns -1 on iOS/ARM64, but - // consider recording this for X86_64 only. - return 0; -} - -uint8_t SystemSnapshotIOS::CPUCount() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return cpu_count_; -} - -std::string SystemSnapshotIOS::CPUVendor() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return cpu_vendor_; -} - -void SystemSnapshotIOS::CPUFrequency(uint64_t* current_hz, - uint64_t* max_hz) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): sysctlbyname hw.cpufrequency returns -1 on iOS/ARM64, - // but consider recording this for X86_64 only. - *current_hz = 0; - *max_hz = 0; -} - -uint32_t SystemSnapshotIOS::CPUX86Signature() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): Consider recording this for X86_64 only. - return 0; -} - -uint64_t SystemSnapshotIOS::CPUX86Features() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): Consider recording this for X86_64 only. - return 0; -} - -uint64_t SystemSnapshotIOS::CPUX86ExtendedFeatures() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): Consider recording this for X86_64 only. - return 0; -} - -uint32_t SystemSnapshotIOS::CPUX86Leaf7Features() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): Consider recording this for X86_64 only. - return 0; -} - -bool SystemSnapshotIOS::CPUX86SupportsDAZ() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): Consider recording this for X86_64 only. - return false; -} - -SystemSnapshot::OperatingSystem SystemSnapshotIOS::GetOperatingSystem() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return kOperatingSystemIOS; -} - -bool SystemSnapshotIOS::OSServer() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return false; -} - -void SystemSnapshotIOS::OSVersion(int* major, - int* minor, - int* bugfix, - std::string* build) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *major = os_version_major_; - *minor = os_version_minor_; - *bugfix = os_version_bugfix_; - build->assign(os_version_build_); -} - -std::string SystemSnapshotIOS::OSVersionFull() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return base::StringPrintf("%d.%d.%d %s", - os_version_major_, - os_version_minor_, - os_version_bugfix_, - os_version_build_.c_str()); -} - -std::string SystemSnapshotIOS::MachineDescription() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return machine_description_; -} - -bool SystemSnapshotIOS::NXEnabled() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - // TODO(justincohen): Consider using kern.nx when available (pre-iOS 13, - // pre-OS X 10.15). Otherwise the bit is always enabled. - return true; -} - -void SystemSnapshotIOS::TimeZone(DaylightSavingTimeStatus* dst_status, - int* standard_offset_seconds, - int* daylight_offset_seconds, - std::string* standard_name, - std::string* daylight_name) const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - *dst_status = dst_status_; - *standard_offset_seconds = standard_offset_seconds_; - *daylight_offset_seconds = daylight_offset_seconds_; - standard_name->assign(standard_name_); - daylight_name->assign(daylight_name_); -} - -} // namespace internal -} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc new file mode 100644 index 0000000..d10e9c0a --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.cc
@@ -0,0 +1,245 @@ +// Copyright 2020 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/system_snapshot_ios_intermediate_dump.h" + +#include <mach/mach.h> +#include <stddef.h> +#include <sys/sysctl.h> +#include <sys/types.h> +#include <sys/utsname.h> + +#include <algorithm> + +#include "base/logging.h" +#include "base/mac/mach_logging.h" +#include "base/strings/stringprintf.h" +#include "build/build_config.h" +#include "snapshot/cpu_context.h" +#include "snapshot/ios/intermediate_dump_reader_util.h" +#include "snapshot/posix/timezone.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/mac/mac_util.h" +#include "util/numeric/in_range_cast.h" + +namespace crashpad { + +namespace internal { + +using Key = IntermediateDumpKey; + +SystemSnapshotIOSIntermediateDump::SystemSnapshotIOSIntermediateDump() + : SystemSnapshot(), + os_version_build_(), + machine_description_(), + os_version_major_(0), + os_version_minor_(0), + os_version_bugfix_(0), + active_(0), + inactive_(0), + wired_(0), + free_(0), + cpu_count_(0), + cpu_vendor_(), + dst_status_(), + standard_offset_seconds_(0), + daylight_offset_seconds_(0), + standard_name_(), + daylight_name_(), + initialized_() {} + +SystemSnapshotIOSIntermediateDump::~SystemSnapshotIOSIntermediateDump() {} + +void SystemSnapshotIOSIntermediateDump::Initialize( + const IOSIntermediateDumpMap* system_data) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + GetDataStringFromMap(system_data, Key::kOSVersionBuild, &os_version_build_); + GetDataStringFromMap( + system_data, Key::kMachineDescription, &machine_description_); + GetDataStringFromMap(system_data, Key::kCpuVendor, &cpu_vendor_); + GetDataStringFromMap(system_data, Key::kStandardName, &standard_name_); + GetDataStringFromMap(system_data, Key::kDaylightName, &daylight_name_); + + GetDataValueFromMap(system_data, Key::kOSVersionMajor, &os_version_major_); + GetDataValueFromMap(system_data, Key::kOSVersionMinor, &os_version_minor_); + GetDataValueFromMap(system_data, Key::kOSVersionBugfix, &os_version_bugfix_); + GetDataValueFromMap(system_data, Key::kCpuCount, &cpu_count_); + + GetDataValueFromMap( + system_data, Key::kStandardOffsetSeconds, &standard_offset_seconds_); + GetDataValueFromMap( + system_data, Key::kDaylightOffsetSeconds, &daylight_offset_seconds_); + + bool has_daylight_saving_time; + GetDataValueFromMap( + system_data, Key::kHasDaylightSavingTime, &has_daylight_saving_time); + bool is_daylight_saving_time; + GetDataValueFromMap( + system_data, Key::kIsDaylightSavingTime, &is_daylight_saving_time); + + if (has_daylight_saving_time) { + dst_status_ = is_daylight_saving_time + ? SystemSnapshot::kObservingDaylightSavingTime + : SystemSnapshot::kObservingStandardTime; + } else { + dst_status_ = SystemSnapshot::kDoesNotObserveDaylightSavingTime; + } + + vm_size_t page_size; + if (GetDataValueFromMap(system_data, Key::kPageSize, &page_size)) { + const IOSIntermediateDumpMap* vm_stat = + GetMapFromMap(system_data, Key::kVMStat); + if (vm_stat) { + GetDataValueFromMap(vm_stat, Key::kActive, &active_); + active_ *= page_size; + + GetDataValueFromMap(vm_stat, Key::kInactive, &inactive_); + inactive_ *= page_size; + + GetDataValueFromMap(vm_stat, Key::kWired, &wired_); + wired_ *= page_size; + + GetDataValueFromMap(vm_stat, Key::kFree, &free_); + free_ *= page_size; + } + } + + INITIALIZATION_STATE_SET_VALID(initialized_); +} + +CPUArchitecture SystemSnapshotIOSIntermediateDump::GetCPUArchitecture() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); +#if defined(ARCH_CPU_X86_64) + return kCPUArchitectureX86_64; +#elif defined(ARCH_CPU_ARM64) + return kCPUArchitectureARM64; +#endif +} + +uint32_t SystemSnapshotIOSIntermediateDump::CPURevision() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): sysctlbyname machdep.cpu.* returns -1 on iOS/ARM64, but + // consider recording this for X86_64 only. + return 0; +} + +uint8_t SystemSnapshotIOSIntermediateDump::CPUCount() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return cpu_count_; +} + +std::string SystemSnapshotIOSIntermediateDump::CPUVendor() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return cpu_vendor_; +} + +void SystemSnapshotIOSIntermediateDump::CPUFrequency(uint64_t* current_hz, + uint64_t* max_hz) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): sysctlbyname hw.cpufrequency returns -1 on iOS/ARM64, + // but consider recording this for X86_64 only. + *current_hz = 0; + *max_hz = 0; +} + +uint32_t SystemSnapshotIOSIntermediateDump::CPUX86Signature() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +uint64_t SystemSnapshotIOSIntermediateDump::CPUX86Features() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +uint64_t SystemSnapshotIOSIntermediateDump::CPUX86ExtendedFeatures() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +uint32_t SystemSnapshotIOSIntermediateDump::CPUX86Leaf7Features() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +bool SystemSnapshotIOSIntermediateDump::CPUX86SupportsDAZ() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return false; +} + +SystemSnapshot::OperatingSystem +SystemSnapshotIOSIntermediateDump::GetOperatingSystem() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return kOperatingSystemIOS; +} + +bool SystemSnapshotIOSIntermediateDump::OSServer() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return false; +} + +void SystemSnapshotIOSIntermediateDump::OSVersion(int* major, + int* minor, + int* bugfix, + std::string* build) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *major = os_version_major_; + *minor = os_version_minor_; + *bugfix = os_version_bugfix_; + build->assign(os_version_build_); +} + +std::string SystemSnapshotIOSIntermediateDump::OSVersionFull() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return base::StringPrintf("%d.%d.%d %s", + os_version_major_, + os_version_minor_, + os_version_bugfix_, + os_version_build_.c_str()); +} + +std::string SystemSnapshotIOSIntermediateDump::MachineDescription() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return machine_description_; +} + +bool SystemSnapshotIOSIntermediateDump::NXEnabled() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider using kern.nx when available (pre-iOS 13, + // pre-OS X 10.15). Otherwise the bit is always enabled. + return true; +} + +void SystemSnapshotIOSIntermediateDump::TimeZone( + DaylightSavingTimeStatus* dst_status, + int* standard_offset_seconds, + int* daylight_offset_seconds, + std::string* standard_name, + std::string* daylight_name) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *dst_status = dst_status_; + *standard_offset_seconds = standard_offset_seconds_; + *daylight_offset_seconds = daylight_offset_seconds_; + standard_name->assign(standard_name_); + daylight_name->assign(daylight_name_); +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h similarity index 75% rename from third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.h rename to third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h index a38de4ef..72eaa64 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios_intermediate_dump.h
@@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef CRASHPAD_SNAPSHOT_IOS_SYSTEM_SNAPSHOT_IOS_H_ -#define CRASHPAD_SNAPSHOT_IOS_SYSTEM_SNAPSHOT_IOS_H_ +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_SYSTEM_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_SYSTEM_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #include <stdint.h> @@ -21,6 +21,7 @@ #include "base/macros.h" #include "snapshot/system_snapshot.h" +#include "util/ios/ios_intermediate_dump_map.h" #include "util/ios/ios_system_data_collector.h" #include "util/misc/initialization_state_dcheck.h" @@ -29,15 +30,17 @@ namespace internal { //! \brief A SystemSnapshot of the running system, when the system runs iOS. -class SystemSnapshotIOS final : public SystemSnapshot { +class SystemSnapshotIOSIntermediateDump final : public SystemSnapshot { public: - SystemSnapshotIOS(); - ~SystemSnapshotIOS() override; + SystemSnapshotIOSIntermediateDump(); + ~SystemSnapshotIOSIntermediateDump() override; //! \brief Initializes the object. //! - //! \param[in] system_data A class containing various system data points. - void Initialize(const IOSSystemDataCollector& system_data); + //! \param[in] system_data An intermediate dump map containing various system + //! data points. + //! \return `true` if the snapshot could be created. + void Initialize(const IOSIntermediateDumpMap* system_data); // SystemSnapshot: @@ -72,10 +75,10 @@ int os_version_major_; int os_version_minor_; int os_version_bugfix_; - uint64_t active_; - uint64_t inactive_; - uint64_t wired_; - uint64_t free_; + uint32_t active_; + uint32_t inactive_; + uint32_t wired_; + uint32_t free_; int cpu_count_; std::string cpu_vendor_; DaylightSavingTimeStatus dst_status_; @@ -85,10 +88,10 @@ std::string daylight_name_; InitializationStateDcheck initialized_; - DISALLOW_COPY_AND_ASSIGN(SystemSnapshotIOS); + DISALLOW_COPY_AND_ASSIGN(SystemSnapshotIOSIntermediateDump); }; } // namespace internal } // namespace crashpad -#endif // CRASHPAD_SNAPSHOT_IOS_SYSTEM_SNAPSHOT_IOS_H_ +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_SYSTEM_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios.cc deleted file mode 100644 index ffd5a45..0000000 --- a/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios.cc +++ /dev/null
@@ -1,481 +0,0 @@ -// Copyright 2020 The Crashpad Authors. 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. -// 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. - -#include "snapshot/ios/thread_snapshot_ios.h" - -#include "base/mac/mach_logging.h" -#include "snapshot/mac/cpu_context_mac.h" - -namespace { - -#if defined(ARCH_CPU_X86_64) -const thread_state_flavor_t kThreadStateFlavor = x86_THREAD_STATE64; -const thread_state_flavor_t kFloatStateFlavor = x86_FLOAT_STATE64; -const thread_state_flavor_t kDebugStateFlavor = x86_DEBUG_STATE64; -#elif defined(ARCH_CPU_ARM64) -const thread_state_flavor_t kThreadStateFlavor = ARM_THREAD_STATE64; -const thread_state_flavor_t kFloatStateFlavor = ARM_NEON_STATE64; -const thread_state_flavor_t kDebugStateFlavor = ARM_DEBUG_STATE64; -#endif - -kern_return_t MachVMRegionRecurseDeepest(task_t task, - vm_address_t* address, - vm_size_t* size, - natural_t* depth, - vm_prot_t* protection, - unsigned int* user_tag) { - vm_region_submap_short_info_64 submap_info; - mach_msg_type_number_t count = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64; - while (true) { - kern_return_t kr = vm_region_recurse_64( - task, - address, - size, - depth, - reinterpret_cast<vm_region_recurse_info_t>(&submap_info), - &count); - if (kr != KERN_SUCCESS) { - return kr; - } - - if (!submap_info.is_submap) { - *protection = submap_info.protection; - *user_tag = submap_info.user_tag; - return KERN_SUCCESS; - } - - ++*depth; - } -} - -//! \brief Adjusts the region for the red zone, if the ABI requires one. -//! -//! This method performs red zone calculation for CalculateStackRegion(). Its -//! parameters are local variables used within that method, and may be -//! modified as needed. -//! -//! Where a red zone is required, the region of memory captured for a thread’s -//! stack will be extended to include the red zone below the stack pointer, -//! provided that such memory is mapped, readable, and has the correct user -//! tag value. If these conditions cannot be met fully, as much of the red -//! zone will be captured as is possible while meeting these conditions. -//! -//! \param[in,out] start_address The base address of the region to begin -//! capturing stack memory from. On entry, \a start_address is the stack -//! pointer. On return, \a start_address may be decreased to encompass a -//! red zone. -//! \param[in,out] region_base The base address of the region that contains -//! stack memory. This is distinct from \a start_address in that \a -//! region_base will be page-aligned. On entry, \a region_base is the -//! base address of a region that contains \a start_address. On return, -//! if \a start_address is decremented and is outside of the region -//! originally described by \a region_base, \a region_base will also be -//! decremented appropriately. -//! \param[in,out] region_size The size of the region that contains stack -//! memory. This region begins at \a region_base. On return, if \a -//! region_base is decremented, \a region_size will be incremented -//! appropriately. -//! \param[in] user_tag The Mach VM system’s user tag for the region described -//! by the initial values of \a region_base and \a region_size. The red -//! zone will only be allowed to extend out of the region described by -//! these initial values if the user tag is appropriate for stack memory -//! and the expanded region has the same user tag value. -void LocateRedZone(vm_address_t* const start_address, - vm_address_t* const region_base, - vm_address_t* const region_size, - const unsigned int user_tag) { - // x86_64 has a red zone. See AMD64 ABI 0.99.8, - // https://raw.githubusercontent.com/wiki/hjl-tools/x86-psABI/x86-64-psABI-r252.pdf#page=19, - // section 3.2.2, “The Stack Frame”. - // So does ARM64, - // https://developer.apple.com/library/archive/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARM64FunctionCallingConventions.html - // section "Red Zone". - constexpr vm_size_t kRedZoneSize = 128; - vm_address_t red_zone_base = - *start_address >= kRedZoneSize ? *start_address - kRedZoneSize : 0; - bool red_zone_ok = false; - if (red_zone_base >= *region_base) { - // The red zone is within the region already discovered. - red_zone_ok = true; - } else if (red_zone_base < *region_base && user_tag == VM_MEMORY_STACK) { - // Probe to see if there’s a region immediately below the one already - // discovered. - vm_address_t red_zone_region_base = red_zone_base; - vm_size_t red_zone_region_size; - natural_t red_zone_depth = 0; - vm_prot_t red_zone_protection; - unsigned int red_zone_user_tag; - kern_return_t kr = MachVMRegionRecurseDeepest(mach_task_self(), - &red_zone_region_base, - &red_zone_region_size, - &red_zone_depth, - &red_zone_protection, - &red_zone_user_tag); - if (kr != KERN_SUCCESS) { - MACH_LOG(INFO, kr) << "vm_region_recurse"; - *start_address = *region_base; - } else if (red_zone_region_base + red_zone_region_size == *region_base && - (red_zone_protection & VM_PROT_READ) != 0 && - red_zone_user_tag == user_tag) { - // The region containing the red zone is immediately below the region - // already found, it’s readable (not the guard region), and it has the - // same user tag as the region already found, so merge them. - red_zone_ok = true; - *region_base -= red_zone_region_size; - *region_size += red_zone_region_size; - } - } - - if (red_zone_ok) { - // Begin capturing from the base of the red zone (but not the entire - // region that encompasses the red zone). - *start_address = red_zone_base; - } else { - // The red zone would go lower into another region in memory, but no - // region was found. Memory can only be captured to an address as low as - // the base address of the region already found. - *start_address = *region_base; - } -} - -//! \brief Calculates the base address and size of the region used as a -//! thread’s stack. -//! -//! The region returned by this method may be formed by merging multiple -//! adjacent regions in a process’ memory map if appropriate. The base address -//! of the returned region may be lower than the \a stack_pointer passed in -//! when the ABI mandates a red zone below the stack pointer. -//! -//! \param[in] stack_pointer The stack pointer, referring to the top (lowest -//! address) of a thread’s stack. -//! \param[out] stack_region_size The size of the memory region used as the -//! thread’s stack. -//! -//! \return The base address (lowest address) of the memory region used as the -//! thread’s stack. -vm_address_t CalculateStackRegion(vm_address_t stack_pointer, - vm_size_t* stack_region_size) { - // For pthreads, it may be possible to compute the stack region based on the - // internal _pthread::stackaddr and _pthread::stacksize. The _pthread struct - // for a thread can be located at TSD slot 0, or the known offsets of - // stackaddr and stacksize from the TSD area could be used. - vm_address_t region_base = stack_pointer; - vm_size_t region_size; - natural_t depth = 0; - vm_prot_t protection; - unsigned int user_tag; - kern_return_t kr = MachVMRegionRecurseDeepest(mach_task_self(), - ®ion_base, - ®ion_size, - &depth, - &protection, - &user_tag); - if (kr != KERN_SUCCESS) { - MACH_LOG(INFO, kr) << "mach_vm_region_recurse"; - *stack_region_size = 0; - return 0; - } - - if (region_base > stack_pointer) { - // There’s nothing mapped at the stack pointer’s address. Something may have - // trashed the stack pointer. Note that this shouldn’t happen for a normal - // stack guard region violation because the guard region is mapped but has - // VM_PROT_NONE protection. - *stack_region_size = 0; - return 0; - } - - vm_address_t start_address = stack_pointer; - - if ((protection & VM_PROT_READ) == 0) { - // If the region isn’t readable, the stack pointer probably points to the - // guard region. Don’t include it as part of the stack, and don’t include - // anything at any lower memory address. The code below may still possibly - // find the real stack region at a memory address higher than this region. - start_address = region_base + region_size; - } else { - // If the ABI requires a red zone, adjust the region to include it if - // possible. - LocateRedZone(&start_address, ®ion_base, ®ion_size, user_tag); - - // Regardless of whether the ABI requires a red zone, capture up to - // kExtraCaptureSize additional bytes of stack, but only if present in the - // region that was already found. - constexpr vm_size_t kExtraCaptureSize = 128; - start_address = std::max(start_address >= kExtraCaptureSize - ? start_address - kExtraCaptureSize - : start_address, - region_base); - - // Align start_address to a 16-byte boundary, which can help readers by - // ensuring that data is aligned properly. This could page-align instead, - // but that might be wasteful. - constexpr vm_size_t kDesiredAlignment = 16; - start_address &= ~(kDesiredAlignment - 1); - DCHECK_GE(start_address, region_base); - } - - region_size -= (start_address - region_base); - region_base = start_address; - - vm_size_t total_region_size = region_size; - - // The stack region may have gotten split up into multiple abutting regions. - // Try to coalesce them. This frequently happens for the main thread’s stack - // when setrlimit(RLIMIT_STACK, …) is called. It may also happen if a region - // is split up due to an mprotect() or vm_protect() call. - // - // Stack regions created by the kernel and the pthreads library will be marked - // with the VM_MEMORY_STACK user tag. Scanning for multiple adjacent regions - // with the same tag should find an entire stack region. Checking that the - // protection on individual regions is not VM_PROT_NONE should guarantee that - // this algorithm doesn’t collect map entries belonging to another thread’s - // stack: well-behaved stacks (such as those created by the kernel and the - // pthreads library) have VM_PROT_NONE guard regions at their low-address - // ends. - // - // Other stack regions may not be so well-behaved and thus if user_tag is not - // VM_MEMORY_STACK, the single region that was found is used as-is without - // trying to merge it with other adjacent regions. - if (user_tag == VM_MEMORY_STACK) { - vm_address_t try_address = region_base; - vm_address_t original_try_address; - - while (try_address += region_size, - original_try_address = try_address, - (kr = MachVMRegionRecurseDeepest(mach_task_self(), - &try_address, - ®ion_size, - &depth, - &protection, - &user_tag) == KERN_SUCCESS) && - try_address == original_try_address && - (protection & VM_PROT_READ) != 0 && - user_tag == VM_MEMORY_STACK) { - total_region_size += region_size; - } - - if (kr != KERN_SUCCESS && kr != KERN_INVALID_ADDRESS) { - // Tolerate KERN_INVALID_ADDRESS because it will be returned when there - // are no more regions in the map at or above the specified |try_address|. - MACH_LOG(INFO, kr) << "vm_region_recurse"; - } - } - - *stack_region_size = total_region_size; - return region_base; -} - -} // namespace - -namespace crashpad { -namespace internal { - -ThreadSnapshotIOS::ThreadSnapshotIOS() - : ThreadSnapshot(), - context_(), - stack_(), - thread_id_(0), - thread_specific_data_address_(0), - suspend_count_(0), - priority_(0), - initialized_() {} - -ThreadSnapshotIOS::~ThreadSnapshotIOS() {} - -// static -thread_act_array_t ThreadSnapshotIOS::GetThreads( - mach_msg_type_number_t* count) { - thread_act_array_t threads; - kern_return_t kr = task_threads(mach_task_self(), &threads, count); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "task_threads"; - } - return threads; -} - -bool ThreadSnapshotIOS::Initialize(thread_t thread) { - INITIALIZATION_STATE_SET_INITIALIZING(initialized_); - - // TODO(justincohen): Move the following thread_get_state, thread_get_info, - // thread_policy_get and CalculateStackRegion to the serialize-on-read - // section. - thread_basic_info basic_info; - thread_precedence_policy precedence; - vm_size_t stack_region_size; - vm_address_t stack_region_address; -#if defined(ARCH_CPU_X86_64) - x86_thread_state64_t thread_state; - x86_float_state64_t float_state; - x86_debug_state64_t debug_state; - mach_msg_type_number_t thread_state_count = x86_THREAD_STATE64_COUNT; - mach_msg_type_number_t float_state_count = x86_FLOAT_STATE64_COUNT; - mach_msg_type_number_t debug_state_count = x86_DEBUG_STATE64_COUNT; -#elif defined(ARCH_CPU_ARM64) - arm_thread_state64_t thread_state; - arm_neon_state64_t float_state; - arm_debug_state64_t debug_state; - mach_msg_type_number_t thread_state_count = ARM_THREAD_STATE64_COUNT; - mach_msg_type_number_t float_state_count = ARM_NEON_STATE64_COUNT; - mach_msg_type_number_t debug_state_count = ARM_DEBUG_STATE64_COUNT; -#endif - - kern_return_t kr = - thread_get_state(thread, - kThreadStateFlavor, - reinterpret_cast<thread_state_t>(&thread_state), - &thread_state_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_get_state(" << kThreadStateFlavor << ")"; - } - - kr = thread_get_state(thread, - kFloatStateFlavor, - reinterpret_cast<thread_state_t>(&float_state), - &float_state_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_get_state(" << kFloatStateFlavor << ")"; - } - - kr = thread_get_state(thread, - kDebugStateFlavor, - reinterpret_cast<thread_state_t>(&debug_state), - &debug_state_count); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_get_state(" << kDebugStateFlavor << ")"; - } - - mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT; - kr = thread_info(thread, - THREAD_BASIC_INFO, - reinterpret_cast<thread_info_t>(&basic_info), - &count); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "thread_info(THREAD_BASIC_INFO)"; - } - - thread_identifier_info identifier_info; - count = THREAD_IDENTIFIER_INFO_COUNT; - kr = thread_info(thread, - THREAD_IDENTIFIER_INFO, - reinterpret_cast<thread_info_t>(&identifier_info), - &count); - if (kr != KERN_SUCCESS) { - MACH_LOG(WARNING, kr) << "thread_info(THREAD_IDENTIFIER_INFO)"; - } - - count = THREAD_PRECEDENCE_POLICY_COUNT; - boolean_t get_default = FALSE; - kr = thread_policy_get(thread, - THREAD_PRECEDENCE_POLICY, - reinterpret_cast<thread_policy_t>(&precedence), - &count, - &get_default); - if (kr != KERN_SUCCESS) { - MACH_LOG(ERROR, kr) << "thread_policy_get"; - } - -#if defined(ARCH_CPU_X86_64) - vm_address_t stack_pointer = thread_state.__rsp; -#elif defined(ARCH_CPU_ARM64) - vm_address_t stack_pointer = arm_thread_state64_get_sp(thread_state); -#endif - stack_region_address = - CalculateStackRegion(stack_pointer, &stack_region_size); - - // TODO(justincohen): Assume the following will fill in snapshot data from - // a deserialized object. - thread_id_ = identifier_info.thread_id; - suspend_count_ = basic_info.suspend_count; - priority_ = precedence.importance; - - // thread_identifier_info::thread_handle contains the base of the - // thread-specific data area, which on x86 and x86_64 is the thread’s base - // address of the %gs segment. 10.9.2 xnu-2422.90.20/osfmk/kern/thread.c - // thread_info_internal() gets the value from - // machine_thread::cthread_self, which is the same value used to set the - // %gs base in xnu-2422.90.20/osfmk/i386/pcb_native.c - // act_machine_switch_pcb(). - // - // On ARM64 10.15.0 xnu-6153.11.26/osfmk/kern/thread.c, it sets - // thread_identifier_info_t::thread_handle to - // thread->machine.cthread_self, which is set to tsd_base in - // osfmk/arm64/pcb.c. - thread_specific_data_address_ = identifier_info.thread_handle; - stack_.Initialize(stack_region_address, stack_region_size); - -#if defined(ARCH_CPU_X86_64) - context_.architecture = kCPUArchitectureX86_64; - context_.x86_64 = &context_x86_64_; - InitializeCPUContextX86_64(&context_x86_64_, - THREAD_STATE_NONE, - nullptr, - 0, - &thread_state, - &float_state, - &debug_state); -#elif defined(ARCH_CPU_ARM64) - context_.architecture = kCPUArchitectureARM64; - context_.arm64 = &context_arm64_; - InitializeCPUContextARM64(&context_arm64_, - THREAD_STATE_NONE, - nullptr, - 0, - &thread_state, - &float_state, - &debug_state); -#else -#error Port to your CPU architecture -#endif - - INITIALIZATION_STATE_SET_VALID(initialized_); - return true; -} - -const CPUContext* ThreadSnapshotIOS::Context() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return &context_; -} - -const MemorySnapshot* ThreadSnapshotIOS::Stack() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return &stack_; -} - -uint64_t ThreadSnapshotIOS::ThreadID() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return thread_id_; -} - -int ThreadSnapshotIOS::SuspendCount() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return suspend_count_; -} - -int ThreadSnapshotIOS::Priority() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return priority_; -} - -uint64_t ThreadSnapshotIOS::ThreadSpecificDataAddress() const { - INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return thread_specific_data_address_; -} - -std::vector<const MemorySnapshot*> ThreadSnapshotIOS::ExtraMemory() const { - return std::vector<const MemorySnapshot*>(); -} - -} // namespace internal -} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc b/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc new file mode 100644 index 0000000..198b41a --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.cc
@@ -0,0 +1,240 @@ +// Copyright 2020 The Crashpad Authors. 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. +// 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. + +#include "snapshot/ios/thread_snapshot_ios_intermediate_dump.h" + +#include "base/mac/mach_logging.h" +#include "snapshot/ios/intermediate_dump_reader_util.h" +#include "snapshot/mac/cpu_context_mac.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/ios/ios_intermediate_dump_map.h" + +#include <vector> + +namespace { + +std::vector<uint8_t> GenerateStackMemoryFromFrames(const uint64_t* frames, + const size_t frame_count) { + std::vector<uint8_t> stack_memory; + if (frame_count < 2) { + return stack_memory; + } + size_t pointer_size = sizeof(uintptr_t); + size_t frame_record_size = 2 * pointer_size; + size_t stack_size = frame_record_size * (frame_count - 1) + pointer_size; + stack_memory.resize(stack_size); + uintptr_t sp = stack_size - pointer_size; + uintptr_t fp = 0; + uintptr_t lr = 0; + for (size_t current_frame = frame_count - 1; current_frame > 0; + --current_frame) { + memcpy(&stack_memory[0] + sp, &lr, sizeof(lr)); + sp -= pointer_size; + memcpy(&stack_memory[0] + sp, &fp, sizeof(fp)); + fp = sp; + sp -= pointer_size; + lr = frames[current_frame]; + } + + if (sp != 0) { + LOG(ERROR) << "kExpectedFinalSp should be 0, is " << sp; + } + if (fp != sizeof(uintptr_t)) { + LOG(ERROR) << "kExpectedFinalFp should be sizeof(uintptr_t), is " << fp; + } + if (lr != frames[1]) { + LOG(ERROR) << "lr should be " << frames[1] << ", is " << lr; + } + return stack_memory; +} + +} // namespace +namespace crashpad { +namespace internal { + +using Key = IntermediateDumpKey; + +ThreadSnapshotIOSIntermediateDump::ThreadSnapshotIOSIntermediateDump() + : ThreadSnapshot(), + context_(), + stack_(), + thread_id_(0), + thread_specific_data_address_(0), + suspend_count_(0), + priority_(0), + initialized_() { +#if defined(ARCH_CPU_X86_64) + context_.architecture = kCPUArchitectureX86_64; + context_.x86_64 = &context_x86_64_; +#elif defined(ARCH_CPU_ARM64) + context_.architecture = kCPUArchitectureARM64; + context_.arm64 = &context_arm64_; +#endif +} + +ThreadSnapshotIOSIntermediateDump::~ThreadSnapshotIOSIntermediateDump() {} + +bool ThreadSnapshotIOSIntermediateDump::Initialize( + const IOSIntermediateDumpMap* thread_data) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + GetDataValueFromMap(thread_data, Key::kSuspendCount, &suspend_count_); + GetDataValueFromMap(thread_data, Key::kPriority, &priority_); + GetDataValueFromMap(thread_data, Key::kThreadID, &thread_id_); + GetDataValueFromMap( + thread_data, Key::kThreadDataAddress, &thread_specific_data_address_); + +#if defined(ARCH_CPU_X86_64) + typedef x86_thread_state64_t thread_state_type; + typedef x86_float_state64_t float_state_type; + typedef x86_debug_state64_t debug_state_type; +#elif defined(ARCH_CPU_ARM64) + typedef arm_thread_state64_t thread_state_type; + typedef arm_neon_state64_t float_state_type; + typedef arm_debug_state64_t debug_state_type; +#endif + + thread_state_type thread_state; + float_state_type float_state; + debug_state_type debug_state; + + const IOSIntermediateDumpData* nsexception_frames = + thread_data->GetAsData(Key::kThreadUncaughtNSExceptionFrames); + const IOSIntermediateDumpData* thread_stack_data_dump = + thread_data->GetAsData(Key::kStackRegionData); + if (nsexception_frames && thread_stack_data_dump) { + LOG(ERROR) << "Unexpected thread with kStackRegionData and " + << "kThreadUncaughtNSExceptionFrames, using kStackRegionData"; + } + if (thread_stack_data_dump) { + vm_address_t stack_region_address; + GetDataValueFromMap( + thread_data, Key::kStackRegionAddress, &stack_region_address); + + const std::vector<uint8_t>& bytes = thread_stack_data_dump->bytes(); + const vm_address_t stack_region_data = + reinterpret_cast<const vm_address_t>(bytes.data()); + vm_size_t stack_region_size = bytes.size(); + stack_.Initialize( + stack_region_address, stack_region_data, stack_region_size); + } else if (nsexception_frames) { + const std::vector<uint8_t>& bytes = nsexception_frames->bytes(); + const uint64_t* frames = reinterpret_cast<const uint64_t*>(bytes.data()); + size_t frame_count = bytes.size() / sizeof(uint64_t); + exception_stack_memory_ = + GenerateStackMemoryFromFrames(frames, frame_count); + stack_.Initialize( + 0, + reinterpret_cast<vm_address_t>(&exception_stack_memory_[0]), + exception_stack_memory_.size()); + } else { + stack_.Initialize(0, 0, 0); + } + + if (GetDataValueFromMap(thread_data, Key::kThreadState, &thread_state) && + GetDataValueFromMap(thread_data, Key::kFloatState, &float_state) && + GetDataValueFromMap(thread_data, Key::kDebugState, &debug_state)) { +#if defined(ARCH_CPU_X86_64) + InitializeCPUContextX86_64(&context_x86_64_, + THREAD_STATE_NONE, + nullptr, + 0, + &thread_state, + &float_state, + &debug_state); +#elif defined(ARCH_CPU_ARM64) + InitializeCPUContextARM64(&context_arm64_, + THREAD_STATE_NONE, + nullptr, + 0, + &thread_state, + &float_state, + &debug_state); + +#else +#error Port to your CPU architecture +#endif + } + const IOSIntermediateDumpList* thread_context_memory_regions = + GetListFromMap(thread_data, Key::kThreadContextMemoryRegions); + if (thread_context_memory_regions) { + for (auto& region : *thread_context_memory_regions) { + vm_address_t address; + const IOSIntermediateDumpData* region_data = + region->GetAsData(Key::kThreadContextMemoryRegionData); + if (!region_data) + continue; + if (GetDataValueFromMap( + region.get(), Key::kThreadContextMemoryRegionAddress, &address)) { + const std::vector<uint8_t>& bytes = region_data->bytes(); + vm_size_t data_size = bytes.size(); + if (data_size == 0) + continue; + + const vm_address_t data = + reinterpret_cast<const vm_address_t>(bytes.data()); + + auto memory = + std::make_unique<internal::MemorySnapshotIOSIntermediateDump>(); + memory->Initialize(address, data, data_size); + extra_memory_.push_back(std::move(memory)); + } + } + } + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} +const CPUContext* ThreadSnapshotIOSIntermediateDump::Context() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return &context_; +} + +const MemorySnapshot* ThreadSnapshotIOSIntermediateDump::Stack() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return &stack_; +} + +uint64_t ThreadSnapshotIOSIntermediateDump::ThreadID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return thread_id_; +} + +int ThreadSnapshotIOSIntermediateDump::SuspendCount() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return suspend_count_; +} + +int ThreadSnapshotIOSIntermediateDump::Priority() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return priority_; +} + +uint64_t ThreadSnapshotIOSIntermediateDump::ThreadSpecificDataAddress() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return thread_specific_data_address_; +} + +std::vector<const MemorySnapshot*> +ThreadSnapshotIOSIntermediateDump::ExtraMemory() const { + std::vector<const MemorySnapshot*> extra_memory; + for (const auto& memory : extra_memory_) { + extra_memory.push_back(memory.get()); + } + return extra_memory; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h similarity index 63% rename from third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios.h rename to third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h index 978a8186..d986c49 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/thread_snapshot_ios_intermediate_dump.h
@@ -12,36 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef CRASHPAD_SNAPSHOT_IOS_THREAD_SNAPSHOT_IOS_H_ -#define CRASHPAD_SNAPSHOT_IOS_THREAD_SNAPSHOT_IOS_H_ +#ifndef CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_THREAD_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ +#define CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_THREAD_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_ #include "base/macros.h" #include "build/build_config.h" #include "snapshot/cpu_context.h" -#include "snapshot/ios/memory_snapshot_ios.h" +#include "snapshot/ios/memory_snapshot_ios_intermediate_dump.h" #include "snapshot/thread_snapshot.h" +#include "util/ios/ios_intermediate_dump_map.h" #include "util/misc/initialization_state_dcheck.h" namespace crashpad { namespace internal { //! \brief A ThreadSnapshot of a thread on an iOS system. -class ThreadSnapshotIOS final : public ThreadSnapshot { +class ThreadSnapshotIOSIntermediateDump final : public ThreadSnapshot { public: - ThreadSnapshotIOS(); - ~ThreadSnapshotIOS() override; + ThreadSnapshotIOSIntermediateDump(); + ~ThreadSnapshotIOSIntermediateDump() override; //! \brief Initializes the object. //! - //! \brief thread The Mach thread used to initialize this object. - bool Initialize(thread_t thread); - - //! \brief Returns an array of thread_t threads. + //! \brief thread_data The intermediate dump map used to initialize this + //! object. //! - //! \param[out] count The number of threads returned. - //! - //! \return An array of of size \a count threads. - static thread_act_array_t GetThreads(mach_msg_type_number_t* count); + //! \return `true` if the snapshot could be created. + bool Initialize(const IOSIntermediateDumpMap* thread_data); // ThreadSnapshot: const CPUContext* Context() const override; @@ -61,17 +58,20 @@ #error Port. #endif // ARCH_CPU_X86_64 CPUContext context_; - MemorySnapshotIOS stack_; + std::vector<uint8_t> exception_stack_memory_; + MemorySnapshotIOSIntermediateDump stack_; uint64_t thread_id_; uint64_t thread_specific_data_address_; int suspend_count_; int priority_; + std::vector<std::unique_ptr<internal::MemorySnapshotIOSIntermediateDump>> + extra_memory_; InitializationStateDcheck initialized_; - DISALLOW_COPY_AND_ASSIGN(ThreadSnapshotIOS); + DISALLOW_COPY_AND_ASSIGN(ThreadSnapshotIOSIntermediateDump); }; } // namespace internal } // namespace crashpad -#endif // CRASHPAD_SNAPSHOT_IOS_THREAD_SNAPSHOT_IOS_H_ +#endif // CRASHPAD_SNAPSHOT_IOS_INTERMEDIATE_DUMP_THREAD_SNAPSHOT_IOS_INTERMEDIATEDUMP_H_
diff --git a/third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc b/third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc index c17170b..1f72fe8 100644 --- a/third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc +++ b/third_party/crashpad/crashpad/snapshot/linux/exception_snapshot_linux_test.cc
@@ -22,8 +22,8 @@ #include <unistd.h> #include "base/bit_cast.h" +#include "base/cxx17_backports.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "snapshot/cpu_architecture.h"
diff --git a/third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc b/third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc index 6373a3a0..5a0d137 100644 --- a/third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc +++ b/third_party/crashpad/crashpad/snapshot/linux/process_reader_linux_test.cc
@@ -31,9 +31,9 @@ #include <string> #include <utility> +#include "base/cxx17_backports.h" #include "base/format_macros.h" #include "base/memory/free_deleter.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_reader.cc b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_reader.cc index bd258caf..4e66f3d 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_reader.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_reader.cc
@@ -21,8 +21,8 @@ #include <limits> #include <utility> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "client/crashpad_info.h" #include "snapshot/mac/mach_o_image_segment_reader.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc index 4731a5f..f89b475f 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/mach_o_image_segment_reader_test.cc
@@ -16,7 +16,7 @@ #include <mach-o/loader.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac_test.cc b/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac_test.cc index a85eeb2..c2c504c 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_reader_mac_test.cc
@@ -29,10 +29,10 @@ #include <utility> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/mac/mach_logging.h" #include "base/posix/eintr_wrapper.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_types.cc b/third_party/crashpad/crashpad/snapshot/mac/process_types.cc index 92bc722..3d4e0590 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_types.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_types.cc
@@ -20,7 +20,7 @@ #include <memory> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "snapshot/mac/process_types/internal.h" #include "util/process/process_memory_mac.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc b/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc index 0b8d969e..d80a984bf 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_types/custom.cc
@@ -23,9 +23,9 @@ #include <type_traits> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/numerics/safe_math.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "snapshot/mac/process_types/internal.h" #include "util/mac/mac_util.h"
diff --git a/third_party/crashpad/crashpad/snapshot/mac/process_types_test.cc b/third_party/crashpad/crashpad/snapshot/mac/process_types_test.cc index b589821..e0c3c9c 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/process_types_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/process_types_test.cc
@@ -21,7 +21,7 @@ #include <limits> #include <vector> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/minidump_context_converter.cc b/third_party/crashpad/crashpad/snapshot/minidump/minidump_context_converter.cc index 01cfc28e..981f34c 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/minidump_context_converter.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/minidump_context_converter.cc
@@ -16,8 +16,8 @@ #include <string.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "minidump/minidump_context.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc index 31633cc..b9fa23d7 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/process_snapshot_minidump_test.cc
@@ -21,8 +21,8 @@ #include <algorithm> #include <memory> +#include "base/cxx17_backports.h" #include "base/numerics/safe_math.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "gtest/gtest.h" #include "minidump/minidump_context.h"
diff --git a/third_party/crashpad/crashpad/snapshot/minidump/thread_snapshot_minidump.cc b/third_party/crashpad/crashpad/snapshot/minidump/thread_snapshot_minidump.cc index 8a5a2fd6..f8f3673f 100644 --- a/third_party/crashpad/crashpad/snapshot/minidump/thread_snapshot_minidump.cc +++ b/third_party/crashpad/crashpad/snapshot/minidump/thread_snapshot_minidump.cc
@@ -17,7 +17,7 @@ #include <stddef.h> #include <string.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "minidump/minidump_context.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/snapshot/posix/timezone.cc b/third_party/crashpad/crashpad/snapshot/posix/timezone.cc index 9451e11..c413d708 100644 --- a/third_party/crashpad/crashpad/snapshot/posix/timezone.cc +++ b/third_party/crashpad/crashpad/snapshot/posix/timezone.cc
@@ -17,8 +17,9 @@ #include <stddef.h> #include <time.h> +#include "base/check.h" +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "build/build_config.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/snapshot/posix/timezone_test.cc b/third_party/crashpad/crashpad/snapshot/posix/timezone_test.cc index 73c39ba2..4d60b837 100644 --- a/third_party/crashpad/crashpad/snapshot/posix/timezone_test.cc +++ b/third_party/crashpad/crashpad/snapshot/posix/timezone_test.cc
@@ -20,8 +20,8 @@ #include <string> +#include "base/cxx17_backports.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "test/errors.h"
diff --git a/third_party/crashpad/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc b/third_party/crashpad/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc index 931f5cb..48aad78 100644 --- a/third_party/crashpad/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc +++ b/third_party/crashpad/crashpad/snapshot/sanitized/process_snapshot_sanitized_test.cc
@@ -16,9 +16,9 @@ #include <string.h> +#include "base/cxx17_backports.h" #include "base/macros.h" #include "base/notreached.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "test/multiprocess_exec.h"
diff --git a/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc b/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc index 1be887a..f3864424 100644 --- a/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc +++ b/third_party/crashpad/crashpad/snapshot/sanitized/sanitization_information_test.cc
@@ -14,7 +14,7 @@ #include "snapshot/sanitized/sanitization_information.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "util/misc/from_pointer_cast.h"
diff --git a/third_party/crashpad/crashpad/snapshot/test/test_cpu_context.cc b/third_party/crashpad/crashpad/snapshot/test/test_cpu_context.cc index 746e340..4923d4c4 100644 --- a/third_party/crashpad/crashpad/snapshot/test/test_cpu_context.cc +++ b/third_party/crashpad/crashpad/snapshot/test/test_cpu_context.cc
@@ -17,7 +17,7 @@ #include <string.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" namespace crashpad { namespace test {
diff --git a/third_party/crashpad/crashpad/snapshot/win/cpu_context_win_test.cc b/third_party/crashpad/crashpad/snapshot/win/cpu_context_win_test.cc index e63f04e..15f7667 100644 --- a/third_party/crashpad/crashpad/snapshot/win/cpu_context_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/cpu_context_win_test.cc
@@ -16,7 +16,7 @@ #include <windows.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "snapshot/cpu_context.h"
diff --git a/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc b/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc index 8bccbd6..94d0e47d 100644 --- a/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc +++ b/third_party/crashpad/crashpad/snapshot/win/crashpad_snapshot_test_image_reader.cc
@@ -14,8 +14,8 @@ #include <windows.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "client/crashpad_info.h" #include "util/file/file_io.h" #include "util/synchronization/semaphore.h"
diff --git a/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader.cc b/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader.cc index f19ab3aa..494b3398 100644 --- a/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader.cc +++ b/third_party/crashpad/crashpad/snapshot/win/pe_image_annotations_reader.cc
@@ -17,8 +17,8 @@ #include <string.h> #include <sys/types.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "client/annotation.h" #include "client/simple_string_dictionary.h"
diff --git a/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc b/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc index e69faef..bc4511b 100644 --- a/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc +++ b/third_party/crashpad/crashpad/snapshot/win/pe_image_reader.cc
@@ -20,8 +20,8 @@ #include <algorithm> #include <memory> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "client/crashpad_info.h" #include "snapshot/win/pe_image_resource_reader.h"
diff --git a/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc b/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc index de22008..7c6c739 100644 --- a/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc +++ b/third_party/crashpad/crashpad/snapshot/win/process_reader_win_test.cc
@@ -17,7 +17,7 @@ #include <windows.h> #include <string.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "test/win/win_multiprocess.h" #include "util/misc/from_pointer_cast.h"
diff --git a/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc b/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc index 4be2033..21df191 100644 --- a/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc +++ b/third_party/crashpad/crashpad/snapshot/win/process_snapshot_win.cc
@@ -20,9 +20,9 @@ #include <algorithm> #include <utility> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "util/misc/from_pointer_cast.h"
diff --git a/third_party/crashpad/crashpad/test/hex_string_test.cc b/third_party/crashpad/crashpad/test/hex_string_test.cc index 3a09eb76..ac6343bf 100644 --- a/third_party/crashpad/crashpad/test/hex_string_test.cc +++ b/third_party/crashpad/crashpad/test/hex_string_test.cc
@@ -14,7 +14,7 @@ #include "test/hex_string.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/tools/crashpad_database_util.cc b/third_party/crashpad/crashpad/tools/crashpad_database_util.cc index 176b8c7d..e9927bd 100644 --- a/third_party/crashpad/crashpad/tools/crashpad_database_util.cc +++ b/third_party/crashpad/crashpad/tools/crashpad_database_util.cc
@@ -27,9 +27,9 @@ #include <vector> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "client/crash_report_database.h"
diff --git a/third_party/crashpad/crashpad/tools/mac/on_demand_service_tool.mm b/third_party/crashpad/crashpad/tools/mac/on_demand_service_tool.mm index 70de1b5..7b3e104 100644 --- a/third_party/crashpad/crashpad/tools/mac/on_demand_service_tool.mm +++ b/third_party/crashpad/crashpad/tools/mac/on_demand_service_tool.mm
@@ -152,13 +152,12 @@ dictionaryWithCapacity:options.mach_services.size()]; for (std::string mach_service : options.mach_services) { NSString* mach_service_ns = base::SysUTF8ToNSString(mach_service); - [mach_services setObject:@YES forKey:mach_service_ns]; + mach_services[mach_service_ns] = @YES; } NSMutableDictionary* mutable_job_dictionary = [[job_dictionary mutableCopy] autorelease]; - [mutable_job_dictionary setObject:mach_services - forKey:@LAUNCH_JOBKEY_MACHSERVICES]; + mutable_job_dictionary[@LAUNCH_JOBKEY_MACHSERVICES] = mach_services; job_dictionary = mutable_job_dictionary; }
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn index c3ffc44e..ebf38f2d 100644 --- a/third_party/crashpad/crashpad/util/BUILD.gn +++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -390,6 +390,19 @@ sources += [ "ios/exception_processor.h", "ios/exception_processor.mm", + "ios/ios_intermediate_dump_data.cc", + "ios/ios_intermediate_dump_data.h", + "ios/ios_intermediate_dump_format.h", + "ios/ios_intermediate_dump_list.cc", + "ios/ios_intermediate_dump_list.h", + "ios/ios_intermediate_dump_map.cc", + "ios/ios_intermediate_dump_map.h", + "ios/ios_intermediate_dump_object.cc", + "ios/ios_intermediate_dump_object.h", + "ios/ios_intermediate_dump_reader.cc", + "ios/ios_intermediate_dump_reader.h", + "ios/ios_intermediate_dump_writer.cc", + "ios/ios_intermediate_dump_writer.h", "ios/ios_system_data_collector.h", "ios/ios_system_data_collector.mm", "ios/raw_logging.cc", @@ -801,6 +814,8 @@ if (crashpad_is_ios) { sources += [ "ios/exception_processor_test.mm", + "ios/ios_intermediate_dump_reader_test.cc", + "ios/ios_intermediate_dump_writer_test.cc", "ios/scoped_vm_read_test.cc", ]
diff --git a/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc b/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc index e96b1b0..f899dbf 100644 --- a/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc +++ b/third_party/crashpad/crashpad/util/file/delimited_file_reader.cc
@@ -20,8 +20,8 @@ #include <limits> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc b/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc index a2fd7d5..05e61011 100644 --- a/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc +++ b/third_party/crashpad/crashpad/util/file/delimited_file_reader_test.cc
@@ -16,8 +16,8 @@ #include <vector> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "util/file/string_file.h"
diff --git a/third_party/crashpad/crashpad/util/file/file_io_test.cc b/third_party/crashpad/crashpad/util/file/file_io_test.cc index 553d9d6..cea18555 100644 --- a/third_party/crashpad/crashpad/util/file/file_io_test.cc +++ b/third_party/crashpad/crashpad/util/file/file_io_test.cc
@@ -20,9 +20,9 @@ #include <type_traits> #include "base/atomicops.h" +#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/stl_util.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "test/errors.h"
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_data.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_data.cc new file mode 100644 index 0000000..4879ccf2 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_data.cc
@@ -0,0 +1,42 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_data.h" + +namespace crashpad { +namespace internal { + +IOSIntermediateDumpData::IOSIntermediateDumpData() : data_() {} + +IOSIntermediateDumpData::~IOSIntermediateDumpData() {} + +IOSIntermediateDumpObject::Type IOSIntermediateDumpData::GetType() const { + return Type::kData; +} + +std::string IOSIntermediateDumpData::GetString() const { + return std::string(reinterpret_cast<const char*>(data_.data()), data_.size()); +} + +bool IOSIntermediateDumpData::GetValueInternal(void* value, + size_t value_size) const { + if (value_size == data_.size()) { + memcpy(value, data_.data(), data_.size()); + return true; + } + return false; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_data.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_data.h new file mode 100644 index 0000000..def5ab9 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_data.h
@@ -0,0 +1,68 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_DATA_H_ +#define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_DATA_H_ + +#include <string> +#include <vector> + +#include "base/macros.h" +#include "util/ios/ios_intermediate_dump_object.h" + +namespace crashpad { +namespace internal { + +//! \brief A data object, consisting of a std::vector<uint8_t>. +class IOSIntermediateDumpData : public IOSIntermediateDumpObject { + public: + IOSIntermediateDumpData(); + ~IOSIntermediateDumpData() override; + + //! \brief Constructs a new data object which owns a std::vector<uint8_t>. + //! + //! \param[in] data An array of uint8_t. + //! \param[in] length The length of \a data. + IOSIntermediateDumpData(std::vector<uint8_t> data) : data_(std::move(data)) {} + + // IOSIntermediateDumpObject: + Type GetType() const override; + + //! \brief Returns data as a string. + std::string GetString() const; + + //! \brief Copies the data into \a value if sizeof(T) matches data_.size(). + //! + //! \param[out] value The data to populate. + //! + //! \return On success, returns `true`, otherwise returns `false`. + template <typename T> + bool GetValue(T* value) const { + return GetValueInternal(reinterpret_cast<void*>(value), sizeof(*value)); + } + + const std::vector<uint8_t>& bytes() const { return data_; } + + private: + bool GetValueInternal(void* value, size_t value_size) const; + + std::vector<uint8_t> data_; + + DISALLOW_COPY_AND_ASSIGN(IOSIntermediateDumpData); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_DATA_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h new file mode 100644 index 0000000..1d7cad6 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_format.h
@@ -0,0 +1,120 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_FORMAT_H_ +#define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_FORMAT_H_ + +namespace crashpad { +namespace internal { + +// Define values for intermediate dump enum class IntermediateDumpKey. Use +// |INTERMEDIATE_DUMP_KEYS| so it is easier to print human readable keys in +// logs. +// clang-format off +#define INTERMEDIATE_DUMP_KEYS(TD) \ + TD(kInvalid, 0) \ + TD(kVersion, 1) \ + TD(kMachException, 1000) \ + TD(kCode, 1001) \ + TD(kCodeCount, 1002) \ + TD(kException, 1003) \ + TD(kFlavor, 1004) \ + TD(kState, 1005) \ + TD(kStateCount, 1006) \ + TD(kSignalException, 2000) \ + TD(kSignalNumber, 2001) \ + TD(kSignalCode, 2002) \ + TD(kSignalAddress, 2003) \ + TD(kNSException, 2500) \ + TD(kModules, 3000) \ + TD(kAddress, 3001) \ + TD(kFileType, 3002) \ + TD(kName, 3003) \ + TD(kSize, 3004) \ + TD(kDylibCurrentVersion, 3005) \ + TD(kSourceVersion, 3006) \ + TD(kTimestamp, 3007) \ + TD(kUUID, 3008) \ + TD(kAnnotationObjects, 3009) \ + TD(kAnnotationsSimpleMap, 3010) \ + TD(kAnnotationsVector, 3011) \ + TD(kAnnotationType, 3012) \ + TD(kAnnotationName, 3013) \ + TD(kAnnotationValue, 3014) \ + TD(kAnnotationsCrashInfo, 3015) \ + TD(kAnnotationsCrashInfoMessage1, 3016) \ + TD(kAnnotationsCrashInfoMessage2, 3017) \ + TD(kAnnotationsDyldErrorString, 3018) \ + TD(kProcessInfo, 4000) \ + TD(kParentPID, 4001) \ + TD(kPID, 4002) \ + TD(kStartTime, 4003) \ + TD(kSnapshotTime, 4004) \ + TD(kTaskBasicInfo, 4005) \ + TD(kTaskThreadTimes, 4006) \ + TD(kSystemTime, 4007) \ + TD(kUserTime, 4008) \ + TD(kSystemInfo, 5000) \ + TD(kCpuCount, 5001) \ + TD(kCpuVendor, 5002) \ + TD(kDaylightName, 5003) \ + TD(kDaylightOffsetSeconds, 5004) \ + TD(kHasDaylightSavingTime, 5005) \ + TD(kIsDaylightSavingTime, 5006) \ + TD(kMachineDescription, 5007) \ + TD(kOSVersionBugfix, 5008) \ + TD(kOSVersionBuild, 5009) \ + TD(kOSVersionMajor, 5010) \ + TD(kOSVersionMinor, 5011) \ + TD(kPageSize, 5012) \ + TD(kStandardName, 5013) \ + TD(kStandardOffsetSeconds, 5014) \ + TD(kVMStat, 5015) \ + TD(kActive, 5016) \ + TD(kFree, 5017) \ + TD(kInactive, 5018) \ + TD(kWired, 5019) \ + TD(kThreads, 6000) \ + TD(kDebugState, 6001) \ + TD(kFloatState, 6002) \ + TD(kThreadState, 6003) \ + TD(kPriority, 6004) \ + TD(kStackRegionAddress, 6005) \ + TD(kStackRegionData, 6006) \ + TD(kSuspendCount, 6007) \ + TD(kThreadID, 6008) \ + TD(kThreadDataAddress, 6009) \ + TD(kThreadUncaughtNSExceptionFrames, 6010) \ + TD(kThreadContextMemoryRegions, 6011) \ + TD(kThreadContextMemoryRegionAddress, 6012) \ + TD(kThreadContextMemoryRegionData, 6013) \ + TD(kMaxValue, 65535) \ +// clang-format on + + +//! \brief They key for items in the intermediate dump file. +//! +//! These values are persisted to the intermediate crash dump file. Entries +//! should not be renumbered and numeric values should never be reused. +enum class IntermediateDumpKey : uint16_t { +#define X(NAME, VALUE) NAME = VALUE, + INTERMEDIATE_DUMP_KEYS(X) +#undef X +}; + + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_FORMAT_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_list.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_list.cc new file mode 100644 index 0000000..17f2b89d --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_list.cc
@@ -0,0 +1,29 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_list.h" + +namespace crashpad { +namespace internal { + +IOSIntermediateDumpList::IOSIntermediateDumpList() : list_() {} + +IOSIntermediateDumpList::~IOSIntermediateDumpList() {} + +IOSIntermediateDumpObject::Type IOSIntermediateDumpList::GetType() const { + return Type::kList; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_list.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_list.h new file mode 100644 index 0000000..42d1ef29 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_list.h
@@ -0,0 +1,55 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_LIST_H_ +#define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_LIST_H_ + +#include <vector> + +#include "base/macros.h" +#include "util/ios/ios_intermediate_dump_map.h" +#include "util/ios/ios_intermediate_dump_object.h" + +namespace crashpad { +namespace internal { + +//! \brief A list object, consisting of a vector of IOSIntermediateDumpMap. +//! +//! Provides a wrapper around an internal std::vector. +class IOSIntermediateDumpList : public IOSIntermediateDumpObject { + public: + IOSIntermediateDumpList(); + ~IOSIntermediateDumpList() override; + + // IOSIntermediateDumpObject: + Type GetType() const override; + + using VectorType = std::vector<std::unique_ptr<const IOSIntermediateDumpMap>>; + VectorType::const_iterator begin() const { return list_.begin(); } + VectorType::const_iterator end() const { return list_.end(); } + VectorType::size_type size() const { return list_.size(); } + void push_back(std::unique_ptr<const IOSIntermediateDumpMap> val) { + list_.push_back(std::move(val)); + } + + private: + VectorType list_; + + DISALLOW_COPY_AND_ASSIGN(IOSIntermediateDumpList); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_LIST_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_map.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_map.cc new file mode 100644 index 0000000..7ec6103 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_map.cc
@@ -0,0 +1,68 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_map.h" + +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/ios/ios_intermediate_dump_object.h" + +using crashpad::internal::IntermediateDumpKey; + +namespace crashpad { +namespace internal { + +IOSIntermediateDumpMap::IOSIntermediateDumpMap() : map_() {} + +IOSIntermediateDumpMap::~IOSIntermediateDumpMap() {} + +IOSIntermediateDumpMap::Type IOSIntermediateDumpMap::GetType() const { + return Type::kMap; +} + +const IOSIntermediateDumpData* IOSIntermediateDumpMap::GetAsData( + const IntermediateDumpKey& key) const { + auto object_it = map_.find(key); + if (object_it != map_.end()) { + IOSIntermediateDumpObject* object = object_it->second.get(); + if (object->GetType() == Type::kData) + return static_cast<IOSIntermediateDumpData*>(object); + } + return nullptr; +} + +const IOSIntermediateDumpList* IOSIntermediateDumpMap::GetAsList( + const IntermediateDumpKey& key) const { + auto object_it = map_.find(key); + if (object_it != map_.end()) { + IOSIntermediateDumpObject* object = object_it->second.get(); + if (object->GetType() == Type::kList) + return static_cast<IOSIntermediateDumpList*>(object); + } + return nullptr; +} + +const IOSIntermediateDumpMap* IOSIntermediateDumpMap::GetAsMap( + const IntermediateDumpKey& key) const { + auto object_it = map_.find(key); + if (object_it != map_.end()) { + IOSIntermediateDumpObject* object = object_it->second.get(); + if (object->GetType() == Type::kMap) + return static_cast<IOSIntermediateDumpMap*>(object); + } + return nullptr; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_map.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_map.h new file mode 100644 index 0000000..a11d6a6 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_map.h
@@ -0,0 +1,70 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_PACK_IOS_MAP_H_ +#define CRASHPAD_UTIL_IOS_PACK_IOS_MAP_H_ + +#include <map> +#include <memory> + +#include "base/macros.h" +#include "util/ios/ios_intermediate_dump_format.h" +#include "util/ios/ios_intermediate_dump_object.h" + +namespace crashpad { +namespace internal { + +class IOSIntermediateDumpList; +class IOSIntermediateDumpData; + +//! \brief A map object containing a IntermediateDump Key-Object pair. +//! +//! Also provides an element access helper. +class IOSIntermediateDumpMap : public IOSIntermediateDumpObject { + public: + IOSIntermediateDumpMap(); + ~IOSIntermediateDumpMap() override; + + // IOSIntermediateDumpObject: + Type GetType() const override; + + //! \brief Returns an IOSIntermediateDumpData. If the type is not kData, + //! returns nullptr + const IOSIntermediateDumpData* GetAsData( + const IntermediateDumpKey& key) const; + + //! \brief Returns an IOSIntermediateDumpList. If the type is not kList, + //! returns nullptr + const IOSIntermediateDumpList* GetAsList( + const IntermediateDumpKey& key) const; + + //! \brief Returns an IOSIntermediateDumpMap. If the type is not kMap, + //! returns nullptr + const IOSIntermediateDumpMap* GetAsMap(const IntermediateDumpKey& key) const; + + //! \brief Returns `true` if the map is empty. + bool empty() const { return map_.empty(); } + + private: + friend class IOSIntermediateDumpReader; + std::map<IntermediateDumpKey, std::unique_ptr<IOSIntermediateDumpObject>> + map_; + + DISALLOW_COPY_AND_ASSIGN(IOSIntermediateDumpMap); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_PACK_IOS_MAP_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_object.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_object.cc new file mode 100644 index 0000000..99099350 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_object.cc
@@ -0,0 +1,25 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_object.h" + +namespace crashpad { +namespace internal { + +IOSIntermediateDumpObject::IOSIntermediateDumpObject() = default; + +IOSIntermediateDumpObject::~IOSIntermediateDumpObject() {} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_object.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_object.h new file mode 100644 index 0000000..21ccd297 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_object.h
@@ -0,0 +1,51 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_OBJECT_H_ +#define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_OBJECT_H_ + +#include "base/macros.h" +#include "util/ios/ios_intermediate_dump_writer.h" + +namespace crashpad { +namespace internal { + +//! \brief Base class for intermediate dump object types. +class IOSIntermediateDumpObject { + public: + IOSIntermediateDumpObject(); + virtual ~IOSIntermediateDumpObject(); + + //! \brief The type of object stored in the intermediate dump. . + enum class Type { + //! \brief A data object, containing array of bytes. + kData, + + //! \brief A map object, containing other lists, maps and data objects. + kMap, + + //! \brief A list object, containing a list of map objects. + kList, + }; + + //! \brief Returns a type. + virtual Type GetType() const = 0; + + DISALLOW_COPY_AND_ASSIGN(IOSIntermediateDumpObject); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_OBJECT_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader.cc new file mode 100644 index 0000000..b571662d --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader.cc
@@ -0,0 +1,192 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_reader.h" + +#include <memory> +#include <stack> +#include <vector> + +#include "base/logging.h" +#include "util/file/filesystem.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_format.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/ios/ios_intermediate_dump_object.h" +#include "util/ios/ios_intermediate_dump_writer.h" + +namespace crashpad { +namespace internal { + +bool IOSIntermediateDumpReader::Initialize(const base::FilePath& path) { + ScopedFileHandle handle(LoggingOpenFileForRead(path)); + auto reader = std::make_unique<WeakFileHandleFileReader>(handle.get()); + + // In the event a crash is introduced by this intermediate dump, don't ever + // read a file twice. To ensure this doesn't happen, immediately unlink. + LoggingRemoveFile(path); + + // Don't initialize invalid or empty files. + FileOffset size = LoggingFileSizeByHandle(handle.get()); + if (!handle.is_valid() || size == 0) { + return false; + } + + if (!Parse(reader.get(), size)) { + LOG(ERROR) << "Intermediate dump parsing failed"; + } + + return true; +} + +bool IOSIntermediateDumpReader::Parse(FileReaderInterface* reader, + FileOffset file_size) { + std::stack<IOSIntermediateDumpObject*> stack; + stack.push(&minidump_); + using Command = IOSIntermediateDumpWriter::CommandType; + using Type = IOSIntermediateDumpObject::Type; + + Command command; + if (!reader->ReadExactly(&command, sizeof(Command)) || + command != Command::kRootMapStart) { + LOG(ERROR) << "Unexpected start to root map."; + return false; + } + + while (reader->ReadExactly(&command, sizeof(Command))) { + IOSIntermediateDumpObject* parent = stack.top(); + switch (command) { + case Command::kMapStart: { + std::unique_ptr<IOSIntermediateDumpMap> new_map( + new IOSIntermediateDumpMap()); + if (parent->GetType() == Type::kMap) { + const auto parent_map = static_cast<IOSIntermediateDumpMap*>(parent); + stack.push(new_map.get()); + IntermediateDumpKey key; + if (!reader->ReadExactly(&key, sizeof(key))) + return false; + if (key == IntermediateDumpKey::kInvalid) + return false; + parent_map->map_[key] = std::move(new_map); + } else if (parent->GetType() == Type::kList) { + const auto parent_list = + static_cast<IOSIntermediateDumpList*>(parent); + stack.push(new_map.get()); + parent_list->push_back(std::move(new_map)); + } else { + LOG(ERROR) << "Unexpected parent (not a map or list)."; + return false; + } + break; + } + case Command::kArrayStart: { + auto new_list = std::make_unique<IOSIntermediateDumpList>(); + if (parent->GetType() != Type::kMap) { + LOG(ERROR) << "Attempting to push an array not in a map."; + return false; + } + + IntermediateDumpKey key; + if (!reader->ReadExactly(&key, sizeof(key))) + return false; + if (key == IntermediateDumpKey::kInvalid) + return false; + + auto parent_map = static_cast<IOSIntermediateDumpMap*>(parent); + stack.push(new_list.get()); + parent_map->map_[key] = std::move(new_list); + break; + } + case Command::kMapEnd: + if (stack.size() < 2) { + LOG(ERROR) << "Attempting to pop off main map."; + return false; + } + + if (parent->GetType() != Type::kMap) { + LOG(ERROR) << "Unexpected map end not in a map."; + return false; + } + stack.pop(); + break; + case Command::kArrayEnd: + if (stack.size() < 2) { + LOG(ERROR) << "Attempting to pop off main map."; + return false; + } + if (parent->GetType() != Type::kList) { + LOG(ERROR) << "Unexpected list end not in a list."; + return false; + } + stack.pop(); + break; + case Command::kProperty: { + if (parent->GetType() != Type::kMap) { + LOG(ERROR) << "Attempting to add a property not in a map."; + return false; + } + IntermediateDumpKey key; + if (!reader->ReadExactly(&key, sizeof(key))) + return false; + if (key == IntermediateDumpKey::kInvalid) + return false; + + off_t value_length; + if (!reader->ReadExactly(&value_length, sizeof(value_length))) { + return false; + } + + constexpr int kMaximumPropertyLength = 64 * 1024 * 1024; // 64MB. + if (value_length > kMaximumPropertyLength) { + LOG(ERROR) << "Attempting to read a property that's too big: " + << value_length; + return false; + } + + std::vector<uint8_t> data(value_length); + if (!reader->ReadExactly(data.data(), value_length)) { + return false; + } + auto parent_map = static_cast<IOSIntermediateDumpMap*>(parent); + if (parent_map->map_.find(key) != parent_map->map_.end()) { + LOG(ERROR) << "Inserting duplicate key"; + } + parent_map->map_[key] = + std::make_unique<IOSIntermediateDumpData>(std::move(data)); + break; + } + case Command::kRootMapEnd: { + if (stack.size() != 1) { + LOG(ERROR) << "Unexpected end of root map."; + return false; + } + + if (reader->Seek(0, SEEK_CUR) != file_size) { + LOG(ERROR) << "Root map ended before end of file."; + return false; + } + return true; + } + default: + LOG(ERROR) << "Failed to parse serialized intermediate minidump."; + return false; + } + } + + LOG(ERROR) << "Unexpected end of root map."; + return false; +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader.h new file mode 100644 index 0000000..2966e7c --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader.h
@@ -0,0 +1,58 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_READER_H_ +#define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_READER_H_ + +#include "base/files/file_path.h" +#include "base/macros.h" +#include "util/file/file_reader.h" +#include "util/ios/ios_intermediate_dump_map.h" + +namespace crashpad { +namespace internal { + +//! \brief Open and parse iOS intermediate dumps. +class IOSIntermediateDumpReader { + public: + IOSIntermediateDumpReader() {} + + //! \brief Open and parses \a path, ignoring empty files. + //! + //! Will attempt to parse the binary file, similar to a JSON file, using the + //! same format used by IOSIntermediateDumpWriter, resulting in an + //! IOSIntermediateDumpMap + //! + //! \param[in] path The intermediate dump to read. + //! + //! \return On success, returns `true`, otherwise returns `false`. Clients may + //! still attempt to parse RootMap, as partial minidumps may still be + //! usable. + bool Initialize(const base::FilePath& path); + + //! \brief Returns an IOSIntermediateDumpMap corresponding to the root of the + //! intermediate dump. + const IOSIntermediateDumpMap* RootMap() { return &minidump_; } + + private: + bool Parse(FileReaderInterface* reader, FileOffset file_size); + IOSIntermediateDumpMap minidump_; + + DISALLOW_COPY_AND_ASSIGN(IOSIntermediateDumpReader); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_READER_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader_test.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader_test.cc new file mode 100644 index 0000000..ae27f7d8 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_reader_test.cc
@@ -0,0 +1,238 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_reader.h" + +#include <fcntl.h> +#include <mach/vm_map.h> + +#include "base/posix/eintr_wrapper.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "test/errors.h" +#include "test/scoped_temp_dir.h" +#include "util/file/filesystem.h" +#include "util/ios/ios_intermediate_dump_data.h" +#include "util/ios/ios_intermediate_dump_format.h" +#include "util/ios/ios_intermediate_dump_list.h" +#include "util/ios/ios_intermediate_dump_writer.h" + +namespace crashpad { +namespace test { +namespace { + +using Key = internal::IntermediateDumpKey; +using internal::IOSIntermediateDumpWriter; + +class IOSIntermediateDumpReaderTest : public testing::Test { + protected: + // testing::Test: + + void SetUp() override { + path_ = temp_dir_.path().Append("dump_file"); + fd_ = base::ScopedFD(HANDLE_EINTR( + ::open(path_.value().c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644))); + ASSERT_GE(fd_.get(), 0) << ErrnoMessage("open"); + + writer_ = std::make_unique<IOSIntermediateDumpWriter>(); + ASSERT_TRUE(writer_->Open(path_)); + ASSERT_TRUE(IsRegularFile(path_)); + } + + void TearDown() override { + fd_.reset(); + writer_.reset(); + EXPECT_FALSE(IsRegularFile(path_)); + } + + int fd() { return fd_.get(); } + + const base::FilePath& path() const { return path_; } + + std::unique_ptr<IOSIntermediateDumpWriter> writer_; + + private: + base::ScopedFD fd_; + ScopedTempDir temp_dir_; + base::FilePath path_; +}; + +TEST_F(IOSIntermediateDumpReaderTest, ReadNoFile) { + internal::IOSIntermediateDumpReader reader; + EXPECT_FALSE(reader.Initialize(base::FilePath())); + EXPECT_TRUE(LoggingRemoveFile(path())); + EXPECT_FALSE(IsRegularFile(path())); +} + +TEST_F(IOSIntermediateDumpReaderTest, ReadEmptyFile) { + internal::IOSIntermediateDumpReader reader; + EXPECT_FALSE(reader.Initialize(path())); + EXPECT_FALSE(IsRegularFile(path())); + + const auto root_map = reader.RootMap(); + EXPECT_TRUE(root_map->empty()); +} + +TEST_F(IOSIntermediateDumpReaderTest, ReadHelloWorld) { + std::string hello_world("hello world."); + EXPECT_TRUE( + LoggingWriteFile(fd(), hello_world.c_str(), hello_world.length())); + internal::IOSIntermediateDumpReader reader; + EXPECT_TRUE(reader.Initialize(path())); + EXPECT_FALSE(IsRegularFile(path())); + + const auto root_map = reader.RootMap(); + EXPECT_TRUE(root_map->empty()); +} + +TEST_F(IOSIntermediateDumpReaderTest, WriteBadPropertyDataLength) { + internal::IOSIntermediateDumpReader reader; + IOSIntermediateDumpWriter::CommandType command_type = + IOSIntermediateDumpWriter::CommandType::kRootMapStart; + EXPECT_TRUE(LoggingWriteFile(fd(), &command_type, sizeof(command_type))); + + command_type = IOSIntermediateDumpWriter::CommandType::kProperty; + EXPECT_TRUE(LoggingWriteFile(fd(), &command_type, sizeof(command_type))); + Key key = Key::kVersion; + EXPECT_TRUE(LoggingWriteFile(fd(), &key, sizeof(key))); + uint8_t value = 1; + size_t value_length = 999999; + EXPECT_TRUE(LoggingWriteFile(fd(), &value_length, sizeof(size_t))); + EXPECT_TRUE(LoggingWriteFile(fd(), &value, sizeof(value))); + EXPECT_TRUE(reader.Initialize(path())); + EXPECT_FALSE(IsRegularFile(path())); + + const auto root_map = reader.RootMap(); + EXPECT_TRUE(root_map->empty()); + const auto version_data = root_map->GetAsData(Key::kVersion); + EXPECT_EQ(version_data, nullptr); +} + +TEST_F(IOSIntermediateDumpReaderTest, InvalidArrayInArray) { + internal::IOSIntermediateDumpReader reader; + { + IOSIntermediateDumpWriter::ScopedRootMap scopedRoot(writer_.get()); + IOSIntermediateDumpWriter::ScopedArray threadArray(writer_.get(), + Key::kThreads); + IOSIntermediateDumpWriter::ScopedArray innerThreadArray(writer_.get(), + Key::kModules); + + // Write version last, so it's not parsed. + int8_t version = 1; + writer_->AddProperty(Key::kVersion, &version); + } + EXPECT_TRUE(writer_->Close()); + EXPECT_TRUE(reader.Initialize(path())); + EXPECT_FALSE(IsRegularFile(path())); + + const auto root_map = reader.RootMap(); + EXPECT_FALSE(root_map->empty()); + const auto version_data = root_map->GetAsData(Key::kVersion); + EXPECT_EQ(version_data, nullptr); +} + +TEST_F(IOSIntermediateDumpReaderTest, InvalidPropertyInArray) { + internal::IOSIntermediateDumpReader reader; + + { + IOSIntermediateDumpWriter::ScopedRootMap scopedRoot(writer_.get()); + IOSIntermediateDumpWriter::ScopedArray threadArray(writer_.get(), + Key::kThreads); + + // Write version last, so it's not parsed. + int8_t version = 1; + writer_->AddProperty(Key::kVersion, &version); + } + EXPECT_TRUE(writer_->Close()); + EXPECT_TRUE(reader.Initialize(path())); + EXPECT_FALSE(IsRegularFile(path())); + + const auto root_map = reader.RootMap(); + EXPECT_FALSE(root_map->empty()); + const auto version_data = root_map->GetAsData(Key::kVersion); + EXPECT_EQ(version_data, nullptr); +} + +TEST_F(IOSIntermediateDumpReaderTest, ReadValidData) { + internal::IOSIntermediateDumpReader reader; + uint8_t version = 1; + { + IOSIntermediateDumpWriter::ScopedRootMap scopedRoot(writer_.get()); + EXPECT_TRUE(writer_->AddProperty(Key::kVersion, &version)); + { + IOSIntermediateDumpWriter::ScopedArray threadArray( + writer_.get(), Key::kThreadContextMemoryRegions); + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer_.get()); + + std::string random_data("random_data"); + EXPECT_TRUE(writer_->AddProperty(Key::kThreadContextMemoryRegionAddress, + &version)); + EXPECT_TRUE(writer_->AddProperty(Key::kThreadContextMemoryRegionData, + random_data.c_str(), + random_data.length())); + } + + { + IOSIntermediateDumpWriter::ScopedMap map(writer_.get(), + Key::kProcessInfo); + pid_t p_pid = getpid(); + EXPECT_TRUE(writer_->AddProperty(Key::kPID, &p_pid)); + } + } + + EXPECT_TRUE(writer_->Close()); + EXPECT_TRUE(reader.Initialize(path())); + EXPECT_FALSE(IsRegularFile(path())); + + auto root_map = reader.RootMap(); + EXPECT_FALSE(root_map->empty()); + version = -1; + const auto version_data = root_map->GetAsData(Key::kVersion); + ASSERT_NE(version_data, nullptr); + EXPECT_TRUE(version_data->GetValue<uint8_t>(&version)); + EXPECT_EQ(version, 1); + + const auto process_info = root_map->GetAsMap(Key::kProcessInfo); + ASSERT_NE(process_info, nullptr); + const auto pid_data = process_info->GetAsData(Key::kPID); + ASSERT_NE(pid_data, nullptr); + pid_t p_pid = -1; + EXPECT_TRUE(pid_data->GetValue<pid_t>(&p_pid)); + ASSERT_EQ(p_pid, getpid()); + + const auto thread_context_memory_regions = + root_map->GetAsList(Key::kThreadContextMemoryRegions); + EXPECT_EQ(thread_context_memory_regions->size(), 1UL); + for (const auto& region : *thread_context_memory_regions) { + const auto data = region->GetAsData(Key::kThreadContextMemoryRegionData); + ASSERT_NE(data, nullptr); + // Load as string. + EXPECT_EQ(data->GetString(), "random_data"); + + // Load as bytes. + auto bytes = data->bytes(); + vm_size_t data_size = bytes.size(); + EXPECT_EQ(data_size, 11UL); + + const char* data_bytes = reinterpret_cast<const char*>(bytes.data()); + EXPECT_EQ(std::string(data_bytes, data_size), "random_data"); + } + + const auto system_info = root_map->GetAsMap(Key::kSystemInfo); + EXPECT_EQ(system_info, nullptr); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc new file mode 100644 index 0000000..eca33d380 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.cc
@@ -0,0 +1,137 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_writer.h" + +#include <fcntl.h> +#include <unistd.h> + +#include "base/posix/eintr_wrapper.h" +#include "build/build_config.h" +#include "util/ios/raw_logging.h" +#include "util/ios/scoped_vm_read.h" + +namespace crashpad { +namespace internal { + +// Similar to LoggingWriteFile but with CRASHPAD_RAW_LOG. +bool RawLoggingWriteFile(int fd, const void* buffer, size_t size) { + uintptr_t buffer_int = reinterpret_cast<uintptr_t>(buffer); + while (size > 0) { + ssize_t bytes_written = HANDLE_EINTR( + write(fd, reinterpret_cast<const char*>(buffer_int), size)); + if (bytes_written < 0 || bytes_written == 0) { + CRASHPAD_RAW_LOG_ERROR(bytes_written, "RawLoggingWriteFile"); + return false; + } + buffer_int += bytes_written; + size -= bytes_written; + } + return true; +} + +// Similar to LoggingCloseFile but with CRASHPAD_RAW_LOG. +bool RawLoggingCloseFile(int fd) { + int rv = IGNORE_EINTR(close(fd)); + if (rv != 0) { + CRASHPAD_RAW_LOG_ERROR(rv, "RawLoggingCloseFile"); + } + return rv == 0; +} + +// Similar to LoggingLockFile but with CRASHPAD_RAW_LOG. +bool RawLoggingLockFileExclusiveNonBlocking(int fd) { + int rv = HANDLE_EINTR(flock(fd, LOCK_EX | LOCK_NB)); + if (rv != 0) { + CRASHPAD_RAW_LOG_ERROR(rv, "RawLoggingLockFileExclusiveNonBlocking"); + } + return rv == 0; +} + +bool IOSIntermediateDumpWriter::Open(const base::FilePath& path) { + // Set data protection class D (No protection). A file with this type of + // protection can be read from or written to at any time. + // See: + // https://support.apple.com/guide/security/data-protection-classes-secb010e978a/web + constexpr int PROTECTION_CLASS_D = 4; + fd_ = HANDLE_EINTR(open_dprotected_np(path.value().c_str(), + O_WRONLY | O_CREAT | O_TRUNC, + PROTECTION_CLASS_D, + 0 /* dpflags */, + 0644 /* mode */)); + if (fd_ < 0) { + CRASHPAD_RAW_LOG_ERROR(fd_, "open intermediate dump"); + CRASHPAD_RAW_LOG(path.value().c_str()); + return false; + } + + return RawLoggingLockFileExclusiveNonBlocking(fd_); +} + +bool IOSIntermediateDumpWriter::Close() { + return RawLoggingCloseFile(fd_); +} + +bool IOSIntermediateDumpWriter::ArrayMapStart() { + const CommandType command_type = CommandType::kMapStart; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); +} + +bool IOSIntermediateDumpWriter::MapStart(IntermediateDumpKey key) { + const CommandType command_type = CommandType::kMapStart; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)) && + RawLoggingWriteFile(fd_, &key, sizeof(key)); +} + +bool IOSIntermediateDumpWriter::ArrayStart(IntermediateDumpKey key) { + const CommandType command_type = CommandType::kArrayStart; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)) && + RawLoggingWriteFile(fd_, &key, sizeof(key)); +} + +bool IOSIntermediateDumpWriter::MapEnd() { + const CommandType command_type = CommandType::kMapEnd; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); +} + +bool IOSIntermediateDumpWriter::ArrayEnd() { + const CommandType command_type = CommandType::kArrayEnd; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); +} + +bool IOSIntermediateDumpWriter::RootMapStart() { + const CommandType command_type = CommandType::kRootMapStart; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); +} + +bool IOSIntermediateDumpWriter::RootMapEnd() { + const CommandType command_type = CommandType::kRootMapEnd; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)); +} + +bool IOSIntermediateDumpWriter::AddPropertyInternal(IntermediateDumpKey key, + const char* value, + size_t value_length) { + ScopedVMRead<char> vmread; + if (!vmread.Read(value, value_length)) + return false; + const CommandType command_type = CommandType::kProperty; + return RawLoggingWriteFile(fd_, &command_type, sizeof(command_type)) && + RawLoggingWriteFile(fd_, &key, sizeof(key)) && + RawLoggingWriteFile(fd_, &value_length, sizeof(size_t)) && + RawLoggingWriteFile(fd_, vmread.get(), value_length); +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h new file mode 100644 index 0000000..0f8b1b7d --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer.h
@@ -0,0 +1,197 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#ifndef CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_WRITER_H_ +#define CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_WRITER_H_ + +#include "base/files/file_path.h" +#include "base/macros.h" +#include "util/ios/ios_intermediate_dump_format.h" + +namespace crashpad { +namespace internal { + +//! \brief Wrapper class for writing intermediate dump file. +//! +//! Due to the limitations of in-process handling, an intermediate dump file is +//! written during exceptions. The data is streamed to a file using only +//! in-process safe methods. +//! +//! The file format is similar to binary JSON, supporting keyed properties, maps +//! and arrays. +//! - Property [key:int, length:int, value:intarray] +//! - StartMap [key:int], followed by repeating Properties until EndMap +//! - StartArray [key:int], followed by repeating Maps until EndArray +//! - EndMap, EndArray, EndDocument +//! +//! Similar to JSON, maps can contain other maps, arrays and properties. +//! +//! Note: All methods are `RUNS-DURING-CRASH`. +class IOSIntermediateDumpWriter final { + public: + IOSIntermediateDumpWriter() = default; + + //! \brief Command instructions for the intermediate dump reader. + enum class CommandType : uint8_t { + //! \brief Indicates a new map, followed by associated key. + kMapStart = 0x01, + + //! \brief Indicates map is complete. + kMapEnd = 0x02, + + //! \brief Indicates a new array, followed by associated key. + kArrayStart = 0x03, + + //! \brief Indicates array is complete. + kArrayEnd = 0x04, + + //! \brief Indicates a new property, followed by a key, length and value. + kProperty = 0x05, + + //! \brief Indicates the start of the root map. + kRootMapStart = 0x06, + + //! \brief Indicates the end of the root map, and that there is nothing left + //! to parse. + kRootMapEnd = 0x07, + }; + + //! \brief Open and lock an intermediate dump file. This is the only method + //! in the writer class that is generally run outside of a crash. + //! + //! \param[in] path The path to the intermediate dump. + //! + //! \return On success, returns `true`, otherwise returns `false`. + bool Open(const base::FilePath& path); + + //! \brief Completes writing the intermediate dump file and releases the + //! file handle. + //! + //! \return On success, returns `true`, otherwise returns `false`. + bool Close(); + + //! \brief A scoped wrapper for calls to RootMapStart and RootMapEnd. + class ScopedRootMap { + public: + explicit ScopedRootMap(IOSIntermediateDumpWriter* writer) + : writer_(writer) { + writer->RootMapStart(); + } + ~ScopedRootMap() { writer_->RootMapEnd(); } + + private: + IOSIntermediateDumpWriter* writer_; + DISALLOW_COPY_AND_ASSIGN(ScopedRootMap); + }; + + //! \brief A scoped wrapper for calls to MapStart and MapEnd. + class ScopedMap { + public: + explicit ScopedMap(IOSIntermediateDumpWriter* writer, + IntermediateDumpKey key) + : writer_(writer) { + writer->MapStart(key); + } + ~ScopedMap() { writer_->MapEnd(); } + + private: + IOSIntermediateDumpWriter* writer_; + DISALLOW_COPY_AND_ASSIGN(ScopedMap); + }; + + //! \brief A scoped wrapper for calls to ArrayMapStart and MapEnd. + class ScopedArrayMap { + public: + explicit ScopedArrayMap(IOSIntermediateDumpWriter* writer) + : writer_(writer) { + writer->ArrayMapStart(); + } + ~ScopedArrayMap() { writer_->MapEnd(); } + + private: + IOSIntermediateDumpWriter* writer_; + DISALLOW_COPY_AND_ASSIGN(ScopedArrayMap); + }; + + //! \brief A scoped wrapper for calls to ArrayStart and ArrayEnd. + class ScopedArray { + public: + explicit ScopedArray(IOSIntermediateDumpWriter* writer, + IntermediateDumpKey key) + : writer_(writer) { + writer->ArrayStart(key); + } + ~ScopedArray() { writer_->ArrayEnd(); } + + private: + IOSIntermediateDumpWriter* writer_; + DISALLOW_COPY_AND_ASSIGN(ScopedArray); + }; + + //! \return The `true` if able to AddPropertyInternal the \a key \a value + //! \a count tuple. + template <typename T> + bool AddProperty(IntermediateDumpKey key, const T* value, size_t count = 1) { + return AddPropertyInternal( + key, reinterpret_cast<const char*>(value), count * sizeof(T)); + } + + //! \return The `true` if able to AddPropertyInternal the \a key \a value + //! \a count tuple. + bool AddPropertyBytes(IntermediateDumpKey key, + const void* value, + size_t value_length) { + return AddPropertyInternal( + key, reinterpret_cast<const char*>(value), value_length); + } + + private: + //! \return Returns `true` if able to write a kProperty command with the + //! \a key \a value \a count tuple. + bool AddPropertyInternal(IntermediateDumpKey key, + const char* value, + size_t value_length); + + //! \return Returns `true` if able to write a kArrayStart command with the + //! \a key. + bool ArrayStart(IntermediateDumpKey key); + + //! \return Returns `true` if able to write a kMapStart command with the + //! \a key. + bool MapStart(IntermediateDumpKey key); + + //! \return Returns `true` if able to write a kMapStart command. + bool ArrayMapStart(); + + //! \return Returns `true` if able to write a kArrayEnd command. + bool ArrayEnd(); + + //! \return Returns `true` if able to write a kMapEnd command. + bool MapEnd(); + + //! \return Returns `true` if able to write a kRootMapStart command. + bool RootMapStart(); + + //! \return Returns `true` if able to write a kRootMapEnd command. + bool RootMapEnd(); + + int fd_; + + DISALLOW_COPY_AND_ASSIGN(IOSIntermediateDumpWriter); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_INTERMEDIATE_DUMP_WRITER_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc new file mode 100644 index 0000000..6c6bcad --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_intermediate_dump_writer_test.cc
@@ -0,0 +1,131 @@ +// Copyright 2021 The Crashpad Authors. 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. +// 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. + +#include "util/ios/ios_intermediate_dump_writer.h" + +#include <fcntl.h> + +#include "base/files/scoped_file.h" +#include "base/posix/eintr_wrapper.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "test/errors.h" +#include "test/scoped_temp_dir.h" +#include "util/file/file_io.h" + +namespace crashpad { +namespace test { +namespace { + +using Key = internal::IntermediateDumpKey; +using internal::IOSIntermediateDumpWriter; + +class IOSIntermediateDumpWriterTest : public testing::Test { + protected: + // testing::Test: + + void SetUp() override { + path_ = temp_dir_.path().Append("dump_file"); + writer_ = std::make_unique<IOSIntermediateDumpWriter>(); + } + + void TearDown() override { + writer_.reset(); + EXPECT_EQ(unlink(path_.value().c_str()), 0) << ErrnoMessage("unlink"); + } + + const base::FilePath& path() const { return path_; } + + std::unique_ptr<IOSIntermediateDumpWriter> writer_; + + private: + ScopedTempDir temp_dir_; + base::FilePath path_; +}; + +// Test file is locked. +TEST_F(IOSIntermediateDumpWriterTest, OpenLocked) { + EXPECT_TRUE(writer_->Open(path())); + + ScopedFileHandle handle(LoggingOpenFileForRead(path())); + EXPECT_TRUE(handle.is_valid()); + EXPECT_EQ(LoggingLockFile(handle.get(), + FileLocking::kExclusive, + FileLockingBlocking::kNonBlocking), + FileLockingResult::kWouldBlock); +} + +TEST_F(IOSIntermediateDumpWriterTest, Close) { + EXPECT_TRUE(writer_->Open(path())); + EXPECT_TRUE(writer_->Close()); + + std::string contents; + ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); + ASSERT_EQ(contents, ""); +} + +TEST_F(IOSIntermediateDumpWriterTest, ScopedArray) { + EXPECT_TRUE(writer_->Open(path())); + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer_.get()); + IOSIntermediateDumpWriter::ScopedArray threadArray(writer_.get(), + Key::kThreads); + IOSIntermediateDumpWriter::ScopedArrayMap threadMap(writer_.get()); + } + std::string contents; + ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); + std::string result("\6\x3p\x17\1\2\4\a", 8); + ASSERT_EQ(contents, result); +} + +TEST_F(IOSIntermediateDumpWriterTest, ScopedMap) { + EXPECT_TRUE(writer_->Open(path())); + { + IOSIntermediateDumpWriter::ScopedRootMap rootMap(writer_.get()); + IOSIntermediateDumpWriter::ScopedMap map(writer_.get(), + Key::kMachException); + } + + std::string contents; + ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); + std::string result("\6\1\xe8\3\2\a", 6); + ASSERT_EQ(contents, result); +} + +TEST_F(IOSIntermediateDumpWriterTest, Property) { + EXPECT_TRUE(writer_->Open(path())); + EXPECT_TRUE(writer_->AddProperty(Key::kVersion, "version", 7)); + + std::string contents; + ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); + std::string result("\5\1\0\a\0\0\0\0\0\0\0version", 18); + ASSERT_EQ(contents, result); +} + +TEST_F(IOSIntermediateDumpWriterTest, BadProperty) { + EXPECT_TRUE(writer_->Open(path())); + ASSERT_FALSE(writer_->AddProperty(Key::kVersion, "version", -1)); + + std::string contents; + ASSERT_TRUE(LoggingReadEntireFile(path(), &contents)); + + // path() is now invalid, as type, key and value were written, but the + // value itself is not. + std::string results("\5\1\0\xff\xff\xff\xff\xff\xff\xff\xff", 11); + ASSERT_EQ(contents, results); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/raw_logging.h b/third_party/crashpad/crashpad/util/ios/raw_logging.h index 505aa671..60752817 100644 --- a/third_party/crashpad/crashpad/util/ios/raw_logging.h +++ b/third_party/crashpad/crashpad/util/ios/raw_logging.h
@@ -28,10 +28,10 @@ } // namespace internal } // namespace crashpad -#define RAW_LOG(message) \ +#define CRASHPAD_RAW_LOG(message) \ ::crashpad::internal::RawLog(__FILE__, __LINE__, message, 0) -#define RAW_LOG_ERROR(error, message) \ +#define CRASHPAD_RAW_LOG_ERROR(error, message) \ ::crashpad::internal::RawLog(__FILE__, __LINE__, message, error) #endif // CRASHPAD_UTIL_IOS_EXCEPTION_LOGGING_H_
diff --git a/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc b/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc index 33c2ad0..3bbc596 100644 --- a/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc +++ b/third_party/crashpad/crashpad/util/ios/scoped_vm_read.cc
@@ -27,7 +27,7 @@ kern_return_t kr = vm_deallocate(mach_task_self(), vm_read_data_, vm_read_data_count_); if (kr != KERN_SUCCESS) - RAW_LOG_ERROR(kr, "vm_deallocate"); + CRASHPAD_RAW_LOG_ERROR(kr, "vm_deallocate"); } } @@ -36,7 +36,7 @@ kern_return_t kr = vm_deallocate(mach_task_self(), vm_read_data_, vm_read_data_count_); if (kr != KERN_SUCCESS) - RAW_LOG_ERROR(kr, "vm_deallocate"); + CRASHPAD_RAW_LOG_ERROR(kr, "vm_deallocate"); data_ = 0; } vm_address_t data_address = reinterpret_cast<vm_address_t>(data); @@ -53,7 +53,7 @@ data_ = vm_read_data_ + (data_address - page_region_address); return true; } else { - RAW_LOG_ERROR(kr, "vm_read"); + CRASHPAD_RAW_LOG_ERROR(kr, "vm_read"); return false; } }
diff --git a/third_party/crashpad/crashpad/util/linux/proc_stat_reader.cc b/third_party/crashpad/crashpad/util/linux/proc_stat_reader.cc index dd663d6c..878103d 100644 --- a/third_party/crashpad/crashpad/util/linux/proc_stat_reader.cc +++ b/third_party/crashpad/crashpad/util/linux/proc_stat_reader.cc
@@ -18,9 +18,9 @@ #include <time.h> #include <unistd.h> +#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/logging.h" -#include "base/stl_util.h" #include "util/file/file_io.h" #include "util/misc/lexing.h" #include "util/misc/time.h"
diff --git a/third_party/crashpad/crashpad/util/linux/proc_task_reader.cc b/third_party/crashpad/crashpad/util/linux/proc_task_reader.cc index 360f83a..ca62db2 100644 --- a/third_party/crashpad/crashpad/util/linux/proc_task_reader.cc +++ b/third_party/crashpad/crashpad/util/linux/proc_task_reader.cc
@@ -16,9 +16,9 @@ #include <stdio.h> +#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "util/file/directory_reader.h" #include "util/misc/as_underlying_type.h"
diff --git a/third_party/crashpad/crashpad/util/linux/ptrace_client.cc b/third_party/crashpad/crashpad/util/linux/ptrace_client.cc index 43214a1..0e9c821 100644 --- a/third_party/crashpad/crashpad/util/linux/ptrace_client.cc +++ b/third_party/crashpad/crashpad/util/linux/ptrace_client.cc
@@ -20,8 +20,8 @@ #include <string> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "util/file/file_io.h" #include "util/linux/ptrace_broker.h"
diff --git a/third_party/crashpad/crashpad/util/mac/checked_mach_address_range_test.cc b/third_party/crashpad/crashpad/util/mac/checked_mach_address_range_test.cc index 8531379..4ef26fd 100644 --- a/third_party/crashpad/crashpad/util/mac/checked_mach_address_range_test.cc +++ b/third_party/crashpad/crashpad/util/mac/checked_mach_address_range_test.cc
@@ -19,7 +19,7 @@ #include <limits> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/mac/launchd.mm b/third_party/crashpad/crashpad/util/mac/launchd.mm index ef5a606..37748ee 100644 --- a/third_party/crashpad/crashpad/util/mac/launchd.mm +++ b/third_party/crashpad/crashpad/util/mac/launchd.mm
@@ -45,7 +45,7 @@ } CFPropertyListRef value_cf = - implicit_cast<CFPropertyListRef>([dictionary_ns objectForKey:key]); + implicit_cast<CFPropertyListRef>(dictionary_ns[key]); launch_data_t value_launch = CFPropertyToLaunchData(value_cf); if (!value_launch) { return nullptr;
diff --git a/third_party/crashpad/crashpad/util/mac/launchd_test.mm b/third_party/crashpad/crashpad/util/mac/launchd_test.mm index b793a9b..2e49ee6 100644 --- a/third_party/crashpad/crashpad/util/mac/launchd_test.mm +++ b/third_party/crashpad/crashpad/util/mac/launchd_test.mm
@@ -22,8 +22,8 @@ #include <cmath> #include <limits> +#include "base/cxx17_backports.h" #include "base/mac/scoped_launch_data.h" -#include "base/stl_util.h" #include "gtest/gtest.h" #include "util/stdlib/objc.h" @@ -78,14 +78,14 @@ @0.0, @1.0, @-1.0, - [NSNumber numberWithFloat:std::numeric_limits<float>::min()], - [NSNumber numberWithFloat:std::numeric_limits<float>::max()], - [NSNumber numberWithDouble:std::numeric_limits<double>::min()], - [NSNumber numberWithDouble:std::numeric_limits<double>::max()], + @(std::numeric_limits<float>::min()), + @(std::numeric_limits<float>::max()), + @(std::numeric_limits<double>::min()), + @(std::numeric_limits<double>::max()), @3.1415926535897932, - [NSNumber numberWithDouble:std::numeric_limits<double>::infinity()], - [NSNumber numberWithDouble:std::numeric_limits<double>::quiet_NaN()], - [NSNumber numberWithDouble:std::numeric_limits<double>::signaling_NaN()], + @(std::numeric_limits<double>::infinity()), + @(std::numeric_limits<double>::quiet_NaN()), + @(std::numeric_limits<double>::signaling_NaN()), }; for (size_t index = 0; index < base::size(double_nses); ++index) {
diff --git a/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc b/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc index 601a58f..433cb052 100644 --- a/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc +++ b/third_party/crashpad/crashpad/util/mach/child_port_handshake.cc
@@ -27,13 +27,13 @@ #include <utility> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/mac/mach_logging.h" #include "base/mac/scoped_mach_port.h" #include "base/notreached.h" #include "base/posix/eintr_wrapper.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "util/file/file_io.h" #include "util/mach/bootstrap.h"
diff --git a/third_party/crashpad/crashpad/util/mach/child_port_server.cc b/third_party/crashpad/crashpad/util/mach/child_port_server.cc index ce425a8..927342942 100644 --- a/third_party/crashpad/crashpad/util/mach/child_port_server.cc +++ b/third_party/crashpad/crashpad/util/mach/child_port_server.cc
@@ -14,7 +14,7 @@ #include "util/mach/child_port_server.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "util/mach/child_portServer.h" #include "util/mach/mach_message.h"
diff --git a/third_party/crashpad/crashpad/util/mach/composite_mach_message_server_test.cc b/third_party/crashpad/crashpad/util/mach/composite_mach_message_server_test.cc index 87242be..af4a600 100644 --- a/third_party/crashpad/crashpad/util/mach/composite_mach_message_server_test.cc +++ b/third_party/crashpad/crashpad/util/mach/composite_mach_message_server_test.cc
@@ -16,7 +16,7 @@ #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "test/gtest_death.h"
diff --git a/third_party/crashpad/crashpad/util/mach/exc_client_variants_test.cc b/third_party/crashpad/crashpad/util/mach/exc_client_variants_test.cc index 007442ab..867eb08 100644 --- a/third_party/crashpad/crashpad/util/mach/exc_client_variants_test.cc +++ b/third_party/crashpad/crashpad/util/mach/exc_client_variants_test.cc
@@ -19,8 +19,8 @@ #include <string.h> #include <sys/types.h> +#include "base/cxx17_backports.h" #include "base/macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h"
diff --git a/third_party/crashpad/crashpad/util/mach/exc_server_variants.cc b/third_party/crashpad/crashpad/util/mach/exc_server_variants.cc index b4052ea..94070b1f 100644 --- a/third_party/crashpad/crashpad/util/mach/exc_server_variants.cc +++ b/third_party/crashpad/crashpad/util/mach/exc_server_variants.cc
@@ -20,7 +20,7 @@ #include <algorithm> #include <vector> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "build/build_config.h" #include "util/mac/mac_util.h" #include "util/mach/composite_mach_message_server.h"
diff --git a/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc b/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc index 38d977f..287551b 100644 --- a/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc +++ b/third_party/crashpad/crashpad/util/mach/exc_server_variants_test.cc
@@ -19,7 +19,7 @@ #include <string.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gmock/gmock.h"
diff --git a/third_party/crashpad/crashpad/util/mach/exception_behaviors_test.cc b/third_party/crashpad/crashpad/util/mach/exception_behaviors_test.cc index bdbf673..e6abd25 100644 --- a/third_party/crashpad/crashpad/util/mach/exception_behaviors_test.cc +++ b/third_party/crashpad/crashpad/util/mach/exception_behaviors_test.cc
@@ -16,7 +16,7 @@ #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "util/mach/mach_extensions.h"
diff --git a/third_party/crashpad/crashpad/util/mach/exception_types_test.cc b/third_party/crashpad/crashpad/util/mach/exception_types_test.cc index 9507c02..3e777ef2 100644 --- a/third_party/crashpad/crashpad/util/mach/exception_types_test.cc +++ b/third_party/crashpad/crashpad/util/mach/exception_types_test.cc
@@ -20,7 +20,7 @@ #include <sys/types.h> #include <unistd.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc b/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc index a7198da..4a744d9 100644 --- a/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc +++ b/third_party/crashpad/crashpad/util/mach/mach_message_server_test.cc
@@ -21,9 +21,9 @@ #include <set> +#include "base/cxx17_backports.h" #include "base/mac/scoped_mach_port.h" #include "base/macros.h" -#include "base/stl_util.h" #include "gtest/gtest.h" #include "test/mac/mach_errors.h" #include "test/mac/mach_multiprocess.h"
diff --git a/third_party/crashpad/crashpad/util/mach/notify_server.cc b/third_party/crashpad/crashpad/util/mach/notify_server.cc index df47327..e625419 100644 --- a/third_party/crashpad/crashpad/util/mach/notify_server.cc +++ b/third_party/crashpad/crashpad/util/mach/notify_server.cc
@@ -14,7 +14,7 @@ #include "util/mach/notify_server.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "util/mach/mach_message.h" #include "util/mach/notifyServer.h"
diff --git a/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach.cc b/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach.cc index 88a37b8b..47090086 100644 --- a/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach.cc +++ b/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach.cc
@@ -17,7 +17,7 @@ #include <string.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "util/mach/exception_behaviors.h" #include "util/mach/mach_extensions.h"
diff --git a/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach_test.cc b/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach_test.cc index e58a9c5..20c60a0 100644 --- a/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach_test.cc +++ b/third_party/crashpad/crashpad/util/mach/symbolic_constants_mach_test.cc
@@ -18,7 +18,7 @@ #include <string.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/misc/capture_context_test_util_win.cc b/third_party/crashpad/crashpad/util/misc/capture_context_test_util_win.cc index 16d81b72..d122195 100644 --- a/third_party/crashpad/crashpad/util/misc/capture_context_test_util_win.cc +++ b/third_party/crashpad/crashpad/util/misc/capture_context_test_util_win.cc
@@ -15,7 +15,7 @@ #include "util/misc/capture_context_test_util.h" #include "util/win/context_wrappers.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/misc/clock_test.cc b/third_party/crashpad/crashpad/util/misc/clock_test.cc index b1740b8c..443d496 100644 --- a/third_party/crashpad/crashpad/util/misc/clock_test.cc +++ b/third_party/crashpad/crashpad/util/misc/clock_test.cc
@@ -18,8 +18,8 @@ #include <algorithm> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/misc/metrics.cc b/third_party/crashpad/crashpad/util/misc/metrics.cc index 4b87f107..d45fad6 100644 --- a/third_party/crashpad/crashpad/util/misc/metrics.cc +++ b/third_party/crashpad/crashpad/util/misc/metrics.cc
@@ -110,4 +110,24 @@ "Crashpad.HandlerCrash.ExceptionCode." METRICS_OS_NAME, exception_code); } +#if defined(OS_IOS) +// static +void Metrics::MissingIntermediateDumpKey( + const internal::IntermediateDumpKey& key) { + UMA_HISTOGRAM_ENUMERATION("Crashpad.IntermediateDump.Reader.MissingKey", + key, + internal::IntermediateDumpKey::kMaxValue); +} + +// static +void Metrics::InvalidIntermediateDumpKeySize( + const internal::IntermediateDumpKey& key) { + UMA_HISTOGRAM_ENUMERATION("Crashpad.IntermediateDump.Reader.InvalidKeySize", + key, + internal::IntermediateDumpKey::kMaxValue); +} +#endif + +// static + } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/misc/metrics.h b/third_party/crashpad/crashpad/util/misc/metrics.h index d976381..292f23a0 100644 --- a/third_party/crashpad/crashpad/util/misc/metrics.h +++ b/third_party/crashpad/crashpad/util/misc/metrics.h
@@ -18,8 +18,13 @@ #include <inttypes.h> #include "base/macros.h" +#include "build/build_config.h" #include "util/file/file_io.h" +#if defined(OS_IOS) +#include "util/ios/ios_intermediate_dump_format.h" +#endif + namespace crashpad { //! \brief Container class to hold shared UMA metrics integration points. @@ -195,6 +200,16 @@ //! This is currently only reported on Windows. static void HandlerCrashed(uint32_t exception_code); +#if defined(OS_IOS) || DOXYGEN + //! \brief Records a missing key from an intermediate dump. + static void MissingIntermediateDumpKey( + const internal::IntermediateDumpKey& key); + + //! \brief Records a key with an invalid key size from an intermediate dump. + static void InvalidIntermediateDumpKeySize( + const internal::IntermediateDumpKey& key); +#endif + private: DISALLOW_IMPLICIT_CONSTRUCTORS(Metrics); };
diff --git a/third_party/crashpad/crashpad/util/misc/paths_win.cc b/third_party/crashpad/crashpad/util/misc/paths_win.cc index f05bdcf40..8510ccf 100644 --- a/third_party/crashpad/crashpad/util/misc/paths_win.cc +++ b/third_party/crashpad/crashpad/util/misc/paths_win.cc
@@ -16,8 +16,8 @@ #include <windows.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/misc/random_string_test.cc b/third_party/crashpad/crashpad/util/misc/random_string_test.cc index f5f0f325..fac830f 100644 --- a/third_party/crashpad/crashpad/util/misc/random_string_test.cc +++ b/third_party/crashpad/crashpad/util/misc/random_string_test.cc
@@ -18,7 +18,7 @@ #include <set> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/misc/uuid_test.cc b/third_party/crashpad/crashpad/util/misc/uuid_test.cc index ffa3c11..936e76b 100644 --- a/third_party/crashpad/crashpad/util/misc/uuid_test.cc +++ b/third_party/crashpad/crashpad/util/misc/uuid_test.cc
@@ -19,9 +19,9 @@ #include <string> +#include "base/cxx17_backports.h" #include "base/format_macros.h" #include "base/scoped_generic.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/net/http_transport_mac.mm b/third_party/crashpad/crashpad/util/net/http_transport_mac.mm index 8faa1b8..b9be11c 100644 --- a/third_party/crashpad/crashpad/util/net/http_transport_mac.mm +++ b/third_party/crashpad/crashpad/util/net/http_transport_mac.mm
@@ -52,13 +52,11 @@ // CFNetwork would use the main bundle’s CFBundleName, or the main // executable’s filename if none. - user_agent = AppendEscapedFormat( - user_agent, @"%@", [NSString stringWithUTF8String:PACKAGE_NAME]); + user_agent = AppendEscapedFormat(user_agent, @"%@", @PACKAGE_NAME); // CFNetwork would use the main bundle’s CFBundleVersion, or the string // “(unknown version)” if none. - user_agent = AppendEscapedFormat( - user_agent, @"/%@", [NSString stringWithUTF8String:PACKAGE_VERSION]); + user_agent = AppendEscapedFormat(user_agent, @"/%@", @PACKAGE_VERSION); // Expected to be CFNetwork. NSBundle* nsurl_bundle = [NSBundle bundleForClass:[NSURLRequest class]]; @@ -78,10 +76,8 @@ if (uname(&os) != 0) { PLOG(WARNING) << "uname"; } else { - user_agent = AppendEscapedFormat( - user_agent, @" %@", [NSString stringWithUTF8String:os.sysname]); - user_agent = AppendEscapedFormat( - user_agent, @"/%@", [NSString stringWithUTF8String:os.release]); + user_agent = AppendEscapedFormat(user_agent, @" %@", @(os.sysname)); + user_agent = AppendEscapedFormat(user_agent, @"/%@", @(os.release)); // CFNetwork just uses the equivalent of os.machine to obtain the native // (kernel) architecture. Here, give the process’ architecture as well as @@ -98,7 +94,7 @@ #endif user_agent = AppendEscapedFormat(user_agent, @" (%@", arch); - NSString* machine = [NSString stringWithUTF8String:os.machine]; + NSString* machine = @(os.machine); if (![machine isEqualToString:arch]) { user_agent = AppendEscapedFormat(user_agent, @"; %@", machine); }
diff --git a/third_party/crashpad/crashpad/util/net/http_transport_socket.cc b/third_party/crashpad/crashpad/util/net/http_transport_socket.cc index ba9c25d..c12702a 100644 --- a/third_party/crashpad/crashpad/util/net/http_transport_socket.cc +++ b/third_party/crashpad/crashpad/util/net/http_transport_socket.cc
@@ -20,12 +20,12 @@ #include <string.h> #include <sys/socket.h> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/macros.h" #include "base/numerics/safe_conversions.h" #include "base/posix/eintr_wrapper.h" #include "base/scoped_generic.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "util/file/file_io.h"
diff --git a/third_party/crashpad/crashpad/util/net/http_transport_win.cc b/third_party/crashpad/crashpad/util/net/http_transport_win.cc index 9618fbe..a91d2d2 100644 --- a/third_party/crashpad/crashpad/util/net/http_transport_win.cc +++ b/third_party/crashpad/crashpad/util/net/http_transport_win.cc
@@ -22,10 +22,10 @@ #include <wchar.h> #include <winhttp.h> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/scoped_generic.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h"
diff --git a/third_party/crashpad/crashpad/util/numeric/checked_address_range_test.cc b/third_party/crashpad/crashpad/util/numeric/checked_address_range_test.cc index 08bc551..aa700e0 100644 --- a/third_party/crashpad/crashpad/util/numeric/checked_address_range_test.cc +++ b/third_party/crashpad/crashpad/util/numeric/checked_address_range_test.cc
@@ -18,8 +18,8 @@ #include <limits> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/numeric/checked_range_test.cc b/third_party/crashpad/crashpad/util/numeric/checked_range_test.cc index 9d611e8..ad734ba34 100644 --- a/third_party/crashpad/crashpad/util/numeric/checked_range_test.cc +++ b/third_party/crashpad/crashpad/util/numeric/checked_range_test.cc
@@ -19,8 +19,8 @@ #include <limits> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/posix/close_multiple.cc b/third_party/crashpad/crashpad/util/posix/close_multiple.cc index a26ff94b..8d1543e1 100644 --- a/third_party/crashpad/crashpad/util/posix/close_multiple.cc +++ b/third_party/crashpad/crashpad/util/posix/close_multiple.cc
@@ -22,10 +22,10 @@ #include <algorithm> +#include "base/cxx17_backports.h" #include "base/files/scoped_file.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" -#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "build/build_config.h" #include "util/file/directory_reader.h"
diff --git a/third_party/crashpad/crashpad/util/posix/process_info_mac.cc b/third_party/crashpad/crashpad/util/posix/process_info_mac.cc index 672e427..47d0ff4a 100644 --- a/third_party/crashpad/crashpad/util/posix/process_info_mac.cc +++ b/third_party/crashpad/crashpad/util/posix/process_info_mac.cc
@@ -16,9 +16,9 @@ #include <string.h> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/mac/mach_logging.h" -#include "base/stl_util.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/posix/scoped_mmap_test.cc b/third_party/crashpad/crashpad/util/posix/scoped_mmap_test.cc index 9f6efdf8..6509b3a 100644 --- a/third_party/crashpad/crashpad/util/posix/scoped_mmap_test.cc +++ b/third_party/crashpad/crashpad/util/posix/scoped_mmap_test.cc
@@ -18,9 +18,9 @@ #include <sys/types.h> #include <unistd.h> +#include "base/cxx17_backports.h" #include "base/numerics/safe_conversions.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "test/gtest_death.h"
diff --git a/third_party/crashpad/crashpad/util/posix/signals.cc b/third_party/crashpad/crashpad/util/posix/signals.cc index 5ba66a3..b90e8f6 100644 --- a/third_party/crashpad/crashpad/util/posix/signals.cc +++ b/third_party/crashpad/crashpad/util/posix/signals.cc
@@ -19,8 +19,8 @@ #include <vector> #include "base/check_op.h" +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/posix/signals_test.cc b/third_party/crashpad/crashpad/util/posix/signals_test.cc index 54cc2f1..25295ff 100644 --- a/third_party/crashpad/crashpad/util/posix/signals_test.cc +++ b/third_party/crashpad/crashpad/util/posix/signals_test.cc
@@ -24,9 +24,9 @@ #include <limits> #include "base/compiler_specific.h" +#include "base/cxx17_backports.h" #include "base/files/scoped_file.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc b/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc index c6e0fec..671d963 100644 --- a/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc +++ b/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix.cc
@@ -18,7 +18,7 @@ #include <string.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "util/misc/implicit_cast.h"
diff --git a/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix_test.cc b/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix_test.cc index 74d5b545..61d75e28 100644 --- a/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix_test.cc +++ b/third_party/crashpad/crashpad/util/posix/symbolic_constants_posix_test.cc
@@ -17,7 +17,7 @@ #include <signal.h> #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "build/build_config.h"
diff --git a/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc b/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc index a46b4e7..a5c7afb0 100644 --- a/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc +++ b/third_party/crashpad/crashpad/util/process/process_memory_range_test.cc
@@ -16,7 +16,7 @@ #include <limits> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "test/process_type.h"
diff --git a/third_party/crashpad/crashpad/util/stdlib/string_number_conversion_test.cc b/third_party/crashpad/crashpad/util/stdlib/string_number_conversion_test.cc index 760dc4a..90b6775 100644 --- a/third_party/crashpad/crashpad/util/stdlib/string_number_conversion_test.cc +++ b/third_party/crashpad/crashpad/util/stdlib/string_number_conversion_test.cc
@@ -20,7 +20,7 @@ #include <limits> #include <type_traits> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #define STRINGIFY(a) STR(a)
diff --git a/third_party/crashpad/crashpad/util/stdlib/strlcpy_test.cc b/third_party/crashpad/crashpad/util/stdlib/strlcpy_test.cc index 3819c043..b729c24 100644 --- a/third_party/crashpad/crashpad/util/stdlib/strlcpy_test.cc +++ b/third_party/crashpad/crashpad/util/stdlib/strlcpy_test.cc
@@ -20,8 +20,8 @@ #include <algorithm> #include <string> +#include "base/cxx17_backports.h" #include "base/format_macros.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h"
diff --git a/third_party/crashpad/crashpad/util/stdlib/thread_safe_vector_test.cc b/third_party/crashpad/crashpad/util/stdlib/thread_safe_vector_test.cc index 1d26b09d0..f589ca6 100644 --- a/third_party/crashpad/crashpad/util/stdlib/thread_safe_vector_test.cc +++ b/third_party/crashpad/crashpad/util/stdlib/thread_safe_vector_test.cc
@@ -14,7 +14,7 @@ #include "util/stdlib/thread_safe_vector.h" -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #include "util/thread/thread.h"
diff --git a/third_party/crashpad/crashpad/util/stream/base94_output_stream_test.cc b/third_party/crashpad/crashpad/util/stream/base94_output_stream_test.cc index 32decbb..c15d697 100644 --- a/third_party/crashpad/crashpad/util/stream/base94_output_stream_test.cc +++ b/third_party/crashpad/crashpad/util/stream/base94_output_stream_test.cc
@@ -19,9 +19,9 @@ #include <algorithm> #include <sstream> +#include "base/cxx17_backports.h" #include "base/macros.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "util/stream/test_output_stream.h"
diff --git a/third_party/crashpad/crashpad/util/stream/zlib_output_stream.cc b/third_party/crashpad/crashpad/util/stream/zlib_output_stream.cc index 88861db..3ae7d91 100644 --- a/third_party/crashpad/crashpad/util/stream/zlib_output_stream.cc +++ b/third_party/crashpad/crashpad/util/stream/zlib_output_stream.cc
@@ -14,9 +14,10 @@ #include "util/stream/zlib_output_stream.h" +#include "base/check.h" +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" -#include "base/stl_util.h" #include "util/misc/zlib.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/util/stream/zlib_output_stream_test.cc b/third_party/crashpad/crashpad/util/stream/zlib_output_stream_test.cc index dfa935b6..194f811d 100644 --- a/third_party/crashpad/crashpad/util/stream/zlib_output_stream_test.cc +++ b/third_party/crashpad/crashpad/util/stream/zlib_output_stream_test.cc
@@ -18,8 +18,8 @@ #include <algorithm> +#include "base/cxx17_backports.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "util/stream/test_output_stream.h"
diff --git a/third_party/crashpad/crashpad/util/synchronization/semaphore_test.cc b/third_party/crashpad/crashpad/util/synchronization/semaphore_test.cc index 4f1c1cd..5cb91e4 100644 --- a/third_party/crashpad/crashpad/util/synchronization/semaphore_test.cc +++ b/third_party/crashpad/crashpad/util/synchronization/semaphore_test.cc
@@ -16,7 +16,7 @@ #include <sys/types.h> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "gtest/gtest.h" #if defined(OS_POSIX)
diff --git a/third_party/crashpad/crashpad/util/thread/thread_log_messages_test.cc b/third_party/crashpad/crashpad/util/thread/thread_log_messages_test.cc index 0400e8d..143e4c13 100644 --- a/third_party/crashpad/crashpad/util/thread/thread_log_messages_test.cc +++ b/third_party/crashpad/crashpad/util/thread/thread_log_messages_test.cc
@@ -17,8 +17,8 @@ #include <string.h> #include <sys/types.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "gtest/gtest.h" #include "util/thread/thread.h"
diff --git a/third_party/crashpad/crashpad/util/win/command_line_test.cc b/third_party/crashpad/crashpad/util/win/command_line_test.cc index 82f682c..28b95041 100644 --- a/third_party/crashpad/crashpad/util/win/command_line_test.cc +++ b/third_party/crashpad/crashpad/util/win/command_line_test.cc
@@ -18,8 +18,8 @@ #include <shellapi.h> #include <sys/types.h> +#include "base/cxx17_backports.h" #include "base/scoped_generic.h" -#include "base/stl_util.h" #include "gtest/gtest.h" #include "test/errors.h" #include "util/win/scoped_local_alloc.h"
diff --git a/third_party/crashpad/crashpad/util/win/exception_handler_server.cc b/third_party/crashpad/crashpad/util/win/exception_handler_server.cc index a520c72..9394256 100644 --- a/third_party/crashpad/crashpad/util/win/exception_handler_server.cc +++ b/third_party/crashpad/crashpad/util/win/exception_handler_server.cc
@@ -20,10 +20,10 @@ #include <utility> +#include "base/cxx17_backports.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" #include "base/rand_util.h" -#include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" #include "util/file/file_writer.h" #include "util/misc/tri_state.h"
diff --git a/third_party/crashpad/crashpad/util/win/ntstatus_logging.cc b/third_party/crashpad/crashpad/util/win/ntstatus_logging.cc index e9a9b61..7a134195 100644 --- a/third_party/crashpad/crashpad/util/win/ntstatus_logging.cc +++ b/third_party/crashpad/crashpad/util/win/ntstatus_logging.cc
@@ -16,7 +16,7 @@ #include <string> -#include "base/stl_util.h" +#include "base/cxx17_backports.h" #include "base/strings/stringprintf.h" namespace {
diff --git a/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc b/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc index 7e04cda..e3d55c6 100644 --- a/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc +++ b/third_party/crashpad/crashpad/util/win/registration_protocol_win.cc
@@ -19,8 +19,8 @@ #include <sddl.h> #include <stddef.h> +#include "base/cxx17_backports.h" #include "base/logging.h" -#include "base/stl_util.h" #include "util/win/exception_handler_server.h" #include "util/win/loader_lock.h" #include "util/win/scoped_handle.h"
diff --git a/third_party/crashpad/crashpad/util/win/safe_terminate_process_test.cc b/third_party/crashpad/crashpad/util/win/safe_terminate_process_test.cc index f30c649..6904d03 100644 --- a/third_party/crashpad/crashpad/util/win/safe_terminate_process_test.cc +++ b/third_party/crashpad/crashpad/util/win/safe_terminate_process_test.cc
@@ -20,9 +20,9 @@ #include <memory> #include "base/check.h" +#include "base/cxx17_backports.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/stl_util.h" #include "build/build_config.h" #include "gtest/gtest.h" #include "test/errors.h"
diff --git a/third_party/opus/README.chromium b/third_party/opus/README.chromium index 7ba2aa5..f0818fb1 100644 --- a/third_party/opus/README.chromium +++ b/third_party/opus/README.chromium
@@ -1,6 +1,6 @@ Name: opus URL: https://gitlab.xiph.org/xiph/opus -Version: 7b05f44f +Version: 16395923 License: BSD License File: src/COPYING Security Critical: yes
diff --git a/third_party/opus/src/CMakeLists.txt b/third_party/opus/src/CMakeLists.txt index a28f441..02de9b7 100644 --- a/third_party/opus/src/CMakeLists.txt +++ b/third_party/opus/src/CMakeLists.txt
@@ -579,7 +579,7 @@ target_link_libraries(opus_compare PRIVATE opus ${OPUS_REQUIRED_LIBRARIES}) endif() -if(BUILD_TESTING) +if(BUILD_TESTING AND NOT BUILD_SHARED_LIBS) enable_testing() # tests @@ -590,29 +590,38 @@ if(OPUS_FIXED_POINT) target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API) endif() - add_test(NAME test_opus_decode COMMAND $<TARGET_FILE:test_opus_decode> WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME test_opus_decode COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_decode> + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") add_executable(test_opus_padding ${test_opus_padding_sources}) target_include_directories(test_opus_padding PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_link_libraries(test_opus_padding PRIVATE opus) - add_test(NAME test_opus_padding COMMAND $<TARGET_FILE:test_opus_padding> WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_test(NAME test_opus_padding COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_padding> + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") - if(NOT BUILD_SHARED_LIBS) - # disable tests that depends on private API when building shared lib - add_executable(test_opus_api ${test_opus_api_sources}) - target_include_directories(test_opus_api - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) - target_link_libraries(test_opus_api PRIVATE opus) - if(OPUS_FIXED_POINT) - target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API) - endif() - add_test(NAME test_opus_api COMMAND $<TARGET_FILE:test_opus_api> WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) - - add_executable(test_opus_encode ${test_opus_encode_sources}) - target_include_directories(test_opus_encode - PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) - target_link_libraries(test_opus_encode PRIVATE opus) - add_test(NAME test_opus_encode COMMAND $<TARGET_FILE:test_opus_encode> WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) + add_executable(test_opus_api ${test_opus_api_sources}) + target_include_directories(test_opus_api + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) + target_link_libraries(test_opus_api PRIVATE opus) + if(OPUS_FIXED_POINT) + target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API) endif() + add_test(NAME test_opus_api COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_api> + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") + + add_executable(test_opus_encode ${test_opus_encode_sources}) + target_include_directories(test_opus_encode + PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt) + target_link_libraries(test_opus_encode PRIVATE opus) + add_test(NAME test_opus_encode COMMAND ${CMAKE_COMMAND} + -DTEST_EXECUTABLE=$<TARGET_FILE:test_opus_encode> + -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} + -P "${PROJECT_SOURCE_DIR}/cmake/RunTest.cmake") endif()
diff --git a/third_party/opus/src/Makefile.am b/third_party/opus/src/Makefile.am index 83beaa3..70a2ebf 100644 --- a/third_party/opus/src/Makefile.am +++ b/third_party/opus/src/Makefile.am
@@ -222,6 +222,7 @@ cmake/OpusFunctions.cmake \ cmake/OpusPackageVersion.cmake \ cmake/OpusSources.cmake \ + cmake/RunTest.cmake \ cmake/config.h.cmake.in \ cmake/vla.c \ meson/get-version.py \
diff --git a/third_party/opus/src/celt/celt_lpc.c b/third_party/opus/src/celt/celt_lpc.c index 457e7ed..242e6df5 100644 --- a/third_party/opus/src/celt/celt_lpc.c +++ b/third_party/opus/src/celt/celt_lpc.c
@@ -50,7 +50,11 @@ #endif OPUS_CLEAR(lpc, p); +#ifdef FIXED_POINT if (ac[0] != 0) +#else + if (ac[0] > 1e-10f) +#endif { for (i = 0; i < p; i++) { /* Sum up this iteration's reflection coefficient */ @@ -73,10 +77,10 @@ error = error - MULT32_32_Q31(MULT32_32_Q31(r,r),error); /* Bail out once we get 30 dB gain */ #ifdef FIXED_POINT - if (error<SHR32(ac[0],10)) + if (error<=SHR32(ac[0],10)) break; #else - if (error<.001f*ac[0]) + if (error<=.001f*ac[0]) break; #endif }
diff --git a/third_party/opus/src/cmake/RunTest.cmake b/third_party/opus/src/cmake/RunTest.cmake new file mode 100644 index 0000000..f6f8b4a --- /dev/null +++ b/third_party/opus/src/cmake/RunTest.cmake
@@ -0,0 +1,61 @@ +if(NOT EXISTS ${TEST_EXECUTABLE}) + message(FATAL_ERROR "Error could not find ${TEST_EXECUTABLE}, ensure that you built the test binary") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Android") + + # support to run plain old binary on android devices + # requires android debug bridge to be installed + + find_program(adb_executable adb) + if(NOT adb_executable) + message(FATAL_ERROR "Error could not find adb") + endif() + + # check if any device emulator is attached + execute_process(COMMAND ${adb_executable} shell echo RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error adb: no devices/emulators found") + endif() + + # push binary + set(android_path /data/local/tmp) + execute_process(COMMAND ${adb_executable} push ${TEST_EXECUTABLE} ${android_path} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} push ${TEST_EXECUTABLE} ${android_path} failed with result ${CMD_RESULT}") + endif() + + # set permissions + get_filename_component(test_executable ${TEST_EXECUTABLE} NAME) + set(test_executable_on_android /data/local/tmp/${test_executable}) + execute_process(COMMAND ${adb_executable} shell chmod 555 ${test_executable_on_android} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} shell chmod 555 ${test_executable_on_android} failed with result ${CMD_RESULT}") + endif() + + # run executable + execute_process(COMMAND ${adb_executable} shell ${test_executable_on_android} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} shell ${test_executable_on_android} failed with result ${CMD_RESULT}") + endif() + + # clean up binary + execute_process(COMMAND ${adb_executable} shell rm ${test_executable_on_android} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${adb_executable} shell rm ${test_executable_on_android} failed with result ${CMD_RESULT}") + endif() + +elseif(CMAKE_SYSTEM_NAME STREQUAL "iOS") + # CTest doesn't support iOS + + message(FATAL_ERROR "Error CTest is not supported on iOS") + +else() + # for other platforms just execute test binary on host + + execute_process(COMMAND ${TEST_EXECUTABLE} RESULT_VARIABLE CMD_RESULT) + if(CMD_RESULT) + message(FATAL_ERROR "Error running ${TEST_EXECUTABLE} failed with result ${CMD_RESULT}") + endif() + +endif() \ No newline at end of file
diff --git a/third_party/opus/src/src/opus_encoder.c b/third_party/opus/src/src/opus_encoder.c index 321bb2b..253fe9e 100644 --- a/third_party/opus/src/src/opus_encoder.c +++ b/third_party/opus/src/src/opus_encoder.c
@@ -900,10 +900,10 @@ { if (!activity) { - /* The number of consecutive DTX frames should be within the allowed bounds. - Note that the allowed bound is defined in the Silk headers and assumes 20 ms - frames. As this function can be called with any frame length, a conversion to - miliseconds is done before the comparisons. */ + /* The number of consecutive DTX frames should be within the allowed bounds. + Note that the allowed bound is defined in the SILK headers and assumes 20 ms + frames. As this function can be called with any frame length, a conversion to + milliseconds is done before the comparisons. */ (*nb_no_activity_ms_Q1) += frame_size_ms_Q1; if (*nb_no_activity_ms_Q1 > NB_SPEECH_FRAMES_BEFORE_DTX*20*2) {
diff --git a/third_party/widevine/cdm/widevine.gni b/third_party/widevine/cdm/widevine.gni index 792a979..e94b477 100644 --- a/third_party/widevine/cdm/widevine.gni +++ b/third_party/widevine/cdm/widevine.gni
@@ -25,10 +25,10 @@ # supported via Android MediaDrm API. library_widevine_cdm_available = (is_chromeos_ash && (target_cpu == "x64" || target_cpu == "arm")) || - ((is_linux || is_chromeos_lacros) && + ((target_os == "linux" || is_chromeos_lacros) && (target_cpu == "x86" || target_cpu == "x64")) || - (is_mac && (target_cpu == "x64" || target_cpu == "arm64")) || - (is_win && (target_cpu == "x86" || target_cpu == "x64")) + (target_os == "mac" && (target_cpu == "x64" || target_cpu == "arm64")) || + (target_os == "win" && (target_cpu == "x86" || target_cpu == "x64")) # Widevine CDM is available as a library CDM and it's supported by Chromium. # This does not define how the CDM will be deployed. It can be bundled or
diff --git a/tools/android/dependency_analysis/PRESUBMIT.py b/tools/android/dependency_analysis/PRESUBMIT.py index b03773f..ff16d6b 100644 --- a/tools/android/dependency_analysis/PRESUBMIT.py +++ b/tools/android/dependency_analysis/PRESUBMIT.py
@@ -8,6 +8,9 @@ """ +USE_PYTHON3 = True + + def CommonChecks(input_api, output_api): checks = input_api.canned_checks.GetUnitTestsRecursively( input_api,
diff --git a/tools/cfi/ignores.txt b/tools/cfi/ignores.txt index 2dc3f1f..aa749be 100644 --- a/tools/cfi/ignores.txt +++ b/tools/cfi/ignores.txt
@@ -39,7 +39,7 @@ src:*third_party/spirv-cross/spirv-cross/spirv_cross_containers.hpp # Vulkan memory allocator -src:*third_party/vulkan_memory_allocator/src/vk_mem_alloc.h +src:*third_party/vulkan_memory_allocator/include/vk_mem_alloc.h ############################################################################# # Base class's constructor accesses a derived class. @@ -171,7 +171,7 @@ src:*ui/gl/gl_bindings_autogen_* # Calls to vulkan function pointers from shared library. -src:*third_party/vulkan_memory_allocator/src/vk_mem_alloc.h +src:*third_party/vulkan_memory_allocator/include/vk_mem_alloc.h src:*third_party/angle/third_party/vulkan-loader/src/loader* src:*third_party/vulkan-deps/vulkan-loader/src/loader* src:*third_party/vulkan-deps/vulkan-validation-layers/src/layers/*
diff --git a/tools/checkperms/PRESUBMIT.py b/tools/checkperms/PRESUBMIT.py index 661c3ab29..b7041c8 100644 --- a/tools/checkperms/PRESUBMIT.py +++ b/tools/checkperms/PRESUBMIT.py
@@ -9,9 +9,6 @@ """ -USE_PYTHON3 = True - - def CommonChecks(input_api, output_api): output = [] output.extend(input_api.canned_checks.RunPylint(input_api, output_api))
diff --git a/tools/checkperms/checkperms.py b/tools/checkperms/checkperms.py index 3141417..d12c4650 100755 --- a/tools/checkperms/checkperms.py +++ b/tools/checkperms/checkperms.py
@@ -211,7 +211,7 @@ env['LANGUAGE'] = 'en_US.UTF-8' p = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd, env=env) - return p.communicate()[0].decode('utf-8', 'ignore') + return p.communicate()[0] def get_git_root(dir_path):
diff --git a/tools/clang/plugins/FindBadConstructsConsumer.cpp b/tools/clang/plugins/FindBadConstructsConsumer.cpp index 61e51d0..cb674ce 100644 --- a/tools/clang/plugins/FindBadConstructsConsumer.cpp +++ b/tools/clang/plugins/FindBadConstructsConsumer.cpp
@@ -332,7 +332,12 @@ if (max_enumerators.find(max_value) == max_enumerators.end()) { ReportIfSpellingLocNotIgnored(max_value->getLocation(), diag_bad_enum_max_value_) +#if defined(LLVM_FORCE_HEAD_REVISION) + << toString(max_seen, 10); +#else + // TODO(crbug.com/1218876): Remove after clang roll. << max_seen.toString(10); +#endif } else if (max_enumerators.size() < 2) { ReportIfSpellingLocNotIgnored(decl->getLocation(), diag_enum_max_value_unique_);
diff --git a/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt b/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt index 98c859e8..8a2d74f 100644 --- a/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt +++ b/tools/clang/rewrite_raw_ptr_fields/manual-fields-to-ignore.txt
@@ -103,6 +103,10 @@ DownloadItemView::open_now_button_ DownloadItemView::save_button_ DownloadItemView::scan_button_ +OpaqueBrowserFrameViewLayout::minimize_button_ +OpaqueBrowserFrameViewLayout::maximize_button_ +OpaqueBrowserFrameViewLayout::restore_button_ +OpaqueBrowserFrameViewLayout::close_button_ # Populated manually - incompatibilities with tracing (TRACE_EVENT*) and # gmock/EXPECT_THAT.
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index 0f78c1c..49e793a 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -39,7 +39,7 @@ # https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang.md # Reverting problematic clang rolls is safe, though. # This is the output of `git describe` and is usable as a commit-ish. -CLANG_REVISION = 'llvmorg-13-init-12491-g055770d5' +CLANG_REVISION = 'llvmorg-13-init-12576-g643b6407' CLANG_SUB_REVISION = 1 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index 5b357dc8..3a9cf3c407 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -113,6 +113,10 @@ "META": {"sizes": {"includes": [50],}}, "includes": [1260], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/browser_switch/resources.grd": { + "META": {"sizes": {"includes": [10],}}, + "includes": [1355], + }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/chromeos/emoji_picker/resources.grd": { "META": {"sizes": {"includes": [20]}}, "includes": [1365],
diff --git a/tools/ipc_fuzzer/message_tools/message_list.cc b/tools/ipc_fuzzer/message_tools/message_list.cc index 7e7fb3f..90b1a59a 100644 --- a/tools/ipc_fuzzer/message_tools/message_list.cc +++ b/tools/ipc_fuzzer/message_tools/message_list.cc
@@ -48,7 +48,6 @@ // include message files used inside the actual chrome browser in this list. exemptions.push_back(TestMsgStart); exemptions.push_back(WorkerMsgStart); // Now only used by tests. - exemptions.push_back(ChromeUtilityPrintingMsgStart); // BUILDFLAGS, sigh. #if !BUILDFLAG(ENABLE_NACL) exemptions.push_back(NaClMsgStart);
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 94bc378..771bc39 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -106,7 +106,7 @@ # TODO(crbug/1182468) Remove android coverage bots after coverage is # running on CQ. 'android-pie-arm64-coverage-experimental-rel': 'android_release_bot_arm64_webview_google_expectations', - 'android-pie-arm64-rel': 'android_release_bot_minimal_symbols_arm64_webview_google', + 'android-pie-arm64-rel': 'android_release_bot_minimal_symbols_arm64_webview_google_no_proguard', 'android-pie-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', 'android-weblayer-with-aosp-webview-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google', 'android-weblayer-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_disable_proguard_webview_google', @@ -787,7 +787,7 @@ # running on CQ. 'android-pie-arm64-coverage-rel': 'android_release_trybot_arm64_webview_google_native_coverage', 'android-pie-arm64-coverage-experimental-rel': 'android_release_trybot_arm64_webview_google_expectations_native_coverage', - 'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google_expectations', + 'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google_expectations_no_proguard', 'android-pie-arm64-wpt-rel-non-cq': 'android_release_trybot_arm64_webview_google', 'android-pie-x86-rel': 'android_release_trybot_x86_fastbuild_webview_google', 'android-web-platform-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google', @@ -1396,6 +1396,11 @@ 'strip_debug_info', 'webview_google', ], + 'android_release_bot_minimal_symbols_arm64_webview_google_no_proguard': [ + 'android', 'release_bot', 'minimal_symbols', 'arm64', + 'strip_debug_info', 'webview_google', 'android_no_proguard', + ], + 'android_release_bot_minimal_symbols_webview_google': [ 'android', 'release_bot', 'minimal_symbols', 'strip_debug_info', 'webview_google', @@ -1441,9 +1446,9 @@ 'webview_google', ], - 'android_release_trybot_arm64_webview_google_expectations': [ + 'android_release_trybot_arm64_webview_google_expectations_no_proguard': [ 'android', 'release_trybot', 'arm64', 'strip_debug_info', - 'webview_google', 'fail_on_android_expectations', + 'webview_google', 'fail_on_android_expectations', 'android_no_proguard', ], # TODO(crbug/1182468) Remove these android coverage expectations after
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json index aeccec2..4215a55 100644 --- a/tools/mb/mb_config_expectations/chromium.android.json +++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -489,6 +489,7 @@ "ffmpeg_branding": "Chrome", "is_component_build": false, "is_debug": false, + "is_java_debug": true, "proprietary_codecs": true, "strip_debug_info": true, "symbol_level": 1,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index 13245d6..1c73d73 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -385,6 +385,7 @@ "ffmpeg_branding": "Chrome", "is_component_build": false, "is_debug": false, + "is_java_debug": true, "proprietary_codecs": true, "strip_debug_info": true, "symbol_level": 1,
diff --git a/tools/mb/rts_banned_suites.json b/tools/mb/rts_banned_suites.json index a64b9a63..48b0ff6 100644 --- a/tools/mb/rts_banned_suites.json +++ b/tools/mb/rts_banned_suites.json
@@ -2,24 +2,15 @@ "*": [ "xr_browser_tests", + "telemetry_gpu_integration_test", "metrics_python_tests", "mojo_python_unittests", "blink_python_tests", "grit_python_unittests", "telemetry_perf_unittests", - "telemetry_perf_unittests_android_chrome", - "telemetry_perf_unittests_android_monochrome", - "telemetry_perf_unittests_android_monochrome_bundle", - "telemetry_perf_unittests_android_weblayer", - "telemetry_perf_unittests_android_webview", "maps_tests", "telemetry_gpu_unittests", - "telemetry_gpu_integration_test", - "telemetry_gpu_integration_test_android_chrome", - "telemetry_gpu_integration_test_android_monochrome", - "telemetry_gpu_integration_test_android_monochrome_bundle", - "telemetry_gpu_integration_test_android_weblayer", - "telemetry_gpu_integration_test_android_webview" + "telemetry_gpu_integration_test" ], "fuchsia_x64_rts": [ "blink_web_tests"
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 987138a..309912c 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -28496,6 +28496,13 @@ </action> <action-suffix separator="_" ordering="suffix"> + <suffix name="AdaptiveButtonInTopToolbarCustomization_NewTab" + label="For AdaptiveButtonInTopToolbarCustomization new tab feature."/> + <suffix name="AdaptiveButtonInTopToolbarCustomization_Share" + label="For AdaptiveButtonInTopToolbarCustomization share feature."/> + <suffix name="AdaptiveButtonInTopToolbarCustomization_VoiceSearch" + label="For AdaptiveButtonInTopToolbarCustomization voice search + feature."/> <suffix name="AddToHomescreenMessage" label="For AddToHomescreen IPH feature."/> <suffix name="AddToHomescreenTextBubble"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 809db7f..486ce05 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -1421,6 +1421,13 @@ <int value="2" label="Warning canceled"/> </enum> +<enum name="AlpacaPort"> + <int value="0" label="26"/> + <int value="1" label="989"/> + <int value="2" label="990"/> + <int value="3" label="2525"/> +</enum> + <enum name="AlpsDecoderError"> <int value="0" label="NoError"/> <int value="1" label="FramingError"/> @@ -45140,6 +45147,7 @@ <int value="-2026156288" label="LookalikeUrlNavigationSuggestionsUI:disabled"/> <int value="-2025367104" label="enable-material-design-ntp"/> + <int value="-2023673947" label="TabRestoreSubMenus:disabled"/> <int value="-2022956008" label="ExternalPciDevicesAllowed:disabled"/> <int value="-2021954068" label="TapVisualizerApp:disabled"/> <int value="-2020721975" label="smart-virtual-keyboard"/> @@ -45156,6 +45164,7 @@ <int value="-2012266745" label="OmniboxLocalZeroSuggestFrecencyRanking:disabled"/> <int value="-2011532551" label="SignedExchangeSubresourcePrefetch:disabled"/> + <int value="-2011428140" label="RelatedSearchesAlternateUx:disabled"/> <int value="-2010634516" label="OmniboxLocalEntitySuggestions:disabled"/> <int value="-2009622663" label="WebRtcHWH264Encoding:enabled"/> <int value="-2009172938" label="DragToPinTabs:disabled"/> @@ -45661,6 +45670,7 @@ label="AlignFontDisplayAutoTimeoutWithLCPGoal:disabled"/> <int value="-1601374850" label="DialMediaRouteProvider:disabled"/> <int value="-1599538279" label="enable-md-policy-page"/> + <int value="-1597053083" label="RelatedSearchesInBar:enabled"/> <int value="-1596859081" label="WebAuthenticationPINSupport:enabled"/> <int value="-1596559650" label="max-tiles-for-interest-area"/> <int value="-1596489715" label="AutoScreenBrightness:enabled"/> @@ -46364,6 +46374,7 @@ label="HappinessTrackingSurveysForDesktopSettingsPrivacy:enabled"/> <int value="-1042579955" label="ChromeOSParentalControlsSettings:enabled"/> <int value="-1041650038" label="enable-forced-migration-to-tabbed-mode"/> + <int value="-1041643783" label="SingleTouchSelect:enabled"/> <int value="-1041150041" label="ContextualSearchLiteralSearchTap:disabled"/> <int value="-1040000888" label="ContextMenuSearchWithGoogleLens:disabled"/> <int value="-1039889738" label="NativeNotifications:enabled"/> @@ -47180,6 +47191,7 @@ <int value="-333216449" label="MouseSubframeNoImplicitCapture:enabled"/> <int value="-329727402" label="disable-files-quick-view"/> <int value="-328361990" label="enable-experimental-extension-apis"/> + <int value="-327520505" label="RelatedSearchesAlternateUx:enabled"/> <int value="-327272022" label="AutofillRejectCompanyBirthyearName:enabled"/> <int value="-326535569" label="WebNotesStylize:disabled"/> <int value="-326083626" label="AppBanners:disabled"/> @@ -47870,6 +47882,7 @@ <int value="292731264" label="PasswordChangeInSettings:disabled"/> <int value="293134455" label="AutofillSendBillingCustomerNumber:disabled"/> <int value="293996306" label="ArrayPrototypeValues:disabled"/> + <int value="294150128" label="RelatedSearchesSimplifiedUx:enabled"/> <int value="295661985" label="video-capture-use-gpu-memory-buffer"/> <int value="296215399" label="WindowsMixedReality:disabled"/> <int value="296296761" label="MediaFoundationVideoCapture:disabled"/> @@ -47961,6 +47974,7 @@ <int value="363997248" label="UseXpsForPrinting:enabled"/> <int value="365068212" label="PiexWasm:disabled"/> <int value="365467768" label="prefetch-search-results"/> + <int value="365737168" label="SingleTouchSelect:disabled"/> <int value="367063319" label="PasswordImport:disabled"/> <int value="368854020" label="ash-screen-rotation-animation"/> <int value="369301993" label="PrinterStatus:enabled"/> @@ -48584,6 +48598,7 @@ <int value="887011602" label="enable-spelling-auto-correct"/> <int value="889837286" label="EnableHostnameSetting:enabled"/> <int value="892899792" label="MaterialDesignIncognitoNTP:disabled"/> + <int value="894434593" label="TabRestoreSubMenus:enabled"/> <int value="898311758" label="ReaderMode:disabled"/> <int value="900614020" label="ContentSuggestionsShowSummary:disabled"/> <int value="902209599" label="ShelfHotseat:enabled"/> @@ -48802,6 +48817,7 @@ <int value="1090377940" label="enable-quic-https"/> <int value="1091631619" label="disable-accelerated-video-encode"/> <int value="1092896354" label="EnableFullscreenAppList:disabled"/> + <int value="1093859961" label="RelatedSearchesSimplifiedUx:disabled"/> <int value="1094095931" label="enable-vulkan"/> <int value="1094506652" label="UseGoogleLocalNtp:enabled"/> <int value="1095061640" label="enable-prominent-url-app-flow"/> @@ -48944,6 +48960,7 @@ <int value="1203821857" label="Vulkan:disabled"/> <int value="1205849612" label="enable-sync-synced-notifications"/> <int value="1205929554" label="SendTabToSelfOmniboxSendingAnimation:enabled"/> + <int value="1206140820" label="RelatedSearchesInBar:disabled"/> <int value="1210298193" label="FontAccessPersistent:enabled"/> <int value="1210343926" label="enable-drop-sync-credential"/> <int value="1211284676" label="V8NoTurbo:enabled"/> @@ -62447,6 +62464,12 @@ <int value="2" label="Disabled"/> </enum> +<enum name="PeerConnectionProvisionalAnswer"> + <int value="0" label="Not used"/> + <int value="1" label="Local"/> + <int value="2" label="Remote"/> +</enum> + <enum name="PeerConnectionRtcpMux"> <int value="0" label="Disabled"/> <int value="1" label="Enabled"/> @@ -74293,6 +74316,9 @@ </enum> <enum name="SlipstreamPort"> + <obsolete> + Removed June 2021. + </obsolete> <int value="0" label="Other"/> <int value="1" label="69"/> <int value="2" label="137"/>
diff --git a/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml b/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml index 9ac71302..ed1e893 100644 --- a/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml
@@ -979,7 +979,7 @@ </histogram> <histogram name="ChromeOS.SAML.InSessionPasswordSyncEvent" - enum="SamlInSessionPasswordSyncEvent" expires_after="2021-04-30"> + enum="SamlInSessionPasswordSyncEvent" expires_after="2021-10-30"> <owner>mslus@chromium.org</owner> <owner>mohammedabdon@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/extensions/histograms.xml b/tools/metrics/histograms/histograms_xml/extensions/histograms.xml index 6085689..a1a89b1 100644 --- a/tools/metrics/histograms/histograms_xml/extensions/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/extensions/histograms.xml
@@ -1154,6 +1154,10 @@ <histogram name="Extensions.ExtensionAddDisabledRemotelyReason" enum="ExtensionUpdateCheckDataKey" expires_after="2021-10-10"> + <obsolete> + Removed in M92 and replaced with + Extensions.ExtensionAddDisabledRemotelyReason2. + </obsolete> <owner>bdea@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -1163,6 +1167,19 @@ </summary> </histogram> +<histogram name="Extensions.ExtensionAddDisabledRemotelyReason2" + enum="ExtensionUpdateCheckDataKey" expires_after="2021-10-10"> + <owner>bdea@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Recorded when a new violation is retrieved from Omaha for an extension. The + new violation reason is retrieved from the update service data key reasons + during an update check for extensions. This metric was added in M92 to + replace the old version, because the logic of logging greylisted extensions + has changed. + </summary> +</histogram> + <histogram name="Extensions.ExtensionCacheCount" units="units" expires_after="2021-10-04"> <owner>burunduk@chromium.org</owner> @@ -1187,6 +1204,9 @@ <histogram name="Extensions.ExtensionDisabledRemotely" enum="ExtensionUpdateCheckDataKey" expires_after="2021-10-10"> + <obsolete> + Removed in M92 and replaced with Extensions.ExtensionDisabledRemotely2. + </obsolete> <owner>bdea@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -1196,6 +1216,19 @@ </summary> </histogram> +<histogram name="Extensions.ExtensionDisabledRemotely2" + enum="ExtensionUpdateCheckDataKey" expires_after="2021-10-10"> + <owner>bdea@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Recorded when an extension that was previously enabled is disabled due to a + new violation retrieved from Omaha. This is recorded when the violation is + detected when Chrome checks for an update for the extension. This metric was + added in M92 to replace the old version, because the logic of logging + greylisted extensions has changed. + </summary> +</histogram> + <histogram name="Extensions.ExtensionInstalled" units="units" expires_after="never"> <!-- expires-never: Monitoring core extension usage. --> @@ -1228,6 +1261,20 @@ </summary> </histogram> +<histogram name="Extensions.ExtensionReenabledRemotely{BlocklistState}" + units="count" expires_after="2022-06-03"> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Recorded when a {BlocklistState} extension that was previously only disabled + remotely is re-enabled remotely during an update service session. + </summary> + <token key="BlocklistState"> + <variant name="ForPolicyViolation" summary="policy violation"/> + <variant name="ForPotentiallyUWS" summary="potentially unwanted"/> + </token> +</histogram> + <histogram name="Extensions.ExtensionRootPathLength" units="units" expires_after="M85"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml index c076e87..52106340 100644 --- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -8124,6 +8124,15 @@ </histogram_suffixes> <histogram_suffixes name="IPHFeatures" separator="."> + <suffix name="IPH_AdaptiveButtonInTopToolbarCustomization_NewTab" + label="In product help for the new tab adaptive button in the top + toolbar."/> + <suffix name="IPH_AdaptiveButtonInTopToolbarCustomization_Share" + label="In product help for the share adaptive button in the top + toolbar."/> + <suffix name="IPH_AdaptiveButtonInTopToolbarCustomization_VoiceSearch" + label="In product help for the voice search adaptive button in the top + toolbar."/> <suffix name="IPH_AddToHomescreenMessage" label="In product help using a message UI that educates users about adding website shortcuts to their home screen."/>
diff --git a/tools/metrics/histograms/histograms_xml/ios/histograms.xml b/tools/metrics/histograms/histograms_xml/ios/histograms.xml index 7c313b6c..46c76ed 100644 --- a/tools/metrics/histograms/histograms_xml/ios/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/ios/histograms.xml
@@ -905,6 +905,53 @@ </summary> </histogram> +<histogram name="IOS.ReadingList.Javascript.ExecutionTime" units="ms" + expires_after="2022-06-11"> + <owner>thegreenfrog@chromium.org</owner> + <owner>michaeldo@chromium.org</owner> + <summary> + Tracks the execution time of the distillability scoring JavaScript for the + Reading List Messages presentation heuristic. Reported for each main frame + navigation. + </summary> +</histogram> + +<histogram name="IOS.ReadingList.Javascript.LongPageDistillabilityScore" + units="Score" expires_after="2022-06-11"> + <owner>thegreenfrog@chromium.org</owner> + <owner>michaeldo@chromium.org</owner> + <summary> + The calculated distillability score for a page returned by + DistillablePageDetector::GetLongPageModel(). Score is translated by +1 to + make histogram logging simpler by keeping all scores positive. It is + multiplied by 100 to get granular scoring logging to the hundredth digit. + Reported for each main frame navigation. + </summary> +</histogram> + +<histogram name="IOS.ReadingList.Javascript.RegularDistillabilityScore" + units="Score" expires_after="2022-06-11"> + <owner>thegreenfrog@chromium.org</owner> + <owner>michaeldo@chromium.org</owner> + <summary> + The calculated distillability score for a page returned by + DistillablePageDetector::GetNewModel(). Score is translated by +1 to make + histogram logging simpler by keeping all scores positive. It is multiplied + by 100 to get granular scoring logging to the hundredth digit. Reported for + each main frame navigation. + </summary> +</histogram> + +<histogram name="IOS.ReadingList.Javascript.TimeToRead" units="Minutes" + expires_after="2022-06-11"> + <owner>thegreenfrog@chromium.org</owner> + <owner>michaeldo@chromium.org</owner> + <summary> + The estimated "time to read" calculated for a page. Reported for + each main frame navigation. + </summary> +</histogram> + <histogram name="IOS.Reauth.Password.Autofill" enum="ReauthenticationEvent" expires_after="2021-12-11"> <owner>javierrobles@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/net/histograms.xml b/tools/metrics/histograms/histograms_xml/net/histograms.xml index 548df85..f4677907 100644 --- a/tools/metrics/histograms/histograms_xml/net/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/net/histograms.xml
@@ -2296,8 +2296,25 @@ </summary> </histogram> +<histogram name="Net.Port.Alpaca" enum="AlpacaPort" expires_after="2021-12-31"> + <owner>ricea@chromium.org</owner> + <owner>yhirano@chromium.org</owner> + <summary> + Ports which may be restricted to mitigate the NAT Slipstream 2.0 + vulnerability. Logged only for affected ports which are passed to + net::IsPortAllowedForScheme(). + + A top-level navigation will be counted 4 times, whereas a subresource will + only be counted once. This is not intentional, but may be useful to estimate + the level of breakage. + </summary> +</histogram> + <histogram name="Net.Port.SlipstreamRestricted" enum="SlipstreamPort" expires_after="2021-10-31"> + <obsolete> + Removed June 2021. + </obsolete> <owner>ricea@chromium.org</owner> <owner>yhirano@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/network/histograms.xml b/tools/metrics/histograms/histograms_xml/network/histograms.xml index 75aa30c..47df295f 100644 --- a/tools/metrics/histograms/histograms_xml/network/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/network/histograms.xml
@@ -614,6 +614,78 @@ </summary> </histogram> +<histogram name="Network.DnsProxy.Query.Failed{Stage}Duration" units="ms" + expires_after="2021-12-01"> + <owner>garrick@chromium.org</owner> + <owner>cros-network-metrics@google.com</owner> + <summary> + Diagnostic metric for Chrome OS DNS proxy that records the duration of + various stages of the resolution process, including the entire time elapsed + processing the query. The measurement is started when the resolver first + reads the query data from the client and completes when the reply is sent. + + This histogram collects data for stages of the query that have resulted in + some kind of failure. It's possible that for any single query, both + successful and failed stages may exist. The most obvious case is when a + resolution step is retried. As such, the total time elapsed will necessarily + include zero or more resolution stages which are recorded in the + query-type-specific version of this histogram. + + A "total" duration will be successful if at least one resolve + stage succeeds, but will be recorded as 'failed' if they all do, or if any + other stage fails. + + All measurements are made within the Resolver class. The "receive" + time is recorded in OnDNSQuery(). This is also when the "total" + time starts. The "resolve" measurements all start from the + Resolve() method, and will stop either in the same method (on failure) or + handler applicable to the specific client that was used: HandleAresResult() + and HandleCurlResult(). The "reply" time is recorded in the + ReplyDNS() method. + </summary> + <token key="Stage"> + <variant name="Receive"/> + <variant name="Reply"/> + <variant name="Total"/> + </token> +</histogram> + +<histogram name="Network.DnsProxy.Query.{Stage}Duration" units="ms" + expires_after="2021-12-01"> + <owner>garrick@chromium.org</owner> + <owner>cros-network-metrics@google.com</owner> + <summary> + Diagnostic metric for Chrome OS DNS proxy that records the duration of + various stages of the resolution process, including the entire time elapsed + processing the query. The measurement is started when the resolver first + reads the query data from the client and completes when the reply is sent. + + This histogram collects data for stages of the query that have resulted in + success. It's possible that for any single query, both successful and failed + stages may exist. The most obvious case is when a resolution step is + retried. As such, the total time elapsed will necessarily include zero or + more resolution stages which are recorded in the query-type-specific version + of this histogram. + + A "total" duration will be successful if at least one resolve + stage succeeds, but will be recorded as 'failed' if they all do, or if any + other stage fails. + + All measurements are made within the Resolver class. The "receive" + time is recorded in OnDNSQuery(). This is also when the "total" + time starts. The "resolve" measurements all start from the + Resolve() method, and will stop either in the same method (on failure) or + handler applicable to the specific client that was used: HandleAresResult() + and HandleCurlResult(). The "reply" time is recorded in the + ReplyDNS() method. + </summary> + <token key="Stage"> + <variant name="Receive"/> + <variant name="Reply"/> + <variant name="Total"/> + </token> +</histogram> + <histogram name="Network.DnsProxy.{Family}Nameservers" units="units" expires_after="2021-12-01"> <owner>garrick@chromium.org</owner> @@ -662,6 +734,48 @@ </token> </histogram> +<histogram name="Network.DnsProxy.{Type}Query.FailedResolveDuration" units="ms" + expires_after="2021-12-01"> + <owner>garrick@chromium.org</owner> + <owner>cros-network-metrics@google.com</owner> + <summary> + Diagnostic metric for Chrome OS DNS proxy that records the duration of a + failed name resolution as part of an overall query. The measurement is + started just before the client resolver (either plaintext or DoH) is run and + stopped on its completion. + + All measurements are made within the Resolver class. The "resolve" + measurements all start from the Resolve() method, and will stop either in + the same method (on failure) or handler applicable to the specific client + that was used: HandleAresResult() and HandleCurlResult(). + </summary> + <token key="Type"> + <variant name="DnsOverHttps"/> + <variant name="PlainText"/> + </token> +</histogram> + +<histogram name="Network.DnsProxy.{Type}Query.ResolveDuration" units="ms" + expires_after="2021-12-01"> + <owner>garrick@chromium.org</owner> + <owner>cros-network-metrics@google.com</owner> + <summary> + Diagnostic metric for Chrome OS DNS proxy that records the duration of a + successful name resolution as part of an overall query. The measurement is + started just before the client resolver (either plaintext or DoH) is run and + stopped on its completion. + + All measurements are made within the Resolver class. The "resolve" + measurements all start from the Resolve() method, and will stop either in + the same method (on failure) or handler applicable to the specific client + that was used: HandleAresResult() and HandleCurlResult(). + </summary> + <token key="Type"> + <variant name="DnsOverHttps"/> + <variant name="PlainText"/> + </token> +</histogram> + <histogram name="Network.DnsProxy.{Type}Query.Results" enum="DnsProxy.QueryResult" expires_after="2021-12-01"> <owner>garrick@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/page/histograms.xml b/tools/metrics/histograms/histograms_xml/page/histograms.xml index 6bc3783e..b96e322 100644 --- a/tools/metrics/histograms/histograms_xml/page/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/page/histograms.xml
@@ -1553,7 +1553,7 @@ </histogram> <histogram name="PageLoad.FrameCounts.AdFrames.PerFrame.CreativeOriginStatus" - enum="CrossOriginCreativeStatus" expires_after="2021-06-30"> + enum="CrossOriginCreativeStatus" expires_after="2021-12-31"> <owner>cammie@chromium.org</owner> <owner>jkarlin@chromium.org</owner> <owner>chrome-ads-histograms@google.com</owner> @@ -1570,7 +1570,7 @@ <histogram name="PageLoad.FrameCounts.AdFrames.PerFrame.CreativeOriginStatusWithThrottling" - enum="CrossOriginCreativeStatusWithThrottling" expires_after="2021-06-30"> + enum="CrossOriginCreativeStatusWithThrottling" expires_after="2021-12-31"> <owner>cammie@chromium.org</owner> <owner>jkarlin@chromium.org</owner> <owner>chrome-ads-histograms@google.com</owner>
diff --git a/tools/metrics/histograms/histograms_xml/variations/histograms.xml b/tools/metrics/histograms/histograms_xml/variations/histograms.xml index 5b8252f..f7bfbea 100644 --- a/tools/metrics/histograms/histograms_xml/variations/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/variations/histograms.xml
@@ -62,6 +62,19 @@ </summary> </histogram> +<histogram name="Variations.ExtendedSafeMode.WritePrefsTime" units="ms" + expires_after="2021-11-22"> + <owner>caitlinfischer@google.com</owner> + <owner>src/base/metrics/OWNERS</owner> + <component>Internals>Metrics>Variations</component> + <summary> + The time it takes to write prefs to disk. The time is capped at 1s. The + metric is emitted before field trials are set up. Only clients on canary or + dev channels in the ExtendedVariationsSafeMode experiment's WritePrefs and + SignalEarlyAndWritePrefs groups emit the metric. + </summary> +</histogram> + <histogram name="Variations.FirstRun.SeedConnectTime" units="ms" expires_after="2022-04-22"> <owner>asvitkine@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml b/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml index 18ce2897..4567b3e 100644 --- a/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml
@@ -1539,6 +1539,16 @@ </summary> </histogram> +<histogram name="WebRTC.PeerConnection.ProvisionalAnswer" + enum="PeerConnectionProvisionalAnswer" expires_after="2022-06-01"> + <owner>hta@chromium.org</owner> + <owner>webrtc-dev@chromium.org</owner> + <summary> + Whether provisional answers are used. Recorded during the first DTLS + connection establishment. + </summary> +</histogram> + <histogram name="WebRTC.PeerConnection.RtcpMux" enum="PeerConnectionRtcpMux" expires_after="2020-02-23"> <owner>pthatcher@chromium.org</owner>
diff --git a/tools/perf/chrome_telemetry_build/BUILD.gn b/tools/perf/chrome_telemetry_build/BUILD.gn index 902b24d..04fb5168 100644 --- a/tools/perf/chrome_telemetry_build/BUILD.gn +++ b/tools/perf/chrome_telemetry_build/BUILD.gn
@@ -128,15 +128,6 @@ ] } - group("telemetry_chrome_test_android_monochrome_bundle") { - testonly = true - - data_deps = [ - ":telemetry_chrome_test", - "//chrome/android:monochrome_public_bundle", - ] - } - group("telemetry_chrome_test_android_weblayer") { testonly = true @@ -156,28 +147,6 @@ "//android_webview/tools/system_webview_shell:system_webview_shell_apk", ] } - - if (enable_chrome_android_internal) { - import("//clank/telemetry_browser_types.gni") - - template("telemetry_chrome_test_clank_template") { - forward_variables_from(invoker, [ "telemetry_target_suffix" ]) - group(target_name) { - testonly = true - data_deps = [ - ":telemetry_chrome_test", - "//clank:telemetry_clank_test${telemetry_target_suffix}", - ] - } - } - - foreach(_target_suffix, telemetry_clank_browser_target_suffixes) { - telemetry_chrome_test_clank_template( - "telemetry_chrome_test${_target_suffix}") { - telemetry_target_suffix = _target_suffix - } - } - } } group("telemetry_weblayer_apks") {
diff --git a/tools/perf/chrome_telemetry_build/android_browser_types.gni b/tools/perf/chrome_telemetry_build/android_browser_types.gni index f7d0350..cb5eb4c4 100644 --- a/tools/perf/chrome_telemetry_build/android_browser_types.gni +++ b/tools/perf/chrome_telemetry_build/android_browser_types.gni
@@ -2,22 +2,9 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/android/config.gni") - -# This provides a list of suffixes for all Android Chromium Telemetry targets -# for use in auto-generating binary-specific targets. -# All the suffixes should be kept in sync with android_browser_types.py. - telemetry_android_browser_target_suffixes = [ "_android_chrome", "_android_monochrome", - "_android_monochrome_bundle", "_android_weblayer", "_android_webview", ] - -if (enable_chrome_android_internal) { - import("//clank/telemetry_browser_types.gni") - telemetry_android_browser_target_suffixes += - telemetry_clank_browser_target_suffixes -}
diff --git a/tools/perf/chrome_telemetry_build/android_browser_types.py b/tools/perf/chrome_telemetry_build/android_browser_types.py deleted file mode 100644 index c066588..0000000 --- a/tools/perf/chrome_telemetry_build/android_browser_types.py +++ /dev/null
@@ -1,45 +0,0 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import logging -import os -import sys - -# This file should be kept in sync with android_browser_types.gni. It provides -# a list of Android Chromium Telemetry targets for use in Python scripts. - -_CHROMIUM_SRC_DIR = os.path.realpath( - os.path.join(os.path.dirname(__file__), '..', '..', '..')) -_CLANK_DIR = os.path.join(_CHROMIUM_SRC_DIR, 'clank') -_CLANK_LIST_FILEPATH = os.path.join(_CLANK_DIR, 'telemetry_browser_types.py') - -TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES = [ - '_android_chrome', - '_android_monochrome', - '_android_monochrome_bundle', - '_android_weblayer', - '_android_webview', -] - -if os.path.exists(_CLANK_LIST_FILEPATH): - sys.path.append(_CLANK_DIR) - import telemetry_browser_types # pylint: disable=import-error,wrong-import-position - sys.path.remove(_CLANK_DIR) - TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES +=\ - telemetry_browser_types.TELEMETRY_CLANK_BROWSER_TARGET_SUFFIXES -else: - logging.warning( - 'No Clank checkout detected - falling back to hard-coded list of ' - 'suffixes, which may be out of date') - TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES += [ - '_android_clank_chrome', - '_android_clank_monochrome', - '_android_clank_monochrome_64_32_bundle', - '_android_clank_monochrome_bundle', - '_android_clank_trichrome_bundle', - '_android_clank_trichrome_webview', - '_android_clank_trichrome_webview_bundle', - '_android_clank_webview', - '_android_clank_webview_bundle', - ]
diff --git a/tools/perf/cli_tools/update_wpr/update_wpr.py b/tools/perf/cli_tools/update_wpr/update_wpr.py index efb821a..5c550b6 100644 --- a/tools/perf/cli_tools/update_wpr/update_wpr.py +++ b/tools/perf/cli_tools/update_wpr/update_wpr.py
@@ -342,28 +342,19 @@ dest.write(line) return dest.name - def _GetTargetFromConfiguration(self, configuration): - """Returns the target that should be used for a Pinpoint job.""" - if configuration == 'android-pixel2-perf': - return 'performance_test_suite_android_clank_monochrome_64_32_bundle' - elif configuration in ('linux-perf', 'win-10-perf', - 'mac-10_12_laptop_low_end-perf'): - return 'performance_test_suite' - raise RuntimeError('Unknown configuration %s' % configuration) - def _StartPinpointJob(self, configuration): """Creates, starts a Pinpoint job and returns its URL.""" try: resp = pinpoint_service.NewJob( base_git_hash='HEAD', - target=self._GetTargetFromConfiguration(configuration), + target='performance_test_suite', patch=self._GetBranchIssueUrl(), bug_id=self.bug_id or '', story=self.story, extra_test_args='--pageset-repeat=%d' % self.repeat, configuration=configuration, - benchmark='system_health.common_%s' % - ('desktop' if self._IsDesktop() else 'mobile')) + benchmark='system_health.common_%s' % ( + 'desktop' if self._IsDesktop() else 'mobile')) except request.RequestError as e: cli_helpers.Comment( 'Failed to start a Pinpoint job for {config} automatically:\n {err}',
diff --git a/tools/perf/cli_tools/update_wpr/update_wpr_unittest.py b/tools/perf/cli_tools/update_wpr/update_wpr_unittest.py index 639e6dc9..a289965 100644 --- a/tools/perf/cli_tools/update_wpr/update_wpr_unittest.py +++ b/tools/perf/cli_tools/update_wpr/update_wpr_unittest.py
@@ -378,15 +378,12 @@ benchmark='system_health.common_desktop') self.assertEqual(new_job.call_count, 3) - @mock.patch(WPR_UPDATER + 'WprUpdater._GetTargetFromConfiguration', - return_value='performance_test_suite') @mock.patch(WPR_UPDATER + 'WprUpdater._GetBranchIssueUrl', return_value='<issue-url>') @mock.patch('core.services.pinpoint_service.NewJob', side_effect=request.ServerError( mock.Mock(), mock.Mock(status=500), '')) - def testStartPinPointJobsMobileFail(self, new_job, get_branch_issue_url, - get_target): + def testStartPinPointJobsMobileFail(self, new_job, get_branch_issue_url): del get_branch_issue_url # Unused. self.wpr_updater.device_id = '<serial>' self.assertEqual( @@ -400,15 +397,6 @@ extra_test_args='--pageset-repeat=1', configuration='<config>', benchmark='system_health.common_mobile') - get_target.assert_called_once_with('<config>') - - @mock.patch('core.services.pinpoint_service.NewJob', - side_effect=request.ServerError(mock.Mock(), - mock.Mock(status=500), '')) - def testStartPinpointJobsInvalidConfig(self, new_job): - with self.assertRaises(RuntimeError): - self.wpr_updater.StartPinpointJobs(['<config>']) - new_job.assert_not_called() if __name__ == "__main__":
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index 0e5fe4a..ea978cb9 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -27,7 +27,6 @@ import tempfile import textwrap -from chrome_telemetry_build import android_browser_types from core import benchmark_finders from core import benchmark_utils from core import bot_platforms @@ -128,11 +127,9 @@ }, 'android-pixel2-perf-calibration': { 'tests': [{ - 'isolate': - 'performance_test_suite_android_clank_monochrome_64_32_bundle', + 'isolate': 'performance_test_suite', }], - 'platform': - 'android-chrome-64-bundle', + 'platform': 'android-chrome-64-bundle', 'dimension': { 'pool': 'chrome.tests.perf', 'os': 'Android', @@ -159,7 +156,7 @@ 'android-nexus5x-perf-fyi': { 'tests': [{ 'isolate': - 'performance_test_suite_android_clank_chrome', + 'performance_test_suite', 'extra_args': [ '--output-format=histograms', '--experimental-tbmv3-metrics', @@ -178,7 +175,7 @@ 'android-pixel2-perf-fyi': { 'tests': [{ 'isolate': - 'performance_test_suite_android_clank_chrome', + 'performance_test_suite', 'extra_args': [ '--output-format=histograms', '--experimental-tbmv3-metrics', @@ -198,11 +195,9 @@ }, 'android-pixel2-perf-aab-fyi': { 'tests': [{ - 'isolate': - 'performance_test_suite_android_clank_monochrome_bundle', + 'isolate': 'performance_test_suite', }], - 'platform': - 'android-chrome-bundle', + 'platform': 'android-chrome-bundle', 'dimension': { 'pool': 'chrome.tests.perf-fyi', 'os': 'Android', @@ -544,7 +539,7 @@ 'android-go-perf': { 'tests': [{ 'name': 'performance_test_suite', - 'isolate': 'performance_test_suite_android_clank_chrome', + 'isolate': 'performance_test_suite', }], 'platform': 'android-chrome', @@ -572,7 +567,7 @@ 'Android Nexus5 Perf': { 'tests': [ { - 'isolate': 'performance_test_suite_android_chrome', + 'isolate': 'performance_test_suite', 'extra_args': [ '--assert-gpu-compositing', ], @@ -633,11 +628,9 @@ }, 'android-pixel2-perf': { 'tests': [{ - 'isolate': - 'performance_test_suite_android_clank_monochrome_64_32_bundle', + 'isolate': 'performance_test_suite', }], - 'platform': - 'android-chrome-64-bundle', + 'platform': 'android-chrome-64-bundle', 'dimension': { 'pool': 'chrome.tests.perf', 'os': 'Android', @@ -674,11 +667,9 @@ }, 'android-pixel4-perf': { 'tests': [{ - 'isolate': - 'performance_test_suite_android_clank_trichrome_bundle', + 'isolate': 'performance_test_suite', }], - 'platform': - 'android-trichrome-bundle', + 'platform': 'android-trichrome-bundle', 'dimension': { 'pool': 'chrome.tests.perf', 'os': 'Android', @@ -689,7 +680,7 @@ }, 'android-pixel4a_power-perf': { 'tests': [{ - 'isolate': 'performance_test_suite_android_clank_chrome', + 'isolate': 'performance_test_suite', 'extra_args': [ '--experimental-tbmv3-metrics', ], @@ -1189,15 +1180,6 @@ TELEMETRY_PERF_BENCHMARKS = _get_telemetry_perf_benchmarks_metadata() -PERFORMANCE_TEST_SUITES = [ - 'performance_test_suite', - 'performance_test_suite_eve', - 'performance_webview_test_suite', - 'performance_weblayer_test_suite', -] -for suffix in android_browser_types.TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES: - PERFORMANCE_TEST_SUITES.append('performance_test_suite' + suffix) - def get_scheduled_non_telemetry_benchmarks(perf_waterfall_file): test_names = set() @@ -1217,7 +1199,9 @@ # TODO(eyaich): Determine new way to generate ownership based # on the benchmark bot map instead of on the generated tests # for new perf recipe. - if not name in PERFORMANCE_TEST_SUITES: + if not name in ('performance_test_suite', 'performance_test_suite_eve', + 'performance_webview_test_suite', + 'performance_weblayer_test_suite'): test_names.add(name) for platform in bot_platforms.ALL_PLATFORMS:
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py index b5d6d49..12faa15f 100644 --- a/tools/perf/core/perf_json_config_validator.py +++ b/tools/perf/core/perf_json_config_validator.py
@@ -6,7 +6,6 @@ import os import json -from chrome_telemetry_build import android_browser_types from core import path_util from core import bot_platforms @@ -42,14 +41,6 @@ 'android-webview-trichrome-google-bundle', } -_PERFORMANCE_TEST_SUITES = { - 'performance_test_suite', - 'performance_test_suite_eve', - 'performance_webview_test_suite', -} -for suffix in android_browser_types.TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES: - _PERFORMANCE_TEST_SUITES.add('performance_test_suite' + suffix) - def _ValidateSwarmingDimension(builder_name, swarming_dimensions): for dimension in swarming_dimensions: @@ -153,16 +144,21 @@ _ValidateSwarmingDimension( builder_name, swarming_dimensions=test_config['swarming'].get('dimension_sets', {})) - if test_config['isolate_name'] in _PERFORMANCE_TEST_SUITES: + if (test_config['isolate_name'] in ('performance_test_suite', + 'performance_test_suite_eve', + 'performance_webview_test_suite')): _ValidateShardingData(builder_name, test_config) _ValidateBrowserType(builder_name, test_config) - if any(suite in test_names for suite in _PERFORMANCE_TEST_SUITES): - if test_names[-1] not in _PERFORMANCE_TEST_SUITES: + if ('performance_test_suite' in test_names or + 'performance_webview_test_suite' in test_names): + if test_names[-1] not in ('performance_test_suite', + 'performance_webview_test_suite'): raise ValueError( - 'performance_test_suite-based targets must run at the end of builder ' - '%s to avoid starving other test step (see crbug.com/873389). ' - 'Instead found %s' % (repr(builder_name), test_names[-1])) + 'performance_test_suite or performance_webview_test_suite must run ' + 'at the end of builder %s to avoid starving other test step ' + '(see crbug.com/873389). Instead found %s' % ( + repr(builder_name), test_names[-1]))
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 9c50be3..3b23049 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@ { "trace_processor_shell": { "win": { - "hash": "fc071b45f30889655dfadfcffe25de7375506e25", - "remote_path": "perfetto_binaries/trace_processor_shell/win/8aac4c8c54b781da3af65faf854760431c57c30e/trace_processor_shell.exe" + "hash": "85bc71120c59f2ab727b77378dd0b824a04ac30c", + "remote_path": "perfetto_binaries/trace_processor_shell/win/55fac0c2d4020a4dbef64c90617ddac1d4e8e23d/trace_processor_shell.exe" }, "mac": { - "hash": "43b91afcc561bce2ed3e2cb9dcbf6f25e6bd7596", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/8aac4c8c54b781da3af65faf854760431c57c30e/trace_processor_shell" + "hash": "a5e635576b2b1575f0f76f4f318042fe2399f593", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/55fac0c2d4020a4dbef64c90617ddac1d4e8e23d/trace_processor_shell" }, "linux": { - "hash": "ed465e0266e0f143e24cad83e63b727c140aa52d", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/8aac4c8c54b781da3af65faf854760431c57c30e/trace_processor_shell" + "hash": "d5aeb6c6ac6e74708edac28b35dec2df7792f671", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/55fac0c2d4020a4dbef64c90617ddac1d4e8e23d/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/roll_webgl_conformance.py b/tools/roll_webgl_conformance.py index 3c337454..a3749f9 100755 --- a/tools/roll_webgl_conformance.py +++ b/tools/roll_webgl_conformance.py
@@ -81,6 +81,7 @@ def _ParseDepsFile(filename): + logging.debug('Parsing deps file %s', filename) with open(filename, 'rb') as f: deps_content = f.read() return _ParseDepsDict(deps_content) @@ -167,14 +168,17 @@ def _GetCommitInfo(self, path_below_src, git_hash=None, git_repo_url=None): working_dir = os.path.join(self._chromium_src, path_below_src) self._RunCommand(['git', 'fetch', 'origin'], working_dir=working_dir) - revision_range = git_hash or 'origin' + revision_range = git_hash or 'origin/main' ret = self._RunCommand( ['git', '--no-pager', 'log', revision_range, '--no-abbrev-commit', '--pretty=full', '-1'], working_dir=working_dir) - return CommitInfo(_ParseGitCommitHash(ret), git_repo_url) + parsed_hash = _ParseGitCommitHash(ret) + logging.debug('parsed Git commit hash: %s', parsed_hash) + return CommitInfo(parsed_hash, git_repo_url) def _GetDepsCommitInfo(self, deps_dict, path_below_src): + logging.debug('Getting deps commit info for %s', path_below_src) entry = deps_dict['deps'][_PosixPath('src/%s' % path_below_src)] at_index = entry.find('@') git_repo_url = entry[:at_index] @@ -248,8 +252,8 @@ # cross platform compatibility. if not ignore_checks: - if self._GetCurrentBranchName() != 'master': - logging.error('Please checkout the master branch.') + if self._GetCurrentBranchName() != 'main': + logging.error('Please checkout the main branch.') return -1 if not self._IsTreeClean(): logging.error('Please make sure you don\'t have any modified files.') @@ -303,8 +307,8 @@ cl_info = self._GetCLInfo() print('Issue: %d URL: %s' % (cl_info.issue, cl_info.url)) - # Checkout master again. - self._RunCommand(['git', 'checkout', 'master']) + # Checkout main again. + self._RunCommand(['git', 'checkout', 'main']) print('Roll branch left as ' + ROLL_BRANCH_NAME) return 0 @@ -329,7 +333,7 @@ print('Current webgl revision %s' % commit_info.git_commit, file=fh) def _DeleteRollBranch(self): - self._RunCommand(['git', 'checkout', 'master']) + self._RunCommand(['git', 'checkout', 'main']) self._RunCommand(['git', 'branch', '-D', ROLL_BRANCH_NAME]) logging.debug('Deleted the local roll branch (%s)', ROLL_BRANCH_NAME) @@ -357,7 +361,7 @@ def Abort(self): active_branch, branches = self._GetBranches() if active_branch == ROLL_BRANCH_NAME: - active_branch = 'master' + active_branch = 'main' if ROLL_BRANCH_NAME in branches: print('Aborting pending roll.') self._RunCommand(['git', 'checkout', ROLL_BRANCH_NAME]) @@ -375,8 +379,11 @@ help=('Aborts a previously prepared roll. ' 'Closes any associated issues and deletes the roll branches'), action='store_true') - parser.add_argument('--ignore-checks', action='store_true', default=False, - help=('Skips checks for being on the master branch, dirty workspaces and ' + parser.add_argument( + '--ignore-checks', + action='store_true', + default=False, + help=('Skips checks for being on the main branch, dirty workspaces and ' 'the updating of the checkout. Will still delete and create local ' 'Git branches.')) parser.add_argument('--run-tryjobs', action='store_true', default=False,
diff --git a/tools/web_dev_style/js_checker.py b/tools/web_dev_style/js_checker.py index af7eb4c..274821a 100644 --- a/tools/web_dev_style/js_checker.py +++ b/tools/web_dev_style/js_checker.py
@@ -98,7 +98,7 @@ affected_files = self.input_api.AffectedFiles(file_filter=self.file_filter, include_deletes=False) - affected_js_files = filter(lambda f: f.LocalPath().endswith(".js"), + affected_js_files = filter(lambda f: f.LocalPath().endswith((".js", ".ts")), affected_files) if affected_js_files:
diff --git a/tools/web_dev_style/js_checker_eslint_test.py b/tools/web_dev_style/js_checker_eslint_test.py index 36b2e50..5bcee36 100755 --- a/tools/web_dev_style/js_checker_eslint_test.py +++ b/tools/web_dev_style/js_checker_eslint_test.py
@@ -21,8 +21,8 @@ def tearDown(self): os.remove(self._tmp_file) - def _runChecks(self, file_contents): - tmp_args = {'suffix': '.js', 'dir': _HERE_PATH, 'delete': False} + def _runChecks(self, file_contents, file_type): + tmp_args = {'suffix': '.' + file_type, 'dir': _HERE_PATH, 'delete': False} with tempfile.NamedTemporaryFile(**tmp_args) as f: self._tmp_file = f.name f.write(file_contents) @@ -47,11 +47,18 @@ self.assertEqual(line, message.get('line')) def testGetElementByIdCheck(self): - results = self._runChecks("const a = document.getElementById('foo');") + results = self._runChecks("const a = document.getElementById('foo');", 'js') + self._assertError(results, 'no-restricted-properties', 1) + + results = self._runChecks( + "const a: HTMLELement = document.getElementById('foo');", 'ts') self._assertError(results, 'no-restricted-properties', 1) def testPrimitiveWrappersCheck(self): - results = self._runChecks('const a = new Number(1);') + results = self._runChecks('const a = new Number(1);', 'js') + self._assertError(results, 'no-new-wrappers', 1) + + results = self._runChecks('const a: number = new Number(1);', 'ts') self._assertError(results, 'no-new-wrappers', 1)
diff --git a/tools/web_dev_style/presubmit_support.py b/tools/web_dev_style/presubmit_support.py index a44995f..59a8746 100644 --- a/tools/web_dev_style/presubmit_support.py +++ b/tools/web_dev_style/presubmit_support.py
@@ -10,7 +10,7 @@ def IsResource(f): - return f.LocalPath().endswith(('.html', '.css', '.js')) + return f.LocalPath().endswith(('.html', '.css', '.js', '.ts')) def CheckStyle(input_api, output_api, file_filter=lambda f: True): @@ -29,11 +29,13 @@ def CheckStyleESLint(input_api, output_api): - is_js = lambda f: f.LocalPath().endswith('.js') - js_files = input_api.AffectedFiles(file_filter=is_js, include_deletes=False) - if not js_files: + should_check = lambda f: f.LocalPath().endswith(('.js', '.ts')) + files_to_check = input_api.AffectedFiles(file_filter=should_check, + include_deletes=False) + if not files_to_check: return [] - return js_checker.JSChecker(input_api, output_api).RunEsLintChecks(js_files) + return js_checker.JSChecker(input_api, + output_api).RunEsLintChecks(files_to_check) def DisallowIncludes(input_api, output_api, msg):
diff --git a/ui/accessibility/aura/aura_window_properties.cc b/ui/accessibility/aura/aura_window_properties.cc index b69bfdd..a9473d84 100644 --- a/ui/accessibility/aura/aura_window_properties.cc +++ b/ui/accessibility/aura/aura_window_properties.cc
@@ -18,6 +18,4 @@ kAXRoleOverride, ax::mojom::Role::kNone) -DEFINE_UI_CLASS_PROPERTY_KEY(bool, kAXConsiderInvisibleAndIgnoreChildren, false) - } // namespace ui
diff --git a/ui/accessibility/aura/aura_window_properties.h b/ui/accessibility/aura/aura_window_properties.h index 92334a7..9fa2b82 100644 --- a/ui/accessibility/aura/aura_window_properties.h +++ b/ui/accessibility/aura/aura_window_properties.h
@@ -22,11 +22,6 @@ AX_EXPORT extern const aura::WindowProperty<ax::mojom::Role>* const kAXRoleOverride; -// Whether to force a window to be invisible with its children ignored. Used -// to hide the non-lock screen contents when the lock screen is shown. -AX_EXPORT extern const aura::WindowProperty<bool>* const - kAXConsiderInvisibleAndIgnoreChildren; - } // namespace ui #endif // UI_ACCESSIBILITY_AURA_AURA_WINDOW_PROPERTIES_H_
diff --git a/ui/accessibility/ax_computed_node_data.cc b/ui/accessibility/ax_computed_node_data.cc index 8b19821..bc012682 100644 --- a/ui/accessibility/ax_computed_node_data.cc +++ b/ui/accessibility/ax_computed_node_data.cc
@@ -5,6 +5,7 @@ #include "ui/accessibility/ax_computed_node_data.h" #include "base/logging.h" +#include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node.h" @@ -18,6 +19,49 @@ AXComputedNodeData::~AXComputedNodeData() = default; +bool AXComputedNodeData::HasOrCanComputeAttribute( + const ax::mojom::StringAttribute attribute) const { + DCHECK(owner_); + if (owner_->data().HasStringAttribute(attribute)) + return true; + + switch (attribute) { + case ax::mojom::StringAttribute::kValue: + // The value attribute could be computed on the browser for content + // editables and ARIA text/search boxes. + return owner_->data().IsNonAtomicTextField(); + default: + return false; + } +} + +const std::string& AXComputedNodeData::GetOrComputeAttributeUTF8( + const ax::mojom::StringAttribute attribute) const { + DCHECK(owner_); + if (owner_->data().HasStringAttribute(attribute)) + return owner_->data().GetStringAttribute(attribute); + + switch (attribute) { + case ax::mojom::StringAttribute::kValue: + if (owner_->data().IsNonAtomicTextField()) { + DCHECK(HasOrCanComputeAttribute(attribute)) + << "Code in `HasOrCanComputeAttribute` should be in sync with " + "'GetOrComputeAttributeUTF8`"; + return GetOrComputeInnerTextUTF8(); + } + return base::EmptyString(); + default: + // This is a special case: for performance reasons do not use + // `base::EmptyString()` in other places throughout the codebase. + return base::EmptyString(); + } +} + +std::u16string AXComputedNodeData::GetOrComputeAttributeUTF16( + const ax::mojom::StringAttribute attribute) const { + return base::UTF8ToUTF16(GetOrComputeAttributeUTF8(attribute)); +} + const std::string& AXComputedNodeData::GetOrComputeInnerTextUTF8() const { if (!inner_text_utf8_) { VLOG_IF(1, inner_text_utf16_)
diff --git a/ui/accessibility/ax_computed_node_data.h b/ui/accessibility/ax_computed_node_data.h index 7fdbbad..207b30d4 100644 --- a/ui/accessibility/ax_computed_node_data.h +++ b/ui/accessibility/ax_computed_node_data.h
@@ -8,6 +8,7 @@ #include <string> #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/accessibility/ax_enums.mojom-forward.h" #include "ui/accessibility/ax_export.h" namespace ui { @@ -25,6 +26,21 @@ AXComputedNodeData(const AXComputedNodeData& other) = delete; AXComputedNodeData& operator=(const AXComputedNodeData& other) = delete; + // Given an accessibility string attribute, returns whether the attribute is + // currently present in the node's data, or if it can always be computed on + // demand. + bool HasOrCanComputeAttribute( + const ax::mojom::StringAttribute attribute) const; + + // Given an accessibility string attribute, returns the attribute's value. The + // attribute is computed if not provided by the tree's source, otherwise it is + // simply returned from the node's data. String attributes are potentially the + // slowest to compute at the tree's source, e.g. in Blink. + const std::string& GetOrComputeAttributeUTF8( + const ax::mojom::StringAttribute attribute) const; + std::u16string GetOrComputeAttributeUTF16( + const ax::mojom::StringAttribute attribute) const; + // Retrieves from the cache or computes the on-screen text that is found // inside the associated node and all its descendants, caches the result, and // returns a reference to the cached text.
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc index fd47266d..cbd5755 100644 --- a/ui/accessibility/ax_node.cc +++ b/ui/accessibility/ax_node.cc
@@ -701,12 +701,44 @@ return color; } +bool AXNode::HasStringAttribute(ax::mojom::StringAttribute attribute) const { + return GetComputedNodeData().HasOrCanComputeAttribute(attribute); +} + +const std::string& AXNode::GetStringAttribute( + ax::mojom::StringAttribute attribute) const { + return GetComputedNodeData().GetOrComputeAttributeUTF8(attribute); +} + +bool AXNode::GetStringAttribute(ax::mojom::StringAttribute attribute, + std::string* value) const { + if (GetComputedNodeData().HasOrCanComputeAttribute(attribute)) { + *value = GetComputedNodeData().GetOrComputeAttributeUTF8(attribute); + return true; + } + return false; +} + +std::u16string AXNode::GetString16Attribute( + ax::mojom::StringAttribute attribute) const { + return GetComputedNodeData().GetOrComputeAttributeUTF16(attribute); +} + +bool AXNode::GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const { + if (GetComputedNodeData().HasOrCanComputeAttribute(attribute)) { + *value = GetComputedNodeData().GetOrComputeAttributeUTF16(attribute); + return true; + } + return false; +} + const std::string& AXNode::GetInheritedStringAttribute( ax::mojom::StringAttribute attribute) const { const AXNode* current_node = this; do { - if (current_node->data().HasStringAttribute(attribute)) - return current_node->data().GetStringAttribute(attribute); + if (current_node->HasStringAttribute(attribute)) + return current_node->GetStringAttribute(attribute); current_node = current_node->parent(); } while (current_node); return base::EmptyString(); @@ -845,15 +877,12 @@ for (const AXNode* cur = this; cur; cur = cur->parent()) { // If language detection has assigned a language then we prefer that. const AXLanguageInfo* lang_info = cur->GetLanguageInfo(); - if (lang_info && !lang_info->language.empty()) { + if (lang_info && !lang_info->language.empty()) return lang_info->language; - } // If the page author has declared a language attribute we fallback to that. - const AXNodeData& data = cur->data(); - if (data.HasStringAttribute(ax::mojom::StringAttribute::kLanguage)) { - return data.GetStringAttribute(ax::mojom::StringAttribute::kLanguage); - } + if (cur->HasStringAttribute(ax::mojom::StringAttribute::kLanguage)) + return cur->GetStringAttribute(ax::mojom::StringAttribute::kLanguage); } return std::string(); @@ -869,7 +898,7 @@ return GetValueForColorWell(); if (!IsControl(data().role)) return std::string(); - return data().GetStringAttribute(ax::mojom::StringAttribute::kValue); + return GetStringAttribute(ax::mojom::StringAttribute::kValue); } std::ostream& operator<<(std::ostream& stream, const AXNode& node) { @@ -1434,7 +1463,7 @@ std::string AXNode::GetTextForRangeValue() const { DCHECK(data().IsRangeValueSupported()); std::string range_value = - data().GetStringAttribute(ax::mojom::StringAttribute::kValue); + GetStringAttribute(ax::mojom::StringAttribute::kValue); float numeric_value; if (range_value.empty() && data().GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange, @@ -1459,8 +1488,7 @@ std::string AXNode::GetValueForTextField() const { DCHECK(data().IsTextField()); - std::string value = - data().GetStringAttribute(ax::mojom::StringAttribute::kValue); + std::string value = GetStringAttribute(ax::mojom::StringAttribute::kValue); // Some screen readers like Jaws and VoiceOver require a value to be set in // text fields with rich content, even though the same information is // available on the children. @@ -1576,8 +1604,7 @@ case ax::mojom::Role::kImage: { // Images are not leaves when they are image maps. Therefore, do not // truncate descendants except in the case where ARIA role=img. - std::string role = - data().GetStringAttribute(ax::mojom::StringAttribute::kRole); + std::string role = GetStringAttribute(ax::mojom::StringAttribute::kRole); return role == "img" || role == "image"; } case ax::mojom::Role::kDocCover:
diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h index b3222a0..3206a68 100644 --- a/ui/accessibility/ax_node.h +++ b/ui/accessibility/ax_node.h
@@ -274,8 +274,14 @@ SkColor ComputeColor() const; SkColor ComputeBackgroundColor() const; - // Accessing accessibility attributes. - // See |AXNodeData| for more information. + // + // Methods for accessing accessibility attributes including attributes that + // are computed on the browser side. (See `AXNodeData` and + // `AXComputedNodeData` for more information.) + // + // Please prefer using the methods in this file for retrieving attributes, as + // computed attributes would be automatically returned if available. + // bool HasBoolAttribute(ax::mojom::BoolAttribute attribute) const { return data().HasBoolAttribute(attribute); @@ -308,26 +314,21 @@ return data().GetIntAttribute(attribute, value); } - bool HasStringAttribute(ax::mojom::StringAttribute attribute) const { - return data().HasStringAttribute(attribute); - } + bool HasStringAttribute(ax::mojom::StringAttribute attribute) const; const std::string& GetStringAttribute( - ax::mojom::StringAttribute attribute) const { - return data().GetStringAttribute(attribute); - } + ax::mojom::StringAttribute attribute) const; bool GetStringAttribute(ax::mojom::StringAttribute attribute, - std::string* value) const { - return data().GetStringAttribute(attribute, value); - } + std::string* value) const; - bool GetString16Attribute(ax::mojom::StringAttribute attribute, - std::u16string* value) const { - return data().GetString16Attribute(attribute, value); - } std::u16string GetString16Attribute( - ax::mojom::StringAttribute attribute) const { - return data().GetString16Attribute(attribute); - } + ax::mojom::StringAttribute attribute) const; + bool GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const; + + const std::string& GetInheritedStringAttribute( + ax::mojom::StringAttribute attribute) const; + std::u16string GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const; bool HasIntListAttribute(ax::mojom::IntListAttribute attribute) const { return data().HasIntListAttribute(attribute); @@ -353,10 +354,10 @@ return data().GetStringListAttribute(attribute, value); } - bool GetHtmlAttribute(const char* attribute, std::u16string* value) const { + bool GetHtmlAttribute(const char* attribute, std::string* value) const { return data().GetHtmlAttribute(attribute, value); } - bool GetHtmlAttribute(const char* attribute, std::string* value) const { + bool GetHtmlAttribute(const char* attribute, std::u16string* value) const { return data().GetHtmlAttribute(attribute, value); } @@ -378,11 +379,6 @@ // for ordered sets. bool IsIgnoredContainerForOrderedSet() const; - const std::string& GetInheritedStringAttribute( - ax::mojom::StringAttribute attribute) const; - std::u16string GetInheritedString16Attribute( - ax::mojom::StringAttribute attribute) const; - // If this node is a leaf, returns the inner text of this node. This is // equivalent to its visible accessible name. Otherwise, if this node is not a // leaf, represents every non-textual child node with a special "embedded
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc index 44b0ef7..3c5aede 100644 --- a/ui/accessibility/ax_node_data.cc +++ b/ui/accessibility/ax_node_data.cc
@@ -425,12 +425,12 @@ return false; } -bool AXNodeData::GetHtmlAttribute(const char* html_attr, +bool AXNodeData::GetHtmlAttribute(const char* attribute, std::string* value) const { for (const std::pair<std::string, std::string>& html_attribute : html_attributes) { const std::string& attr = html_attribute.first; - if (base::LowerCaseEqualsASCII(attr, html_attr)) { + if (base::LowerCaseEqualsASCII(attr, attribute)) { *value = html_attribute.second; return true; } @@ -439,25 +439,15 @@ return false; } -bool AXNodeData::GetHtmlAttribute(const char* html_attr, +bool AXNodeData::GetHtmlAttribute(const char* attribute, std::u16string* value) const { std::string value_utf8; - if (!GetHtmlAttribute(html_attr, &value_utf8)) + if (!GetHtmlAttribute(attribute, &value_utf8)) return false; *value = base::UTF8ToUTF16(value_utf8); return true; } -void AXNodeData::AddStringAttribute(ax::mojom::StringAttribute attribute, - const std::string& value) { - DCHECK_NE(attribute, ax::mojom::StringAttribute::kNone); - DCHECK_NE(attribute, ax::mojom::StringAttribute::kChildTreeId) - << "Use AddChildTreeId."; - if (HasStringAttribute(attribute)) - RemoveStringAttribute(attribute); - string_attributes.push_back(std::make_pair(attribute, value)); -} - void AXNodeData::AddChildTreeId(const AXTreeID& tree_id) { ax::mojom::StringAttribute attribute = ax::mojom::StringAttribute::kChildTreeId; @@ -466,6 +456,14 @@ string_attributes.push_back(std::make_pair(attribute, tree_id.ToString())); } +void AXNodeData::AddBoolAttribute(ax::mojom::BoolAttribute attribute, + bool value) { + DCHECK_NE(attribute, ax::mojom::BoolAttribute::kNone); + if (HasBoolAttribute(attribute)) + RemoveBoolAttribute(attribute); + bool_attributes.push_back(std::make_pair(attribute, value)); +} + void AXNodeData::AddIntAttribute(ax::mojom::IntAttribute attribute, int value) { DCHECK_NE(attribute, ax::mojom::IntAttribute::kNone); if (HasIntAttribute(attribute)) @@ -481,12 +479,14 @@ float_attributes.push_back(std::make_pair(attribute, value)); } -void AXNodeData::AddBoolAttribute(ax::mojom::BoolAttribute attribute, - bool value) { - DCHECK_NE(attribute, ax::mojom::BoolAttribute::kNone); - if (HasBoolAttribute(attribute)) - RemoveBoolAttribute(attribute); - bool_attributes.push_back(std::make_pair(attribute, value)); +void AXNodeData::AddStringAttribute(ax::mojom::StringAttribute attribute, + const std::string& value) { + DCHECK_NE(attribute, ax::mojom::StringAttribute::kNone); + DCHECK_NE(attribute, ax::mojom::StringAttribute::kChildTreeId) + << "Use AddChildTreeId."; + if (HasStringAttribute(attribute)) + RemoveStringAttribute(attribute); + string_attributes.push_back(std::make_pair(attribute, value)); } void AXNodeData::AddIntListAttribute(ax::mojom::IntListAttribute attribute, @@ -506,10 +506,10 @@ stringlist_attributes.push_back(std::make_pair(attribute, value)); } -void AXNodeData::RemoveStringAttribute(ax::mojom::StringAttribute attribute) { - DCHECK_NE(attribute, ax::mojom::StringAttribute::kNone); - base::EraseIf(string_attributes, [attribute](const auto& string_attribute) { - return string_attribute.first == attribute; +void AXNodeData::RemoveBoolAttribute(ax::mojom::BoolAttribute attribute) { + DCHECK_NE(attribute, ax::mojom::BoolAttribute::kNone); + base::EraseIf(bool_attributes, [attribute](const auto& bool_attribute) { + return bool_attribute.first == attribute; }); } @@ -527,10 +527,10 @@ }); } -void AXNodeData::RemoveBoolAttribute(ax::mojom::BoolAttribute attribute) { - DCHECK_NE(attribute, ax::mojom::BoolAttribute::kNone); - base::EraseIf(bool_attributes, [attribute](const auto& bool_attribute) { - return bool_attribute.first == attribute; +void AXNodeData::RemoveStringAttribute(ax::mojom::StringAttribute attribute) { + DCHECK_NE(attribute, ax::mojom::StringAttribute::kNone); + base::EraseIf(string_attributes, [attribute](const auto& string_attribute) { + return string_attribute.first == attribute; }); }
diff --git a/ui/accessibility/ax_node_data.h b/ui/accessibility/ax_node_data.h index 92fd945..0c29a42b 100644 --- a/ui/accessibility/ax_node_data.h +++ b/ui/accessibility/ax_node_data.h
@@ -91,10 +91,10 @@ bool GetStringAttribute(ax::mojom::StringAttribute attribute, std::string* value) const; - bool GetString16Attribute(ax::mojom::StringAttribute attribute, - std::u16string* value) const; std::u16string GetString16Attribute( ax::mojom::StringAttribute attribute) const; + bool GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const; bool HasIntListAttribute(ax::mojom::IntListAttribute attribute) const; const std::vector<int32_t>& GetIntListAttribute( @@ -108,8 +108,8 @@ bool GetStringListAttribute(ax::mojom::StringListAttribute attribute, std::vector<std::string>* value) const; - bool GetHtmlAttribute(const char* attribute, std::u16string* value) const; bool GetHtmlAttribute(const char* attribute, std::string* value) const; + bool GetHtmlAttribute(const char* attribute, std::u16string* value) const; // // Setting accessibility attributes. @@ -119,14 +119,14 @@ // have wanted or what existing code already assumes. // + void AddBoolAttribute(ax::mojom::BoolAttribute attribute, bool value); + void AddChildTreeId(const ui::AXTreeID& tree_id); + void AddIntAttribute(ax::mojom::IntAttribute attribute, int32_t value); + void AddFloatAttribute(ax::mojom::FloatAttribute attribute, float value); // This method cannot be used to set kChildTreeId due to a common // misuse of base::UnguessableToken serialization. Use AddChildTreeId instead. void AddStringAttribute(ax::mojom::StringAttribute attribute, const std::string& value); - void AddChildTreeId(const ui::AXTreeID& tree_id); - void AddIntAttribute(ax::mojom::IntAttribute attribute, int32_t value); - void AddFloatAttribute(ax::mojom::FloatAttribute attribute, float value); - void AddBoolAttribute(ax::mojom::BoolAttribute attribute, bool value); void AddIntListAttribute(ax::mojom::IntListAttribute attribute, const std::vector<int32_t>& value); void AddStringListAttribute(ax::mojom::StringListAttribute attribute, @@ -136,10 +136,10 @@ // Removing accessibility attributes. // - void RemoveStringAttribute(ax::mojom::StringAttribute attribute); + void RemoveBoolAttribute(ax::mojom::BoolAttribute attribute); void RemoveIntAttribute(ax::mojom::IntAttribute attribute); void RemoveFloatAttribute(ax::mojom::FloatAttribute attribute); - void RemoveBoolAttribute(ax::mojom::BoolAttribute attribute); + void RemoveStringAttribute(ax::mojom::StringAttribute attribute); void RemoveIntListAttribute(ax::mojom::IntListAttribute attribute); void RemoveStringListAttribute(ax::mojom::StringListAttribute attribute);
diff --git a/ui/accessibility/ax_node_unittest.cc b/ui/accessibility/ax_node_unittest.cc index 569e1e00..2c26e18 100644 --- a/ui/accessibility/ax_node_unittest.cc +++ b/ui/accessibility/ax_node_unittest.cc
@@ -130,7 +130,7 @@ initial_state.tree_data = tree_data; AXTree tree; - ASSERT_TRUE(tree.Unserialize(initial_state)); + ASSERT_TRUE(tree.Unserialize(initial_state)) << tree.error(); const AXNode* root_node = tree.root(); ASSERT_EQ(root.id, root_node->id()); @@ -393,6 +393,112 @@ EXPECT_EQ(root_node_1, root_node_2->GetUnignoredParentCrossingTreeBoundary()); } +TEST(AXNodeTest, GetValueForControlTextField) { + // kRootWebArea + // ++kTextField (contenteditable) + // ++++kGenericContainer + // ++++++kStaticText "Line 1" + // ++++++kLineBreak '\n' + // ++++++kStaticText "Line 2" + + AXNodeData root; + root.id = 1; + AXNodeData rich_text_field; + rich_text_field.id = 2; + AXNodeData rich_text_field_text_container; + rich_text_field_text_container.id = 3; + AXNodeData rich_text_field_line_1; + rich_text_field_line_1.id = 4; + AXNodeData rich_text_field_line_break; + rich_text_field_line_break.id = 5; + AXNodeData rich_text_field_line_2; + rich_text_field_line_2.id = 6; + + root.role = ax::mojom::Role::kRootWebArea; + root.child_ids = {rich_text_field.id}; + + rich_text_field.role = ax::mojom::Role::kTextField; + rich_text_field.AddState(ax::mojom::State::kEditable); + rich_text_field.AddState(ax::mojom::State::kRichlyEditable); + rich_text_field.AddBoolAttribute( + ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true); + rich_text_field.SetName("Rich text field"); + rich_text_field.child_ids = {rich_text_field_text_container.id}; + + rich_text_field_text_container.role = ax::mojom::Role::kGenericContainer; + rich_text_field_text_container.AddState(ax::mojom::State::kIgnored); + rich_text_field_text_container.AddState(ax::mojom::State::kEditable); + rich_text_field_text_container.AddState(ax::mojom::State::kRichlyEditable); + rich_text_field_text_container.child_ids = {rich_text_field_line_1.id, + rich_text_field_line_break.id, + rich_text_field_line_2.id}; + + rich_text_field_line_1.role = ax::mojom::Role::kStaticText; + rich_text_field_line_1.AddState(ax::mojom::State::kEditable); + rich_text_field_line_1.AddState(ax::mojom::State::kRichlyEditable); + rich_text_field_line_1.SetName("Line 1"); + + rich_text_field_line_break.role = ax::mojom::Role::kLineBreak; + rich_text_field_line_break.AddState(ax::mojom::State::kEditable); + rich_text_field_line_break.AddState(ax::mojom::State::kRichlyEditable); + rich_text_field_line_break.SetName("\n"); + + rich_text_field_line_2.role = ax::mojom::Role::kStaticText; + rich_text_field_line_2.AddState(ax::mojom::State::kEditable); + rich_text_field_line_2.AddState(ax::mojom::State::kRichlyEditable); + rich_text_field_line_2.SetName("Line 2"); + + AXTreeUpdate update; + update.has_tree_data = true; + update.tree_data.tree_id = AXTreeID::CreateNewAXTreeID(); + update.root_id = root.id; + update.nodes = {root, + rich_text_field, + rich_text_field_text_container, + rich_text_field_line_1, + rich_text_field_line_break, + rich_text_field_line_2}; + + AXTree tree(update); + { + const AXNode* text_field_node = tree.GetFromId(rich_text_field.id); + ASSERT_NE(nullptr, text_field_node); + EXPECT_EQ("Line 1\nLine 2", text_field_node->GetValueForControl()); + } + + // Only rich text fields should have their value attribute automatically + // computed from their inner text. Atomic text fields, such as <input> or + // <textarea> should not. + rich_text_field.RemoveState(ax::mojom::State::kRichlyEditable); + rich_text_field.RemoveBoolAttribute( + ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot); + AXTreeUpdate update_2; + update_2.nodes = {rich_text_field}; + + ASSERT_TRUE(tree.Unserialize(update_2)) << tree.error(); + { + const AXNode* text_field_node = tree.GetFromId(rich_text_field.id); + ASSERT_NE(nullptr, text_field_node); + EXPECT_EQ("", text_field_node->GetValueForControl()); + } + + rich_text_field.AddState(ax::mojom::State::kRichlyEditable); + rich_text_field.AddBoolAttribute( + ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true); + + // A node's data should override any computed node data. + rich_text_field.SetValue("Other value"); + AXTreeUpdate update_3; + update_3.nodes = {rich_text_field}; + + ASSERT_TRUE(tree.Unserialize(update_3)) << tree.error(); + { + const AXNode* text_field_node = tree.GetFromId(rich_text_field.id); + ASSERT_NE(nullptr, text_field_node); + EXPECT_EQ("Other value", text_field_node->GetValueForControl()); + } +} + TEST(AXNodeTest, GetLowestPlatformAncestor) { // ++kRootWebArea // ++++kButton (IsLeaf=false) @@ -466,7 +572,7 @@ initial_state.tree_data = tree_data; AXTree tree; - ASSERT_TRUE(tree.Unserialize(initial_state)); + ASSERT_TRUE(tree.Unserialize(initial_state)) << tree.error(); const AXNode* root_node = tree.root(); ASSERT_EQ(root.id, root_node->id());
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc index 42064ce..857f509 100644 --- a/ui/accessibility/platform/ax_platform_node_base.cc +++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -386,77 +386,77 @@ ax::mojom::BoolAttribute attribute) const { if (!delegate_) return false; - return GetData().HasBoolAttribute(attribute); + return delegate_->HasBoolAttribute(attribute); } bool AXPlatformNodeBase::GetBoolAttribute( ax::mojom::BoolAttribute attribute) const { if (!delegate_) return false; - return GetData().GetBoolAttribute(attribute); + return delegate_->GetBoolAttribute(attribute); } bool AXPlatformNodeBase::GetBoolAttribute(ax::mojom::BoolAttribute attribute, bool* value) const { if (!delegate_) return false; - return GetData().GetBoolAttribute(attribute, value); + return delegate_->GetBoolAttribute(attribute, value); } bool AXPlatformNodeBase::HasFloatAttribute( ax::mojom::FloatAttribute attribute) const { if (!delegate_) return false; - return GetData().HasFloatAttribute(attribute); + return delegate_->HasFloatAttribute(attribute); } float AXPlatformNodeBase::GetFloatAttribute( ax::mojom::FloatAttribute attribute) const { if (!delegate_) return false; - return GetData().GetFloatAttribute(attribute); + return delegate_->GetFloatAttribute(attribute); } bool AXPlatformNodeBase::GetFloatAttribute(ax::mojom::FloatAttribute attribute, float* value) const { if (!delegate_) return false; - return GetData().GetFloatAttribute(attribute, value); + return delegate_->GetFloatAttribute(attribute, value); } bool AXPlatformNodeBase::HasIntAttribute( ax::mojom::IntAttribute attribute) const { if (!delegate_) return false; - return GetData().HasIntAttribute(attribute); + return delegate_->HasIntAttribute(attribute); } int AXPlatformNodeBase::GetIntAttribute( ax::mojom::IntAttribute attribute) const { if (!delegate_) return 0; - return GetData().GetIntAttribute(attribute); + return delegate_->GetIntAttribute(attribute); } bool AXPlatformNodeBase::GetIntAttribute(ax::mojom::IntAttribute attribute, int* value) const { if (!delegate_) return false; - return GetData().GetIntAttribute(attribute, value); + return delegate_->GetIntAttribute(attribute, value); } bool AXPlatformNodeBase::HasStringAttribute( ax::mojom::StringAttribute attribute) const { if (!delegate_) return false; - return GetData().HasStringAttribute(attribute); + return delegate_->HasStringAttribute(attribute); } const std::string& AXPlatformNodeBase::GetStringAttribute( ax::mojom::StringAttribute attribute) const { if (!delegate_) return base::EmptyString(); - return GetData().GetStringAttribute(attribute); + return delegate_->GetStringAttribute(attribute); } bool AXPlatformNodeBase::GetStringAttribute( @@ -464,14 +464,14 @@ std::string* value) const { if (!delegate_) return false; - return GetData().GetStringAttribute(attribute, value); + return delegate_->GetStringAttribute(attribute, value); } std::u16string AXPlatformNodeBase::GetString16Attribute( ax::mojom::StringAttribute attribute) const { if (!delegate_) return std::u16string(); - return GetData().GetString16Attribute(attribute); + return delegate_->GetString16Attribute(attribute); } bool AXPlatformNodeBase::GetString16Attribute( @@ -479,7 +479,7 @@ std::u16string* value) const { if (!delegate_) return false; - return GetData().GetString16Attribute(attribute, value); + return delegate_->GetString16Attribute(attribute, value); } bool AXPlatformNodeBase::HasInheritedStringAttribute( @@ -491,7 +491,7 @@ return false; } - if (current_node->GetData().HasStringAttribute(attribute)) { + if (current_node->HasStringAttribute(attribute)) { return true; } @@ -503,6 +503,8 @@ const std::string& AXPlatformNodeBase::GetInheritedStringAttribute( ax::mojom::StringAttribute attribute) const { + // TODO(nektar): Switch to using `AXNode::GetInheritedStringAttribute` after + // it has been modified to cross tree boundaries. const AXPlatformNodeBase* current_node = this; do { @@ -510,8 +512,8 @@ return base::EmptyString(); } - if (current_node->GetData().HasStringAttribute(attribute)) { - return current_node->GetData().GetStringAttribute(attribute); + if (current_node->HasStringAttribute(attribute)) { + return current_node->GetStringAttribute(attribute); } current_node = FromNativeViewAccessible(current_node->GetParent()); @@ -520,14 +522,11 @@ return base::EmptyString(); } -std::u16string AXPlatformNodeBase::GetInheritedString16Attribute( - ax::mojom::StringAttribute attribute) const { - return base::UTF8ToUTF16(GetInheritedStringAttribute(attribute)); -} - bool AXPlatformNodeBase::GetInheritedStringAttribute( ax::mojom::StringAttribute attribute, std::string* value) const { + // TODO(nektar): Switch to using `AXNode::GetInheritedStringAttribute` after + // it has been modified to cross tree boundaries. const AXPlatformNodeBase* current_node = this; do { @@ -535,7 +534,7 @@ return false; } - if (current_node->GetData().GetStringAttribute(attribute, value)) { + if (current_node->GetStringAttribute(attribute, value)) { return true; } @@ -545,9 +544,18 @@ return false; } +std::u16string AXPlatformNodeBase::GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const { + // TODO(nektar): Switch to using `AXNode::GetInheritedString16Attribute` after + // it has been modified to cross tree boundaries. + return base::UTF8ToUTF16(GetInheritedStringAttribute(attribute)); +} + bool AXPlatformNodeBase::GetInheritedString16Attribute( ax::mojom::StringAttribute attribute, std::u16string* value) const { + // TODO(nektar): Switch to using `AXNode::GetInheritedString16Attribute` after + // it has been modified to cross tree boundaries. std::string value_utf8; if (!GetInheritedStringAttribute(attribute, &value_utf8)) return false; @@ -559,7 +567,7 @@ ax::mojom::IntListAttribute attribute) const { if (!delegate_) return false; - return GetData().HasIntListAttribute(attribute); + return delegate_->HasIntListAttribute(attribute); } const std::vector<int32_t>& AXPlatformNodeBase::GetIntListAttribute( @@ -567,7 +575,7 @@ static const base::NoDestructor<std::vector<int32_t>> empty_data; if (!delegate_) return *empty_data; - return GetData().GetIntListAttribute(attribute); + return delegate_->GetIntListAttribute(attribute); } bool AXPlatformNodeBase::GetIntListAttribute( @@ -575,7 +583,7 @@ std::vector<int32_t>* value) const { if (!delegate_) return false; - return GetData().GetIntListAttribute(attribute, value); + return delegate_->GetIntListAttribute(attribute, value); } // static @@ -1252,7 +1260,7 @@ // Expose dropeffect attribute. // aria-dropeffect is deprecated in WAI-ARIA 1.1. - if (GetData().HasIntAttribute(ax::mojom::IntAttribute::kDropeffect)) { + if (delegate_->HasIntAttribute(ax::mojom::IntAttribute::kDropeffect)) { std::string dropeffect = GetData().DropeffectBitfieldToString(); AddAttributeToList("dropeffect", dropeffect, attributes); } @@ -1263,8 +1271,8 @@ // Expose class attribute. std::string class_attr; - if (GetData().GetStringAttribute(ax::mojom::StringAttribute::kClassName, - &class_attr)) { + if (delegate_->GetStringAttribute(ax::mojom::StringAttribute::kClassName, + &class_attr)) { AddAttributeToList("class", class_attr, attributes); } @@ -1288,9 +1296,9 @@ AddAttributeToList("src", src, attributes); } - if (GetData().HasIntAttribute(ax::mojom::IntAttribute::kTextAlign)) { + if (delegate_->HasIntAttribute(ax::mojom::IntAttribute::kTextAlign)) { auto text_align = static_cast<ax::mojom::TextAlign>( - GetData().GetIntAttribute(ax::mojom::IntAttribute::kTextAlign)); + delegate_->GetIntAttribute(ax::mojom::IntAttribute::kTextAlign)); switch (text_align) { case ax::mojom::TextAlign::kNone: break;
diff --git a/ui/accessibility/platform/ax_platform_node_base.h b/ui/accessibility/platform/ax_platform_node_base.h index ada6e8c..aa49566 100644 --- a/ui/accessibility/platform/ax_platform_node_base.h +++ b/ui/accessibility/platform/ax_platform_node_base.h
@@ -132,24 +132,24 @@ ax::mojom::StringAttribute attribute) const; bool GetStringAttribute(ax::mojom::StringAttribute attribute, std::string* value) const; - bool GetString16Attribute(ax::mojom::StringAttribute attribute, - std::u16string* value) const; std::u16string GetString16Attribute( ax::mojom::StringAttribute attribute) const; + bool GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const; + bool HasInheritedStringAttribute(ax::mojom::StringAttribute attribute) const; const std::string& GetInheritedStringAttribute( ax::mojom::StringAttribute attribute) const; - std::u16string GetInheritedString16Attribute( - ax::mojom::StringAttribute attribute) const; bool GetInheritedStringAttribute(ax::mojom::StringAttribute attribute, std::string* value) const; + std::u16string GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const; bool GetInheritedString16Attribute(ax::mojom::StringAttribute attribute, std::u16string* value) const; bool HasIntListAttribute(ax::mojom::IntListAttribute attribute) const; const std::vector<int32_t>& GetIntListAttribute( ax::mojom::IntListAttribute attribute) const; - bool GetIntListAttribute(ax::mojom::IntListAttribute attribute, std::vector<int32_t>* value) const;
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h index c6073c9..7b9cddf 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate.h +++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -70,15 +70,82 @@ public: virtual ~AXPlatformNodeDelegate() = default; - // Get the accessibility data that should be exposed for this node. - // Virtually all of the information is obtained from this structure - // (role, state, name, cursor position, etc.) - the rest of this interface - // is mostly to implement support for walking the accessibility tree. + // Get the accessibility data that should be exposed for this node. This data + // is readonly and comes directly from the accessibility tree's source, e.g. + // Blink. + // + // Virtually all of the information could be obtained from this structure + // (role, state, name, cursor position, etc.) However, please prefer using + // specific accessor methods, such as `GetStringAttribute` or + // `GetTableCellRowIndex`, instead of directly accessing this structure, + // because any attributes that could automatically be computed in the browser + // process would also be returned. The browser process would try to correct + // missing or erroneous information too. virtual const AXNodeData& GetData() const = 0; // Get the accessibility tree data for this node. virtual const AXTreeData& GetTreeData() const = 0; + // Accessing accessibility attributes: + // + // There are dozens of possible attributes for an accessibility node, + // but only a few tend to apply to any one object, so we store them + // in sparse arrays of <attribute id, attribute value> pairs, organized + // by type (bool, int, float, string, int list). + // + // There are three accessors for each type of attribute: one that returns + // true if the attribute is present and false if not, one that takes a + // pointer argument and returns true if the attribute is present (if you + // need to distinguish between the default value and a missing attribute), + // and another that returns the default value for that type if the + // attribute is not present. In addition, strings can be returned as + // either std::string or std::u16string, for convenience. + + virtual bool HasBoolAttribute(ax::mojom::BoolAttribute attribute) const = 0; + virtual bool GetBoolAttribute(ax::mojom::BoolAttribute attribute) const = 0; + virtual bool GetBoolAttribute(ax::mojom::BoolAttribute attribute, + bool* value) const = 0; + virtual bool HasFloatAttribute(ax::mojom::FloatAttribute attribute) const = 0; + virtual float GetFloatAttribute( + ax::mojom::FloatAttribute attribute) const = 0; + virtual bool GetFloatAttribute(ax::mojom::FloatAttribute attribute, + float* value) const = 0; + virtual bool HasIntAttribute(ax::mojom::IntAttribute attribute) const = 0; + virtual int GetIntAttribute(ax::mojom::IntAttribute attribute) const = 0; + virtual bool GetIntAttribute(ax::mojom::IntAttribute attribute, + int* value) const = 0; + virtual bool HasStringAttribute( + ax::mojom::StringAttribute attribute) const = 0; + virtual const std::string& GetStringAttribute( + ax::mojom::StringAttribute attribute) const = 0; + virtual bool GetStringAttribute(ax::mojom::StringAttribute attribute, + std::string* value) const = 0; + virtual std::u16string GetString16Attribute( + ax::mojom::StringAttribute attribute) const = 0; + virtual bool GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const = 0; + virtual const std::string& GetInheritedStringAttribute( + ax::mojom::StringAttribute attribute) const = 0; + virtual std::u16string GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const = 0; + virtual bool HasIntListAttribute( + ax::mojom::IntListAttribute attribute) const = 0; + virtual const std::vector<int32_t>& GetIntListAttribute( + ax::mojom::IntListAttribute attribute) const = 0; + virtual bool GetIntListAttribute(ax::mojom::IntListAttribute attribute, + std::vector<int32_t>* value) const = 0; + virtual bool HasStringListAttribute( + ax::mojom::StringListAttribute attribute) const = 0; + virtual const std::vector<std::string>& GetStringListAttribute( + ax::mojom::StringListAttribute attribute) const = 0; + virtual bool GetStringListAttribute( + ax::mojom::StringListAttribute attribute, + std::vector<std::string>* value) const = 0; + virtual bool GetHtmlAttribute(const char* attribute, + std::string* value) const = 0; + virtual bool GetHtmlAttribute(const char* attribute, + std::u16string* value) const = 0; + // Returns the text of this node and all descendant nodes; including text // found in embedded objects. //
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/ui/accessibility/platform/ax_platform_node_delegate_base.cc index 38766ec..67e7df2 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.cc +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -31,6 +31,136 @@ return *empty_data; } +bool AXPlatformNodeDelegateBase::HasBoolAttribute( + ax::mojom::BoolAttribute attribute) const { + return GetData().HasBoolAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetBoolAttribute( + ax::mojom::BoolAttribute attribute) const { + return GetData().GetBoolAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetBoolAttribute( + ax::mojom::BoolAttribute attribute, + bool* value) const { + return GetData().GetBoolAttribute(attribute, value); +} + +bool AXPlatformNodeDelegateBase::HasFloatAttribute( + ax::mojom::FloatAttribute attribute) const { + return GetData().HasFloatAttribute(attribute); +} + +float AXPlatformNodeDelegateBase::GetFloatAttribute( + ax::mojom::FloatAttribute attribute) const { + return GetData().GetFloatAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetFloatAttribute( + ax::mojom::FloatAttribute attribute, + float* value) const { + return GetData().GetFloatAttribute(attribute, value); +} + +bool AXPlatformNodeDelegateBase::HasIntAttribute( + ax::mojom::IntAttribute attribute) const { + return GetData().HasIntAttribute(attribute); +} + +int AXPlatformNodeDelegateBase::GetIntAttribute( + ax::mojom::IntAttribute attribute) const { + return GetData().GetIntAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetIntAttribute( + ax::mojom::IntAttribute attribute, + int* value) const { + return GetData().GetIntAttribute(attribute, value); +} + +bool AXPlatformNodeDelegateBase::HasStringAttribute( + ax::mojom::StringAttribute attribute) const { + return GetData().HasStringAttribute(attribute); +} + +const std::string& AXPlatformNodeDelegateBase::GetStringAttribute( + ax::mojom::StringAttribute attribute) const { + return GetData().GetStringAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetStringAttribute( + ax::mojom::StringAttribute attribute, + std::string* value) const { + return GetData().GetStringAttribute(attribute, value); +} + +std::u16string AXPlatformNodeDelegateBase::GetString16Attribute( + ax::mojom::StringAttribute attribute) const { + return GetData().GetString16Attribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetString16Attribute( + ax::mojom::StringAttribute attribute, + std::u16string* value) const { + return GetData().GetString16Attribute(attribute, value); +} + +const std::string& AXPlatformNodeDelegateBase::GetInheritedStringAttribute( + ax::mojom::StringAttribute attribute) const { + NOTIMPLEMENTED(); + return GetData().GetStringAttribute(attribute); +} + +std::u16string AXPlatformNodeDelegateBase::GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const { + NOTIMPLEMENTED(); + return GetData().GetString16Attribute(attribute); +} + +bool AXPlatformNodeDelegateBase::HasIntListAttribute( + ax::mojom::IntListAttribute attribute) const { + return GetData().HasIntListAttribute(attribute); +} + +const std::vector<int32_t>& AXPlatformNodeDelegateBase::GetIntListAttribute( + ax::mojom::IntListAttribute attribute) const { + return GetData().GetIntListAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetIntListAttribute( + ax::mojom::IntListAttribute attribute, + std::vector<int32_t>* value) const { + return GetData().GetIntListAttribute(attribute, value); +} + +bool AXPlatformNodeDelegateBase::HasStringListAttribute( + ax::mojom::StringListAttribute attribute) const { + return GetData().HasStringListAttribute(attribute); +} + +const std::vector<std::string>& +AXPlatformNodeDelegateBase::GetStringListAttribute( + ax::mojom::StringListAttribute attribute) const { + return GetData().GetStringListAttribute(attribute); +} + +bool AXPlatformNodeDelegateBase::GetStringListAttribute( + ax::mojom::StringListAttribute attribute, + std::vector<std::string>* value) const { + return GetData().GetStringListAttribute(attribute, value); +} + +bool AXPlatformNodeDelegateBase::GetHtmlAttribute(const char* attribute, + std::string* value) const { + return GetData().GetHtmlAttribute(attribute, value); +} + +bool AXPlatformNodeDelegateBase::GetHtmlAttribute(const char* attribute, + std::u16string* value) const { + return GetData().GetHtmlAttribute(attribute, value); +} + std::u16string AXPlatformNodeDelegateBase::GetInnerText() const { // Unlike in web content The "kValue" attribute always takes precedence, // because we assume that users of this base class, such as Views controls,
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.h b/ui/accessibility/platform/ax_platform_node_delegate_base.h index d86e899..d9a5caf7 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.h +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -26,15 +26,50 @@ AXPlatformNodeDelegateBase(); ~AXPlatformNodeDelegateBase() override; - // Get the accessibility data that should be exposed for this node. - // Virtually all of the information is obtained from this structure - // (role, state, name, cursor position, etc.) - the rest of this interface - // is mostly to implement support for walking the accessibility tree. + // `AXPlatformNodeDelegate` implementation. const AXNodeData& GetData() const override; - - // Get the accessibility tree data for this node. const AXTreeData& GetTreeData() const override; - + bool HasBoolAttribute(ax::mojom::BoolAttribute attribute) const override; + bool GetBoolAttribute(ax::mojom::BoolAttribute attribute) const override; + bool GetBoolAttribute(ax::mojom::BoolAttribute attribute, + bool* value) const override; + bool HasFloatAttribute(ax::mojom::FloatAttribute attribute) const override; + float GetFloatAttribute(ax::mojom::FloatAttribute attribute) const override; + bool GetFloatAttribute(ax::mojom::FloatAttribute attribute, + float* value) const override; + bool HasIntAttribute(ax::mojom::IntAttribute attribute) const override; + int GetIntAttribute(ax::mojom::IntAttribute attribute) const override; + bool GetIntAttribute(ax::mojom::IntAttribute attribute, + int* value) const override; + bool HasStringAttribute(ax::mojom::StringAttribute attribute) const override; + const std::string& GetStringAttribute( + ax::mojom::StringAttribute attribute) const override; + bool GetStringAttribute(ax::mojom::StringAttribute attribute, + std::string* value) const override; + std::u16string GetString16Attribute( + ax::mojom::StringAttribute attribute) const override; + bool GetString16Attribute(ax::mojom::StringAttribute attribute, + std::u16string* value) const override; + const std::string& GetInheritedStringAttribute( + ax::mojom::StringAttribute attribute) const override; + std::u16string GetInheritedString16Attribute( + ax::mojom::StringAttribute attribute) const override; + bool HasIntListAttribute( + ax::mojom::IntListAttribute attribute) const override; + const std::vector<int32_t>& GetIntListAttribute( + ax::mojom::IntListAttribute attribute) const override; + bool GetIntListAttribute(ax::mojom::IntListAttribute attribute, + std::vector<int32_t>* value) const override; + bool HasStringListAttribute( + ax::mojom::StringListAttribute attribute) const override; + const std::vector<std::string>& GetStringListAttribute( + ax::mojom::StringListAttribute attribute) const override; + bool GetStringListAttribute(ax::mojom::StringListAttribute attribute, + std::vector<std::string>* value) const override; + bool GetHtmlAttribute(const char* attribute, + std::string* value) const override; + bool GetHtmlAttribute(const char* attribute, + std::u16string* value) const override; std::u16string GetInnerText() const override; std::u16string GetValueForControl() const override; const AXTree::Selection GetUnignoredSelection() const override;
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn index 052ce8b..9c246cb 100644 --- a/ui/aura/BUILD.gn +++ b/ui/aura/BUILD.gn
@@ -245,6 +245,7 @@ "//ui/base/ime/init", "//ui/compositor:test_support", "//ui/display", + "//ui/display:test_support", "//ui/display/manager", "//ui/events", "//ui/events:events_base",
diff --git a/ui/aura/test/test_screen.cc b/ui/aura/test/test_screen.cc index 21c1e8b..9499060 100644 --- a/ui/aura/test/test_screen.cc +++ b/ui/aura/test/test_screen.cc
@@ -7,14 +7,15 @@ #include <stdint.h> #include "base/check_op.h" -#include "build/build_config.h" #include "ui/aura/env.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_tree_host.h" #include "ui/base/ime/input_method.h" #include "ui/compositor/compositor.h" +#include "ui/display/display.h" #include "ui/display/display_transform.h" +#include "ui/display/test/test_screen.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/native_widget_types.h" @@ -31,12 +32,13 @@ } // namespace +// TODO(weili): Remove this and use the constructor directly. // static TestScreen* TestScreen::Create(const gfx::Size& size) { - const gfx::Size kDefaultSize(800, 600); // Use (0,0) because the desktop aura tests are executed in // native environment where the display's origin is (0,0). - return new TestScreen(gfx::Rect(size.IsEmpty() ? kDefaultSize : size)); + return new TestScreen(size.IsEmpty() ? kDefaultScreenBounds + : gfx::Rect(size)); } TestScreen::~TestScreen() { @@ -169,7 +171,14 @@ return {}; } -TestScreen::TestScreen(const gfx::Rect& screen_bounds) { +void TestScreen::SetCursorScreenPointForTesting(const gfx::Point& point) { + display::test::TestScreen::SetCursorScreenPointForTesting(point); + + Env::GetInstance()->SetLastMouseLocation(point); +} + +TestScreen::TestScreen(const gfx::Rect& screen_bounds) + : display::test::TestScreen(/* create_display = */ false) { static int64_t synthesized_display_id = 2000; display::Display display(synthesized_display_id++); display.SetScaleAndBounds(1.0f, screen_bounds);
diff --git a/ui/aura/test/test_screen.h b/ui/aura/test/test_screen.h index a35905b..723a32d 100644 --- a/ui/aura/test/test_screen.h +++ b/ui/aura/test/test_screen.h
@@ -5,11 +5,9 @@ #ifndef UI_AURA_TEST_TEST_SCREEN_H_ #define UI_AURA_TEST_TEST_SCREEN_H_ -#include "base/compiler_specific.h" -#include "base/macros.h" #include "ui/aura/window_observer.h" #include "ui/display/display.h" -#include "ui/display/screen_base.h" +#include "ui/display/test/test_screen.h" namespace gfx { class ColorSpace; @@ -22,13 +20,14 @@ class Window; class WindowTreeHost; -// A minimal, testing Aura implementation of display::Screen. -// TODO(bruthig): Consider extending gfx::test::TestScreen. -class TestScreen : public display::ScreenBase, public WindowObserver { +// A minimal Aura implementation of display::test::TestScreen. +class TestScreen : public display::test::TestScreen, public WindowObserver { public: // Creates a display::Screen of the specified size. If no size is specified, // then creates a 800x600 screen. |size| is in physical pixels. static TestScreen* Create(const gfx::Size& size); + TestScreen(const TestScreen&) = delete; + TestScreen& operator=(const TestScreen&) = delete; ~TestScreen() override; WindowTreeHost* CreateHostForPrimaryDisplay(); @@ -62,6 +61,7 @@ display::Display GetDisplayNearestWindow( gfx::NativeWindow window) const override; std::string GetCurrentWorkspace() override; + void SetCursorScreenPointForTesting(const gfx::Point& point) override; private: explicit TestScreen(const gfx::Rect& screen_bounds); @@ -69,8 +69,6 @@ aura::WindowTreeHost* host_ = nullptr; float ui_scale_ = 1.0f; - - DISALLOW_COPY_AND_ASSIGN(TestScreen); }; } // namespace aura
diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc index 9b9a303a7..eb4bc993 100644 --- a/ui/aura/window_tree_host_platform.cc +++ b/ui/aura/window_tree_host_platform.cc
@@ -256,6 +256,7 @@ void WindowTreeHostPlatform::OnClosed() {} void WindowTreeHostPlatform::OnWindowStateChanged( + ui::PlatformWindowState old_state, ui::PlatformWindowState new_state) {} void WindowTreeHostPlatform::OnLostCapture() {
diff --git a/ui/aura/window_tree_host_platform.h b/ui/aura/window_tree_host_platform.h index dd2a8f4..7e436c9 100644 --- a/ui/aura/window_tree_host_platform.h +++ b/ui/aura/window_tree_host_platform.h
@@ -71,7 +71,8 @@ void DispatchEvent(ui::Event* event) override; void OnCloseRequest() override; void OnClosed() override; - void OnWindowStateChanged(ui::PlatformWindowState new_state) override; + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override; void OnLostCapture() override; void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override; void OnWillDestroyAcceleratedWidget() override;
diff --git a/ui/base/prediction/OWNERS b/ui/base/prediction/OWNERS new file mode 100644 index 0000000..e1fbf38 --- /dev/null +++ b/ui/base/prediction/OWNERS
@@ -0,0 +1,2 @@ +flackr@chromium.org +sadrul@chromium.org \ No newline at end of file
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb index 390a996..f3c9e50e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb
@@ -10,7 +10,7 @@ <translation id="1119069657431255176">Archive tar compressée avec bzip2</translation> <translation id="1119447706177454957">Erreur interne</translation> <translation id="1120073797882051782">Hangûl romaja</translation> -<translation id="112387589102719461">Anglais (É.-U.) avec clavier Dvorak pour concepteurs</translation> +<translation id="112387589102719461">Anglais (É.-U.) avec clavier Dvorak pour développeurs</translation> <translation id="1134697384939541955">Anglais (É.-U.) avec clavier étendu</translation> <translation id="1148097584170732637"><ph name="FILE_COUNT" /> trouvées. <ph name="LINE_BREAK1" />
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index 084295e..f9039ac5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -714,7 +714,7 @@ <translation id="7417453074306512035">Keyboard Ethiopia</translation> <translation id="7417705661718309329">Peta Google</translation> <translation id="7460898608667578234">Ukraina</translation> -<translation id="7469894403370665791">Sambungkan ke jaringan ini secara otomatis</translation> +<translation id="7469894403370665791">Otomatis hubungkan ke jaringan ini</translation> <translation id="7486315294984620427">Untuk melepaskan file di Parallels Desktop, file harus disalin ke file Windows.</translation> <translation id="7489215562877293245"><ph name="FILE_COUNT" /> ditemukan <ph name="LINE_BREAK1" />
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index a56122f..aafaf2e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -876,7 +876,7 @@ <translation id="8719721339511222681"><ph name="ENTRY_NAME" /> таңдалды.</translation> <translation id="872537912056138402">хорват</translation> <translation id="8743164338060742337"><ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" /> желі, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> сигнал күші: <ph name="SIGNAL_STRENGTH" />%, әкімшіңіз басқарады, қосылу</translation> -<translation id="8750438273876807512">Сөредегі файлдарға жылдам кіру үшін файлды түртіп ұстап тұрып, <ph name="ICON" /> белгішесін басыңыз да, "Сөреге бекіту" тармағын таңдаңыз.</translation> +<translation id="8750438273876807512">Сөредегі файлдарға жылдам кіру үшін файлды басып тұрып, <ph name="ICON" /> белгішесін басыңыз да, "Сөреге бекіту" тармағын таңдаңыз.</translation> <translation id="8787254343425541995">Ортақ желілерге арналған проксилерге рұқсат беру</translation> <translation id="8798099450830957504">Әдепкі</translation> <translation id="8802459921616481935">Себетке жіберу</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index cfa5f1f..3aef633e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -287,7 +287,7 @@ <translation id="3553048479571901246">கோப்புகளை <ph name="APP_NAME" /> ஆப்ஸில் திறக்க, முதலில் அவற்றை Windows கோப்புகள் கோப்புறைக்கு நகலெடுக்கவும்.</translation> <translation id="3556731189587832921">ஆங்கிலம் (யூஎஸ்) - சர்வதேச PC கீபோர்டு</translation> <translation id="357479282490346887">லிதுவேனியன்</translation> -<translation id="3592251141500063301">ஆஃப்லைனில் அணுகும் வகையில் <ph name="FILE_NAME" /> கோப்பினை அமைக்க முடியவில்லை</translation> +<translation id="3592251141500063301">ஆஃப்லைனில் அணுகும் வகையில் <ph name="FILE_NAME" /> ஃபைலை அமைக்க முடியவில்லை</translation> <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation> <translation id="3603385196401704894">கனடியன் ஃபிரெஞ்சு</translation> <translation id="3606220979431771195">டர்கிஷ்-F</translation> @@ -521,7 +521,7 @@ <translation id="5602622065581044566">பல்கேரியன் - ஒலிப்புமுறை கீபோர்டு</translation> <translation id="5605830556594064952">யு.எஸ். டிவாரக்</translation> <translation id="5625294776298156701">தமிழ் - Tamil99 கீபோர்டு</translation> -<translation id="5633226425545095130">இந்தக் கோப்பினை நகர்த்தினால் '<ph name="DESTINATION_NAME" />' என்ற பகிரப்பட்ட கோப்புறையைப் பார்க்கக்கூடிய அனைவருடனும் இது பகிரப்படும்.</translation> +<translation id="5633226425545095130">இந்த ஃபைலை நகர்த்தினால் '<ph name="DESTINATION_NAME" />' என்ற பகிரப்பட்ட கோப்புறையைப் பார்க்கக்கூடிய அனைவருடனும் இது பகிரப்படும்.</translation> <translation id="5649768706273821470">கேள்</translation> <translation id="5669691691057771421">புதிய பின்னை உள்ளிடவும்</translation> <translation id="5678784840044122290">இந்த Linux ஆப்ஸ் உங்கள் முனையத்திற்குள் இருக்கும், அத்துடன் உங்கள் தொடக்கியிலும் ஒரு ஐகான் காண்பிக்கப்படலாம்.</translation> @@ -733,7 +733,7 @@ <translation id="7553492409867692754"><ph name="FOLDER_NAME" /> கோப்புறையில் உள்ள கோப்புகளை அணுகுவதற்கான அனுமதியை Linux ஆப்ஸுக்கு வழங்கவும்</translation> <translation id="7575645593344061397">"<ph name="FILENAME" />" மீட்டெடுக்கப்படுகிறது...</translation> <translation id="7589661784326793847">ஒரு வினாடி காத்திருக்கவும்</translation> -<translation id="7592775719802218421">ஆஃப்லைனில் பயன்படுத்த <ph name="FILE_NAME" /> கோப்பினைப் பதிவிறக்குகிறது</translation> +<translation id="7592775719802218421">ஆஃப்லைனில் பயன்படுத்த <ph name="FILE_NAME" /> ஃபைலைப் பதிவிறக்குகிறது</translation> <translation id="7600126690270271294">செர்பியன்</translation> <translation id="7603724359189955920">கட்டங்கள்</translation> <translation id="7627790789328695202">அடடா, <ph name="FILE_NAME" /> ஏற்கனவே உள்ளது. இதற்கு மறுபெயரிட்டு மீண்டும் முயற்சிக்கவும்.</translation> @@ -839,8 +839,8 @@ <translation id="8437209419043462667">யு.எஸ்.</translation> <translation id="8452135315243592079">சிம் கார்டு இல்லை</translation> <translation id="8456681095658380701">தவறான பெயர்</translation> -<translation id="8459404855768962328">இந்தக் கோப்பினை நகலெடுத்தால் '<ph name="DESTINATION_NAME" />' என்ற பகிரப்பட்ட கோப்புறையைப் பார்க்கக்கூடிய அனைவருடனும் இது பகிரப்படும்.</translation> -<translation id="8461467696380332069">கோப்பினை வலது கிளிக் செய்து "ஷெல்ஃபில் பின் செய்" என்பதைத் தேர்ந்தெடுக்கவும், இதன் மூலம் ஷெல்ஃபிலுள்ள கோப்புகளுக்கான விரைவு அணுகலைப் பெறலாம்.</translation> +<translation id="8459404855768962328">இந்த ஃபைலை நகலெடுத்தால் '<ph name="DESTINATION_NAME" />' என்ற பகிரப்பட்ட கோப்புறையைப் பார்க்கக்கூடிய அனைவருடனும் இது பகிரப்படும்.</translation> +<translation id="8461467696380332069">ஃபைலை வலது கிளிக் செய்து "ஷெல்ஃபில் பின் செய்" என்பதைத் தேர்ந்தெடுக்கவும், இதன் மூலம் ஷெல்ஃபிலுள்ள கோப்புகளுக்கான விரைவு அணுகலைப் பெறலாம்.</translation> <translation id="8461914792118322307">ப்ராக்ஸி</translation> <translation id="8463494891489624050">வியட்நாமிஸ் (VIQR)</translation> <translation id="8466234950814670489">Tar archive</translation>
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index bc4437e..5c4ad1a2 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -185,6 +185,14 @@ settings.enable_elastic_overscroll = true; #endif +#if BUILDFLAG(IS_CHROMEOS_LACROS) + // Rasterized tiles must be overlay candidates to be forwarded. + // This is very similar to the line above for Apple. + if (features::IsDelegatedCompositingEnabled()) { + settings.resource_settings.use_gpu_memory_buffer_resources = true; + } +#endif + settings.memory_policy.bytes_limit_when_visible = 512 * 1024 * 1024; // Used to configure ui compositor memory limit for chromeos devices.
diff --git a/ui/compositor/test/test_compositor_host_ozone.cc b/ui/compositor/test/test_compositor_host_ozone.cc index ac0cbf9..5436091 100644 --- a/ui/compositor/test/test_compositor_host_ozone.cc +++ b/ui/compositor/test/test_compositor_host_ozone.cc
@@ -41,7 +41,8 @@ void DispatchEvent(Event* event) override {} void OnCloseRequest() override {} void OnClosed() override {} - void OnWindowStateChanged(PlatformWindowState new_state) override {} + void OnWindowStateChanged(PlatformWindowState old_state, + PlatformWindowState new_state) override {} void OnLostCapture() override {} void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override { widget_ = widget;
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn index b0890b9..bb627e5 100644 --- a/ui/display/BUILD.gn +++ b/ui/display/BUILD.gn
@@ -157,6 +157,13 @@ ] } + if (is_mac) { + sources += [ + "mac/test/test_screen_mac.h", + "mac/test/test_screen_mac.mm", + ] + } + if (build_display_configuration) { sources += [ "manager/test/action_logger.cc",
diff --git a/ui/display/mac/test/test_screen_mac.h b/ui/display/mac/test/test_screen_mac.h new file mode 100644 index 0000000..66e9080c --- /dev/null +++ b/ui/display/mac/test/test_screen_mac.h
@@ -0,0 +1,32 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_DISPLAY_MAC_TEST_TEST_SCREEN_MAC_H_ +#define UI_DISPLAY_MAC_TEST_TEST_SCREEN_MAC_H_ + +#include "ui/display/test/test_screen.h" + +namespace gfx { +class Size; +} + +namespace display { + +namespace test { + +// A test screen implementation for Mac. +// It implements the minimal functionalities such as using a valid display id to +// create a display for the screen. +class TestScreenMac : public TestScreen { + public: + TestScreenMac(const gfx::Size& size); + TestScreenMac(const TestScreenMac&) = delete; + TestScreenMac& operator=(const TestScreenMac&) = delete; + ~TestScreenMac() override; +}; + +} // namespace test +} // namespace display + +#endif // UI_DISPLAY_MAC_TEST_TEST_SCREEN_MAC_H_
diff --git a/ui/display/mac/test/test_screen_mac.mm b/ui/display/mac/test/test_screen_mac.mm new file mode 100644 index 0000000..b180856 --- /dev/null +++ b/ui/display/mac/test/test_screen_mac.mm
@@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/display/mac/test/test_screen_mac.h" + +#import <AppKit/AppKit.h> +#import <Cocoa/Cocoa.h> + +#include "ui/display/display.h" +#include "ui/display/test/test_screen.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" + +namespace display { +namespace test { + +TestScreenMac::TestScreenMac(const gfx::Size& size) + : TestScreen(/* create_display = */ false) { + NSScreen* screen = [[NSScreen screens] firstObject]; + CGDirectDisplayID display_id = + [[screen deviceDescription][@"NSScreenNumber"] unsignedIntValue]; + + Display display(display_id); + display.SetScaleAndBounds( + 1.0f, size.IsEmpty() ? kDefaultScreenBounds : gfx::Rect(size)); + ProcessDisplayChanged(display, /* is_primary = */ true); +} + +TestScreenMac::~TestScreenMac() = default; + +} // namespace test +} // namespace display
diff --git a/ui/display/screen.cc b/ui/display/screen.cc index 6da9994..be96761 100644 --- a/ui/display/screen.cc +++ b/ui/display/screen.cc
@@ -29,7 +29,6 @@ // static Screen* Screen::GetScreen() { #if defined(OS_APPLE) - // TODO(scottmg): https://crbug.com/558054 if (!g_screen) g_screen = CreateNativeScreen(); #endif @@ -41,6 +40,10 @@ return std::exchange(g_screen, instance); } +void Screen::SetCursorScreenPointForTesting(const gfx::Point& point) { + NOTIMPLEMENTED_LOG_ONCE(); +} + Display Screen::GetDisplayNearestView(gfx::NativeView view) const { return GetDisplayNearestWindow(GetWindowForView(view)); }
diff --git a/ui/display/screen.h b/ui/display/screen.h index 1f8a046..a1f24d8a 100644 --- a/ui/display/screen.h +++ b/ui/display/screen.h
@@ -53,6 +53,9 @@ // Returns the current absolute position of the mouse pointer. virtual gfx::Point GetCursorScreenPoint() = 0; + // Allows tests to override the cursor point location on the screen. + virtual void SetCursorScreenPointForTesting(const gfx::Point& point); + // Returns true if the cursor is directly over |window|. virtual bool IsWindowUnderCursor(gfx::NativeWindow window) = 0; @@ -177,7 +180,7 @@ DISALLOW_COPY_AND_ASSIGN(Screen); }; -Screen* CreateNativeScreen(); +DISPLAY_EXPORT Screen* CreateNativeScreen(); } // namespace display
diff --git a/ui/display/test/test_screen.cc b/ui/display/test/test_screen.cc index 28eccd4..215dbbd 100644 --- a/ui/display/test/test_screen.cc +++ b/ui/display/test/test_screen.cc
@@ -2,24 +2,27 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ui/display/test/test_screen.h" + #include <vector> -#include "ui/display/test/test_screen.h" +#include "ui/display/display.h" namespace display { namespace test { -TestScreen::TestScreen() { - Display display(1, gfx::Rect(0, 0, 100, 100)); - ProcessDisplayChanged(display, true /* is_primary */); +// static +constexpr gfx::Rect TestScreen::kDefaultScreenBounds; + +TestScreen::TestScreen(bool create_display) { + if (!create_display) + return; + Display display(1, kDefaultScreenBounds); + ProcessDisplayChanged(display, /* is_primary = */ true); } TestScreen::~TestScreen() {} -void TestScreen::set_cursor_screen_point(const gfx::Point& point) { - cursor_screen_point_ = point; -} - gfx::Point TestScreen::GetCursorScreenPoint() { return cursor_screen_point_; } @@ -36,5 +39,13 @@ return GetPrimaryDisplay(); } +Display TestScreen::GetDisplayMatching(const gfx::Rect& match_rect) const { + return GetPrimaryDisplay(); +} + +void TestScreen::SetCursorScreenPointForTesting(const gfx::Point& point) { + cursor_screen_point_ = point; +} + } // namespace test } // namespace display
diff --git a/ui/display/test/test_screen.h b/ui/display/test/test_screen.h index cab20404..47015ab 100644 --- a/ui/display/test/test_screen.h +++ b/ui/display/test/test_screen.h
@@ -5,38 +5,36 @@ #ifndef UI_DISPLAY_TEST_TEST_SCREEN_H_ #define UI_DISPLAY_TEST_TEST_SCREEN_H_ - -#include "base/macros.h" -#include "ui/display/display.h" #include "ui/display/screen_base.h" +#include "ui/gfx/geometry/rect.h" namespace display { + namespace test { -// A dummy implementation of Screen that contains a single -// Display only. The contained Display can be accessed and modified via -// TestScreen::display(). -// -// NOTE: Adding and removing DisplayOberver's are no-ops and observers -// will NOT be notified ever. +// A fake and simplified Screen implementation that contains a single +// Display only with the default size. class TestScreen : public ScreenBase { public: - TestScreen(); + static constexpr gfx::Rect kDefaultScreenBounds = gfx::Rect(0, 0, 800, 600); + + // TODO(weili): Split this into a protected no-argument constructor for + // subclass uses and the public one with gfx::Size argument. + explicit TestScreen(bool create_display = true); + TestScreen(const TestScreen&) = delete; + TestScreen& operator=(const TestScreen&) = delete; ~TestScreen() override; - // Sets the fake cursor location for the TestScreen. - void set_cursor_screen_point(const gfx::Point& point); - - // Screen: + // ScreenBase: gfx::Point GetCursorScreenPoint() override; bool IsWindowUnderCursor(gfx::NativeWindow window) override; gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point) override; Display GetDisplayNearestWindow(gfx::NativeWindow window) const override; + Display GetDisplayMatching(const gfx::Rect& match_rect) const override; + void SetCursorScreenPointForTesting(const gfx::Point& point) override; private: gfx::Point cursor_screen_point_; - - DISALLOW_COPY_AND_ASSIGN(TestScreen); }; } // namespace test
diff --git a/ui/gl/direct_composition_surface_win_unittest.cc b/ui/gl/direct_composition_surface_win_unittest.cc index 88226e89..fb25fcf 100644 --- a/ui/gl/direct_composition_surface_win_unittest.cc +++ b/ui/gl/direct_composition_surface_win_unittest.cc
@@ -48,7 +48,8 @@ void DispatchEvent(ui::Event* event) override {} void OnCloseRequest() override {} void OnClosed() override {} - void OnWindowStateChanged(ui::PlatformWindowState new_state) override {} + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override {} void OnLostCapture() override {} void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override {} void OnWillDestroyAcceleratedWidget() override {}
diff --git a/ui/gl/gl_surface_egl_unittest.cc b/ui/gl/gl_surface_egl_unittest.cc index 8212f7d..07e50a1 100644 --- a/ui/gl/gl_surface_egl_unittest.cc +++ b/ui/gl/gl_surface_egl_unittest.cc
@@ -77,7 +77,8 @@ void DispatchEvent(ui::Event* event) override {} void OnCloseRequest() override {} void OnClosed() override {} - void OnWindowStateChanged(ui::PlatformWindowState new_state) override {} + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override {} void OnLostCapture() override {} void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override {} void OnWillDestroyAcceleratedWidget() override {}
diff --git a/ui/ozone/demo/demo_window.cc b/ui/ozone/demo/demo_window.cc index 70d688e3..c84b022 100644 --- a/ui/ozone/demo/demo_window.cc +++ b/ui/ozone/demo/demo_window.cc
@@ -85,7 +85,8 @@ void DemoWindow::OnClosed() {} -void DemoWindow::OnWindowStateChanged(PlatformWindowState new_state) {} +void DemoWindow::OnWindowStateChanged(PlatformWindowState old_state, + PlatformWindowState new_state) {} void DemoWindow::OnLostCapture() {}
diff --git a/ui/ozone/demo/demo_window.h b/ui/ozone/demo/demo_window.h index ecfb9406..9d81b912 100644 --- a/ui/ozone/demo/demo_window.h +++ b/ui/ozone/demo/demo_window.h
@@ -40,7 +40,8 @@ void DispatchEvent(Event* event) override; void OnCloseRequest() override; void OnClosed() override; - void OnWindowStateChanged(PlatformWindowState new_state) override; + void OnWindowStateChanged(PlatformWindowState old_state, + PlatformWindowState new_state) override; void OnLostCapture() override; void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) override; void OnWillDestroyAcceleratedWidget() override {}
diff --git a/ui/ozone/platform/scenic/scenic_window.cc b/ui/ozone/platform/scenic/scenic_window.cc index 4b371df..586fe87 100644 --- a/ui/ozone/platform/scenic/scenic_window.cc +++ b/ui/ozone/platform/scenic/scenic_window.cc
@@ -348,9 +348,13 @@ } void ScenicWindow::OnViewAttachedChanged(bool is_view_attached) { - delegate_->OnWindowStateChanged(is_view_attached - ? PlatformWindowState::kNormal - : PlatformWindowState::kMinimized); + if (is_view_attached) { + delegate_->OnWindowStateChanged(PlatformWindowState::kMinimized, + PlatformWindowState::kNormal); + } else { + delegate_->OnWindowStateChanged(PlatformWindowState::kNormal, + PlatformWindowState::kMinimized); + } } void ScenicWindow::OnInputEvent(const fuchsia::ui::input::InputEvent& event) {
diff --git a/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc b/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc index 7072d78..9f58cd26 100644 --- a/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc +++ b/ui/ozone/platform/wayland/fuzzer/wayland_buffer_fuzzer.cc
@@ -53,7 +53,9 @@ MOCK_METHOD1(DispatchEvent, void(ui::Event* event)); MOCK_METHOD0(OnCloseRequest, void()); MOCK_METHOD0(OnClosed, void()); - MOCK_METHOD1(OnWindowStateChanged, void(ui::PlatformWindowState new_state)); + MOCK_METHOD2(OnWindowStateChanged, + void(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state)); MOCK_METHOD0(OnLostCapture, void()); MOCK_METHOD1(OnAcceleratedWidgetAvailable, void(gfx::AcceleratedWidget widget));
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc index 098faa4..28f595f 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -321,7 +321,7 @@ if (did_window_show_state_change && !did_send_delegate_notification) { previous_state_ = old_state; - delegate()->OnWindowStateChanged(state_); + delegate()->OnWindowStateChanged(previous_state_, state_); } if (did_active_change) @@ -524,7 +524,7 @@ shell_toplevel_->UnSetMaximized(); } - delegate()->OnWindowStateChanged(state_); + delegate()->OnWindowStateChanged(previous_state_, state_); connection()->ScheduleFlush(); }
diff --git a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc index cff48fe..6c5e7a45 100644 --- a/ui/ozone/platform/wayland/host/wayland_window_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_window_unittest.cc
@@ -444,7 +444,7 @@ kMaximizedBounds.height())); EXPECT_CALL(delegate_, OnActivationChanged(Eq(true))); EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMaximizedBounds))); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->Maximize(); SendConfigureEvent(xdg_surface_, kMaximizedBounds.width(), kMaximizedBounds.height(), ++serial, @@ -475,7 +475,7 @@ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kNormalBounds.width(), kNormalBounds.height())); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); EXPECT_CALL(delegate_, OnActivationChanged(_)).Times(0); EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds))); EXPECT_CALL(*GetXdgToplevel(), UnsetMaximized()); @@ -495,7 +495,7 @@ Sync(); EXPECT_CALL(*GetXdgToplevel(), SetMinimized()); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->Minimize(); EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kMinimized); @@ -516,7 +516,7 @@ // // TODO(tonikito): Improve filtering of delegate notification here. ui::PlatformWindowState state; - EXPECT_CALL(delegate_, OnWindowStateChanged(_)) + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)) .WillRepeatedly(DoAll(SaveArg<0>(&state), InvokeWithoutArgs([&]() { EXPECT_EQ(state, PlatformWindowState::kMinimized); }))); @@ -539,7 +539,7 @@ AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get()); EXPECT_CALL(*GetXdgToplevel(), SetFullscreen()); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->ToggleFullscreen(); // Make sure than WaylandWindow manually handles fullscreen states. Check the // comment in the WaylandWindow::ToggleFullscreen. @@ -549,7 +549,7 @@ Sync(); EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen()); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->Restore(); EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kNormal); // Reinitialize wl_array, which removes previous old states. @@ -582,7 +582,7 @@ auto* mock_surface = server_.GetObject<wl::MockSurface>( window->root_surface()->GetSurfaceId()); EXPECT_FALSE(mock_surface->xdg_surface()); - EXPECT_CALL(delegate, OnWindowStateChanged(_)).Times(0); + EXPECT_CALL(delegate, OnWindowStateChanged(_, _)).Times(0); window->ToggleFullscreen(); // The state of the window must already be fullscreen one. EXPECT_EQ(window->GetPlatformWindowState(), PlatformWindowState::kFullScreen); @@ -591,7 +591,7 @@ // We mustn't receive any state changes if that does not differ from the last // state. - EXPECT_CALL(delegate, OnWindowStateChanged(_)).Times(0); + EXPECT_CALL(delegate, OnWindowStateChanged(_, _)).Times(0); // Activate the surface. ScopedWlArray states = InitializeWlArrayWithActivatedState(); @@ -626,7 +626,7 @@ auto* mock_surface = server_.GetObject<wl::MockSurface>( window->root_surface()->GetSurfaceId()); EXPECT_FALSE(mock_surface->xdg_surface()); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->Maximize(); // The state of the window must already be fullscreen one. @@ -636,7 +636,7 @@ // Window show state should be already up to date, so delegate is not // notified. - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(0); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(0); EXPECT_EQ(window_->GetPlatformWindowState(), PlatformWindowState::kMaximized); // Activate the surface. @@ -658,7 +658,7 @@ SendConfigureEvent(xdg_surface_, 2000, 2000, 1, states.get()); EXPECT_CALL(delegate_, - OnWindowStateChanged(Eq(PlatformWindowState::kMaximized))) + OnWindowStateChanged(_, Eq(PlatformWindowState::kMaximized))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2000, 2000)); @@ -670,7 +670,8 @@ states = InitializeWlArrayWithActivatedState(); SendConfigureEvent(xdg_surface_, 0, 0, 2, states.get()); - EXPECT_CALL(delegate_, OnWindowStateChanged(Eq(PlatformWindowState::kNormal))) + EXPECT_CALL(delegate_, + OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, normal_bounds.width(), normal_bounds.height())); @@ -681,7 +682,7 @@ AddStateToWlArray(XDG_TOPLEVEL_STATE_FULLSCREEN, states.get()); SendConfigureEvent(xdg_surface_, 2005, 2005, 3, states.get()); EXPECT_CALL(delegate_, - OnWindowStateChanged(Eq(PlatformWindowState::kFullScreen))) + OnWindowStateChanged(_, Eq(PlatformWindowState::kFullScreen))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2005, 2005)); @@ -691,7 +692,8 @@ states = InitializeWlArrayWithActivatedState(); SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get()); - EXPECT_CALL(delegate_, OnWindowStateChanged(Eq(PlatformWindowState::kNormal))) + EXPECT_CALL(delegate_, + OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, normal_bounds.width(), normal_bounds.height())); @@ -704,7 +706,7 @@ SendConfigureEvent(xdg_surface_, 2000, 2000, 1, states.get()); EXPECT_CALL(delegate_, - OnWindowStateChanged(Eq(PlatformWindowState::kMaximized))) + OnWindowStateChanged(_, Eq(PlatformWindowState::kMaximized))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2000, 2000)); @@ -714,7 +716,7 @@ SendConfigureEvent(xdg_surface_, 2005, 2005, 1, states.get()); EXPECT_CALL(delegate_, - OnWindowStateChanged(Eq(PlatformWindowState::kFullScreen))) + OnWindowStateChanged(_, Eq(PlatformWindowState::kFullScreen))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, 2005, 2005)); @@ -722,7 +724,8 @@ states = InitializeWlArrayWithActivatedState(); SendConfigureEvent(xdg_surface_, 0, 0, 4, states.get()); - EXPECT_CALL(delegate_, OnWindowStateChanged(Eq(PlatformWindowState::kNormal))) + EXPECT_CALL(delegate_, + OnWindowStateChanged(_, Eq(PlatformWindowState::kNormal))) .Times(1); EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, normal_bounds.width(), normal_bounds.height())); @@ -754,7 +757,7 @@ kMaximizedBounds.height())); EXPECT_CALL(delegate_, OnActivationChanged(Eq(true))); EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kMaximizedBounds))); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->Maximize(); // State changes are synchronous. EXPECT_EQ(PlatformWindowState::kMaximized, window_->GetPlatformWindowState()); @@ -770,7 +773,7 @@ EXPECT_CALL(*xdg_surface_, SetWindowGeometry(0, 0, kMaximizedBounds.width(), kMaximizedBounds.height())); EXPECT_CALL(delegate_, OnBoundsChanged(_)).Times(0); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->ToggleFullscreen(); // State changes are synchronous. EXPECT_EQ(PlatformWindowState::kFullScreen, @@ -789,7 +792,7 @@ kNormalBounds.height())); EXPECT_CALL(*GetXdgToplevel(), UnsetFullscreen()); EXPECT_CALL(delegate_, OnBoundsChanged(Eq(kNormalBounds))); - EXPECT_CALL(delegate_, OnWindowStateChanged(_)).Times(1); + EXPECT_CALL(delegate_, OnWindowStateChanged(_, _)).Times(1); window_->Restore(); EXPECT_EQ(PlatformWindowState::kNormal, window_->GetPlatformWindowState()); // Reinitialize wl_array, which removes previous old states.
diff --git a/ui/ozone/test/mock_platform_window_delegate.h b/ui/ozone/test/mock_platform_window_delegate.h index 93c52c2..25b3b24 100644 --- a/ui/ozone/test/mock_platform_window_delegate.h +++ b/ui/ozone/test/mock_platform_window_delegate.h
@@ -23,7 +23,9 @@ MOCK_METHOD1(DispatchEvent, void(Event* event)); MOCK_METHOD0(OnCloseRequest, void()); MOCK_METHOD0(OnClosed, void()); - MOCK_METHOD1(OnWindowStateChanged, void(PlatformWindowState new_state)); + MOCK_METHOD2(OnWindowStateChanged, + void(PlatformWindowState old_state, + PlatformWindowState new_state)); MOCK_METHOD0(OnLostCapture, void()); MOCK_METHOD1(OnAcceleratedWidgetAvailable, void(gfx::AcceleratedWidget widget));
diff --git a/ui/platform_window/platform_window_delegate.h b/ui/platform_window/platform_window_delegate.h index 361f00d..d3e6ac9 100644 --- a/ui/platform_window/platform_window_delegate.h +++ b/ui/platform_window/platform_window_delegate.h
@@ -77,7 +77,8 @@ virtual void OnCloseRequest() = 0; virtual void OnClosed() = 0; - virtual void OnWindowStateChanged(PlatformWindowState new_state) = 0; + virtual void OnWindowStateChanged(PlatformWindowState old_state, + PlatformWindowState new_state) = 0; virtual void OnLostCapture() = 0;
diff --git a/ui/platform_window/x11/test/x11_window_unittest.cc b/ui/platform_window/x11/test/x11_window_unittest.cc index a87fb11..c87e5da 100644 --- a/ui/platform_window/x11/test/x11_window_unittest.cc +++ b/ui/platform_window/x11/test/x11_window_unittest.cc
@@ -62,7 +62,8 @@ void DispatchEvent(Event* event) override {} void OnCloseRequest() override {} void OnClosed() override {} - void OnWindowStateChanged(PlatformWindowState new_state) override { + void OnWindowStateChanged(PlatformWindowState old_state, + PlatformWindowState new_state) override { state_ = new_state; } void OnLostCapture() override {}
diff --git a/ui/platform_window/x11/x11_window.cc b/ui/platform_window/x11/x11_window.cc index ce480a8..f63d40f 100644 --- a/ui/platform_window/x11/x11_window.cc +++ b/ui/platform_window/x11/x11_window.cc
@@ -1250,8 +1250,9 @@ } if (new_state != state_) { + auto old_state = state_; state_ = new_state; - platform_window_delegate_->OnWindowStateChanged(state_); + platform_window_delegate_->OnWindowStateChanged(old_state, state_); } }
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index fef9866b..9032bb8 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -978,20 +978,6 @@ "views_test_suite.h", ] - if (is_mac) { - sources += [ - "test/desktop_test_views_delegate_mac.mm", - "test/event_generator_delegate_mac.h", - "test/event_generator_delegate_mac.mm", - "test/scoped_views_test_helper_cocoa.mm", - "test/test_views_delegate_mac.mm", - "test/views_test_base_mac.mm", - "test/views_test_helper_mac.h", - "test/views_test_helper_mac.mm", - "test/widget_test_mac.mm", - ] - } - configs += [ "//build/config:precompiled_headers" ] deps = [ @@ -1011,6 +997,7 @@ "//ui/base/ime/init", "//ui/compositor", "//ui/compositor:test_support", + "//ui/display:test_support", "//ui/events", "//ui/events:events_base", "//ui/events:test_support", @@ -1027,8 +1014,24 @@ "test/desktop_window_tree_host_win_test_api.h", ] } + if (is_mac) { - deps += [ "//components/remote_cocoa/app_shim" ] + sources += [ + "test/desktop_test_views_delegate_mac.mm", + "test/event_generator_delegate_mac.h", + "test/event_generator_delegate_mac.mm", + "test/scoped_views_test_helper_cocoa.mm", + "test/test_views_delegate_mac.mm", + "test/views_test_base_mac.mm", + "test/views_test_helper_mac.h", + "test/views_test_helper_mac.mm", + "test/widget_test_mac.mm", + ] + + deps += [ + "//components/remote_cocoa/app_shim", + "//ui/display:test_support", + ] } if (use_aura) { @@ -1300,6 +1303,10 @@ # views_unittests not yet compiling on Mac. http://crbug.com/378134 sources -= [ "controls/native/native_view_host_unittest.cc" ] + deps += [ + "//ui/display", # native_widget_mac_unittest.mm uses display::Screen. + ] + public_deps = [ "//components/remote_cocoa/app_shim", "//ui/accelerated_widget_mac",
diff --git a/ui/views/accessibility/ax_window_obj_wrapper.cc b/ui/views/accessibility/ax_window_obj_wrapper.cc index 99fcf96..baf2182f 100644 --- a/ui/views/accessibility/ax_window_obj_wrapper.cc +++ b/ui/views/accessibility/ax_window_obj_wrapper.cc
@@ -124,10 +124,6 @@ return; } - // Ignore this window's children if it is forced to be invisible. - if (window_->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)) - return; - for (auto* child : window_->children()) out_children->push_back(aura_obj_cache_->GetOrCreate(child)); @@ -167,17 +163,11 @@ out_node_data->role = ax::mojom::Role::kWindow; out_node_data->AddStringAttribute(ax::mojom::StringAttribute::kName, base::UTF16ToUTF8(window_->GetTitle())); - if (!window_->IsVisible() || - window_->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)) { + if (!window_->IsVisible()) out_node_data->AddState(ax::mojom::State::kInvisible); - } out_node_data->relative_bounds.bounds = gfx::RectF(window_->GetBoundsInScreen()); - - out_node_data->AddStringAttribute(ax::mojom::StringAttribute::kClassName, - GetWindowName(window_)); - std::string* child_ax_tree_id_ptr = window_->GetProperty(ui::kChildAXTreeID); if (child_ax_tree_id_ptr) { ui::AXTreeID child_ax_tree_id = @@ -194,14 +184,16 @@ // non-visible so prune it. if (!window_->GetToplevelWindow() || GetWidgetForWindow(window_->GetToplevelWindow()) || - !window_->IsVisible() || - window_->GetProperty(ui::kAXConsiderInvisibleAndIgnoreChildren)) { + !window_->IsVisible()) { return; } out_node_data->AddChildTreeId(child_ax_tree_id); } } + + out_node_data->AddStringAttribute(ax::mojom::StringAttribute::kClassName, + GetWindowName(window_)); } ui::AXNodeID AXWindowObjWrapper::GetUniqueId() const { @@ -249,13 +241,11 @@ void AXWindowObjWrapper::OnWindowPropertyChanged(aura::Window* window, const void* key, intptr_t old) { - if (window_destroying_ || window != window_) + if (window_destroying_) return; - if (key == ui::kChildAXTreeID || - key == ui::kAXConsiderInvisibleAndIgnoreChildren) { + if (window == window_ && key == ui::kChildAXTreeID) FireEvent(ax::mojom::Event::kChildrenChanged); - } } void AXWindowObjWrapper::OnWindowVisibilityChanged(aura::Window* window,
diff --git a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc index dcc060f..7357157 100644 --- a/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc +++ b/ui/views/bubble/bubble_dialog_delegate_view_unittest.cc
@@ -15,7 +15,6 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "ui/base/hit_test.h" -#include "ui/display/test/scoped_screen_override.h" #include "ui/display/test/test_screen.h" #include "ui/events/event_utils.h" #include "ui/views/animation/ink_drop.h" @@ -657,8 +656,7 @@ anchor_widget->GetThemeProvider()); } -const int kScreenWidth = 1024; -const int kScreenHeight = 768; +static constexpr gfx::Rect kScreenBounds = gfx::Rect(0, 0, 1024, 768); struct ArrowTestParameters { views::BubbleBorder::Arrow arrow; @@ -670,10 +668,9 @@ gfx::Rect adjusted_anchor_rect = anchor_rect; adjusted_anchor_rect.Offset( 0, ViewsTestBase::GetSystemReservedHeightAtTopOfScreen()); - gfx::Rect screen_rect = gfx::Rect(0, 0, kScreenWidth, kScreenHeight); return BubbleDialogDelegate::GetAvailableSpaceToPlaceBubble( - expected_arrow, adjusted_anchor_rect, screen_rect); + expected_arrow, adjusted_anchor_rect, kScreenBounds); } }; @@ -681,26 +678,26 @@ : public BubbleDialogDelegateViewTest, public testing::WithParamInterface<ArrowTestParameters> { public: - BubbleDialogDelegateViewArrowTest() : screen_override_(SetUpTestScreen()) {} + BubbleDialogDelegateViewArrowTest() = default; + BubbleDialogDelegateViewArrowTest(const BubbleDialogDelegateViewArrowTest&) = + delete; + BubbleDialogDelegateViewArrowTest& operator=( + const BubbleDialogDelegateViewArrowTest&) = delete; ~BubbleDialogDelegateViewArrowTest() override = default; - private: - display::Screen* SetUpTestScreen() { - const display::Display test_display = test_screen_.GetPrimaryDisplay(); - display::Display display(test_display); - display.set_id(0x2); - display.set_bounds(gfx::Rect(0, 0, kScreenWidth, kScreenHeight)); - display.set_work_area(gfx::Rect(0, 0, kScreenWidth, kScreenHeight)); - test_screen_.display_list().RemoveDisplay(test_display.id()); - test_screen_.display_list().AddDisplay(display, - display::DisplayList::Type::PRIMARY); - return &test_screen_; + void SetUp() override { + BubbleDialogDelegateViewTest::SetUp(); + SetUpTestScreen(); } - display::test::TestScreen test_screen_; - display::test::ScopedScreenOverride screen_override_; - - DISALLOW_COPY_AND_ASSIGN(BubbleDialogDelegateViewArrowTest); + private: + void SetUpTestScreen() { + display::test::TestScreen* screen = GetTestScreen(); + display::Display test_display = screen->GetPrimaryDisplay(); + test_display.set_bounds(kScreenBounds); + test_display.set_work_area(kScreenBounds); + screen->display_list().UpdateDisplay(test_display); + } }; TEST_P(BubbleDialogDelegateViewArrowTest, AvailableScreenSpaceTest) {
diff --git a/ui/views/controls/button/button.cc b/ui/views/controls/button/button.cc index 7f9f6a7..a198a815 100644 --- a/ui/views/controls/button/button.cc +++ b/ui/views/controls/button/button.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/debug/alias.h" #include "base/strings/utf_string_conversions.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" @@ -63,6 +64,9 @@ void Button::DefaultButtonControllerDelegate::NotifyClick( const ui::Event& event) { button()->NotifyClick(event); + // Avoid outgoing tail calls to generate better stack frames for a crash. + // https://crbug.com/1215247 + base::debug::Alias(nullptr); } void Button::DefaultButtonControllerDelegate::OnClickCanceled(
diff --git a/ui/views/controls/link_unittest.cc b/ui/views/controls/link_unittest.cc index b84cd7ad..c934889 100644 --- a/ui/views/controls/link_unittest.cc +++ b/ui/views/controls/link_unittest.cc
@@ -87,8 +87,6 @@ EXPECT_TRUE(link_clicked); } -// This test doesn't work on Mac due to crbug.com/1071633. -#if !defined(OS_MAC) // Tests that hovering and unhovering a link adds and removes an underline. TEST_F(LinkTest, TestUnderlineOnHover) { // A non-hovered link should not be underlined. @@ -111,6 +109,5 @@ EXPECT_FALSE(link()->IsMouseHovered()); EXPECT_FALSE(link_underlined()); } -#endif // !defined(OS_MAC) } // namespace views
diff --git a/ui/views/controls/scroll_view.cc b/ui/views/controls/scroll_view.cc index df0bde7..72e3c83 100644 --- a/ui/views/controls/scroll_view.cc +++ b/ui/views/controls/scroll_view.cc
@@ -1077,6 +1077,9 @@ for (auto& observer : observers_) observer.OnContentsScrolled(); + + NotifyAccessibilityEvent(ax::mojom::Event::kScrollPositionChanged, + /*send_native_event=*/true); } void ScrollView::ScrollHeader() {
diff --git a/ui/views/test/event_generator_delegate_mac.mm b/ui/views/test/event_generator_delegate_mac.mm index 3875002..7029b99 100644 --- a/ui/views/test/event_generator_delegate_mac.mm +++ b/ui/views/test/event_generator_delegate_mac.mm
@@ -10,12 +10,16 @@ #include "base/memory/singleton.h" #include "base/stl_util.h" #include "ui/base/cocoa/cocoa_base_utils.h" +#include "ui/display/screen.h" +#include "ui/events/event.h" +#include "ui/events/event_dispatcher.h" #include "ui/events/event_processor.h" #include "ui/events/event_target.h" #include "ui/events/event_target_iterator.h" #include "ui/events/event_targeter.h" #import "ui/events/test/cocoa_test_event_utils.h" #include "ui/events/test/event_generator.h" +#include "ui/events/types/event_type.h" #include "ui/gfx/mac/coordinate_conversion.h" namespace { @@ -242,6 +246,9 @@ EventGeneratorDelegateMac(ui::test::EventGenerator* owner, gfx::NativeWindow root_window, gfx::NativeWindow target_window); + EventGeneratorDelegateMac(const EventGeneratorDelegateMac&) = delete; + EventGeneratorDelegateMac& operator=(const EventGeneratorDelegateMac&) = + delete; ~EventGeneratorDelegateMac() override; static EventGeneratorDelegateMac* instance() { return instance_; } @@ -312,6 +319,12 @@ void ConvertPointFromHost(const ui::EventTarget* hosted_target, gfx::Point* point) const override {} + protected: + // Overridden from ui::EventDispatcherDelegate (via ui::EventProcessor) + ui::EventDispatchDetails PreDispatchEvent(ui::EventTarget* target, + ui::Event* event) override + WARN_UNUSED_RESULT; + private: static EventGeneratorDelegateMac* instance_; @@ -329,8 +342,6 @@ // Timestamp on the last scroll update, used to simulate scroll momentum. base::TimeTicks last_scroll_timestamp_; - - DISALLOW_COPY_AND_ASSIGN(EventGeneratorDelegateMac); }; // static @@ -566,6 +577,28 @@ return gfx::Point(NSWidth([window frame]) / 2, NSHeight([window frame]) / 2); } +ui::EventDispatchDetails EventGeneratorDelegateMac::PreDispatchEvent( + ui::EventTarget* target, + ui::Event* event) { + // Set the TestScreen's cursor point before mouse event dispatch. The + // Screen's value is checked by views controls and other UI components; this + // pattern matches aura::WindowEventDispatcher::PreDispatchMouseEvent(). + if (event->IsMouseEvent()) { + ui::MouseEvent* mouse_event = event->AsMouseEvent(); + // Similar to the logic in Aura's + // EnvInputStateController::UpdateStateForMouseEvent(), capture change and + // synthesized events don't need to update the cursor location. + if (mouse_event->type() != ui::ET_MOUSE_CAPTURE_CHANGED && + !(mouse_event->flags() & ui::EF_IS_SYNTHESIZED)) { + // Update the cursor location on screen. + owner_->set_current_screen_location(mouse_event->root_location()); + display::Screen::GetScreen()->SetCursorScreenPointForTesting( + mouse_event->root_location()); + } + } + return ui::EventDispatchDetails(); +} + ui::test::EventGenerator* GetActiveGenerator() { return EventGeneratorDelegateMac::instance() ? EventGeneratorDelegateMac::instance()->owner()
diff --git a/ui/views/test/scoped_views_test_helper.cc b/ui/views/test/scoped_views_test_helper.cc index 9e5d355..7561a79 100644 --- a/ui/views/test/scoped_views_test_helper.cc +++ b/ui/views/test/scoped_views_test_helper.cc
@@ -8,6 +8,7 @@ #include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/test/test_clipboard.h" +#include "ui/display/test/test_screen.h" #include "ui/views/test/test_views_delegate.h" #if defined(USE_AURA) @@ -39,6 +40,10 @@ return test_helper_->GetContext(); } +display::test::TestScreen* ScopedViewsTestHelper::GetTestScreen() const { + return test_helper_->GetTestScreen(); +} + #if defined(USE_AURA) void ScopedViewsTestHelper::SimulateNativeDestroy(Widget* widget) { delete widget->GetNativeView();
diff --git a/ui/views/test/scoped_views_test_helper.h b/ui/views/test/scoped_views_test_helper.h index a34fb0a..90a0a3b 100644 --- a/ui/views/test/scoped_views_test_helper.h +++ b/ui/views/test/scoped_views_test_helper.h
@@ -13,6 +13,12 @@ #include "ui/views/test/views_test_helper.h" #include "ui/views/views_delegate.h" +namespace display { +namespace test { +class TestScreen; +} // namespace test +} // namespace display + namespace views { class TestViewsDelegate; @@ -37,6 +43,9 @@ // the RootWindow. Everywhere else, null. gfx::NativeWindow GetContext(); + // Returns the test screen created by |test_helper_|. + display::test::TestScreen* GetTestScreen() const; + // Simulate an OS-level destruction of the native window held by |widget|. void SimulateNativeDestroy(Widget* widget);
diff --git a/ui/views/test/views_test_base.cc b/ui/views/test/views_test_base.cc index 803521e9..31216a2 100644 --- a/ui/views/test/views_test_base.cc +++ b/ui/views/test/views_test_base.cc
@@ -15,6 +15,8 @@ #include "ui/base/clipboard/clipboard.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/ui_base_paths.h" +#include "ui/display/screen.h" +#include "ui/display/test/test_screen.h" #include "ui/gl/test/gl_surface_test_support.h" #include "ui/views/buildflags.h" #include "ui/views/test/test_platform_native_widget.h" @@ -150,6 +152,13 @@ } #endif +display::test::TestScreen* ViewsTestBase::GetTestScreen() const { + display::test::TestScreen* test_screen = test_helper_->GetTestScreen(); + // This TestScreen should be installed as the display::Screen singleton. + DCHECK_EQ(display::Screen::GetScreen(), test_screen); + return test_screen; +} + gfx::NativeWindow ViewsTestBase::GetContext() { return test_helper_->GetContext(); }
diff --git a/ui/views/test/views_test_base.h b/ui/views/test/views_test_base.h index 098850a..9eff7a5 100644 --- a/ui/views/test/views_test_base.h +++ b/ui/views/test/views_test_base.h
@@ -28,6 +28,12 @@ #include "ui/aura/window_tree_host.h" #endif +namespace display { +namespace test { +class TestScreen; +} // namespace test +} // namespace display + namespace views { // A base class for views unit test. It creates a message loop necessary @@ -94,6 +100,10 @@ // includes the menu bar and title bar. static int GetSystemReservedHeightAtTopOfScreen(); + // Returns the test screen installed by |test_helper_|. We also dcheck that it + // should be the global screen instance. + display::test::TestScreen* GetTestScreen() const; + protected: base::test::TaskEnvironment* task_environment() { return task_environment_.get();
diff --git a/ui/views/test/views_test_helper.h b/ui/views/test/views_test_helper.h index 8400415..0d0ff01d 100644 --- a/ui/views/test/views_test_helper.h +++ b/ui/views/test/views_test_helper.h
@@ -12,6 +12,12 @@ #include "ui/gfx/native_widget_types.h" #include "ui/views/views_delegate.h" +namespace display { +namespace test { +class TestScreen; +} // namespace test +} // namespace display + namespace views { class TestViewsDelegate; @@ -41,6 +47,9 @@ // Returns a context window, e.g. the Aura root window. virtual gfx::NativeWindow GetContext(); + // Return the test screen created by this class. + virtual display::test::TestScreen* GetTestScreen() const = 0; + protected: ViewsTestHelper() = default; };
diff --git a/ui/views/test/views_test_helper_aura.cc b/ui/views/test/views_test_helper_aura.cc index 56b4481d..5981bfb 100644 --- a/ui/views/test/views_test_helper_aura.cc +++ b/ui/views/test/views_test_helper_aura.cc
@@ -7,7 +7,9 @@ #include "base/check_op.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "ui/aura/test/test_screen.h" #include "ui/aura/window.h" +#include "ui/display/test/test_screen.h" #include "ui/views/test/test_views_delegate.h" namespace views { @@ -77,6 +79,10 @@ return aura_test_helper_->GetContext(); } +display::test::TestScreen* ViewsTestHelperAura::GetTestScreen() const { + return aura_test_helper_->GetTestScreen(); +} + // static void ViewsTestHelperAura::SetAuraTestHelperFactory( AuraTestHelperFactory factory) {
diff --git a/ui/views/test/views_test_helper_aura.h b/ui/views/test/views_test_helper_aura.h index 424848e..3e0226e 100644 --- a/ui/views/test/views_test_helper_aura.h +++ b/ui/views/test/views_test_helper_aura.h
@@ -10,6 +10,12 @@ #include "ui/aura/test/aura_test_helper.h" #include "ui/views/test/views_test_helper.h" +namespace display { +namespace test { +class TestScreen; +} // namespace test +} // namespace display + namespace views { class ViewsTestHelperAura : public ViewsTestHelper { @@ -27,6 +33,7 @@ std::unique_ptr<TestViewsDelegate> GetFallbackTestViewsDelegate() override; void SetUp() override; gfx::NativeWindow GetContext() override; + display::test::TestScreen* GetTestScreen() const override; // Provides a way for test bases to customize what test helper will be used // for |aura_test_helper_|.
diff --git a/ui/views/test/views_test_helper_mac.h b/ui/views/test/views_test_helper_mac.h index a9abea1..572cda2 100644 --- a/ui/views/test/views_test_helper_mac.h +++ b/ui/views/test/views_test_helper_mac.h
@@ -12,6 +12,13 @@ #include "ui/compositor/test/test_context_factories.h" #include "ui/views/test/views_test_helper.h" +namespace display { +namespace test { +class TestScreen; +class TestScreenMac; +} // namespace test +} // namespace display + namespace ui { namespace test { class ScopedFakeNSWindowFocus; @@ -32,6 +39,7 @@ void SetUpTestViewsDelegate( TestViewsDelegate* delegate, absl::optional<ViewsDelegate::NativeWidgetFactory> factory) override; + display::test::TestScreen* GetTestScreen() const override; private: ui::TestContextFactories context_factories_{false}; @@ -58,6 +66,8 @@ // more consistent with other platforms, where most views are focusable by // default. ui::test::ScopedFakeFullKeyboardAccess faked_full_keyboard_access_; + + std::unique_ptr<display::test::TestScreenMac> test_screen_; }; } // namespace views
diff --git a/ui/views/test/views_test_helper_mac.mm b/ui/views/test/views_test_helper_mac.mm index 1be8e50..32ed3c9 100644 --- a/ui/views/test/views_test_helper_mac.mm +++ b/ui/views/test/views_test_helper_mac.mm
@@ -10,6 +10,8 @@ #include "ui/base/test/scoped_fake_nswindow_focus.h" #include "ui/base/test/scoped_fake_nswindow_fullscreen.h" #include "ui/base/test/ui_controls.h" +#include "ui/display/mac/test/test_screen_mac.h" +#include "ui/display/test/test_screen.h" #include "ui/events/test/event_generator.h" #include "ui/views/test/event_generator_delegate_mac.h" #include "ui/views/test/test_views_delegate.h" @@ -40,6 +42,11 @@ faked_fullscreen_ = std::make_unique<ui::test::ScopedFakeNSWindowFullscreen>(); } + + test_screen_ = std::make_unique<display::test::TestScreenMac>(gfx::Size()); + // Purposely not use ScopedScreenOverride, in which GetScreen() will + // create a native screen. + display::Screen::SetScreenInstance(test_screen_.get()); } ViewsTestHelperMac::~ViewsTestHelperMac() { @@ -57,6 +64,7 @@ ui::test::EventGeneratorDelegate::SetFactoryFunction( ui::test::EventGeneratorDelegate::FactoryFunction()); } + display::Screen::SetScreenInstance(nullptr); } void ViewsTestHelperMac::SetUpTestViewsDelegate( @@ -66,4 +74,8 @@ delegate->set_context_factory(context_factories_.GetContextFactory()); } +display::test::TestScreen* ViewsTestHelperMac::GetTestScreen() const { + return test_screen_.get(); +} + } // namespace views
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc index 7cd172c..36592097 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -748,8 +748,9 @@ } void DesktopWindowTreeHostPlatform::OnWindowStateChanged( + ui::PlatformWindowState old_state, ui::PlatformWindowState new_state) { - bool was_minimized = old_state_ == ui::PlatformWindowState::kMinimized; + bool was_minimized = old_state == ui::PlatformWindowState::kMinimized; bool is_minimized = new_state == ui::PlatformWindowState::kMinimized; // Propagate minimization/restore to compositor to avoid drawing 'blank' @@ -765,8 +766,6 @@ } } - old_state_ = new_state; - // Now that we have different window properties, we may need to relayout the // window. (The windows code doesn't need this because their window change is // synchronous.)
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h index 26cc91cc..d1e8528 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.h
@@ -119,7 +119,8 @@ // PlatformWindowDelegate: void OnClosed() override; - void OnWindowStateChanged(ui::PlatformWindowState new_state) override; + void OnWindowStateChanged(ui::PlatformWindowState old_state, + ui::PlatformWindowState new_state) override; void OnCloseRequest() override; void OnWillDestroyAcceleratedWidget() override; void OnActivationChanged(bool active) override; @@ -141,8 +142,6 @@ return desktop_native_widget_aura_; } - ui::PlatformWindowState window_show_state() { return old_state_; } - // These are not general purpose methods and must be used with care. Please // make sure you understand the rounding direction before using. gfx::Rect ToDIPRect(const gfx::Rect& rect_in_pixels) const; @@ -181,11 +180,6 @@ DesktopWindowTreeHostPlatform* window_parent_ = nullptr; std::set<DesktopWindowTreeHostPlatform*> window_children_; - // Keep track of PlatformWindow state so that we would react correctly and set - // visibility only if the window was minimized or was unminimized from the - // normal state. - ui::PlatformWindowState old_state_ = ui::PlatformWindowState::kUnknown; - // Used for tab dragging in move loop requests. WindowMoveClientPlatform window_move_client_;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc index 51cbb691..40dff77 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform_unittest.cc
@@ -162,12 +162,14 @@ EXPECT_TRUE(widget->GetNativeWindow()->IsVisible()); // Pretend a PlatformWindow enters the minimized state. - host_platform->OnWindowStateChanged(ui::PlatformWindowState::kMinimized); + host_platform->OnWindowStateChanged(ui::PlatformWindowState::kUnknown, + ui::PlatformWindowState::kMinimized); EXPECT_FALSE(widget->GetNativeWindow()->IsVisible()); // Pretend a PlatformWindow exits the minimized state. - host_platform->OnWindowStateChanged(ui::PlatformWindowState::kNormal); + host_platform->OnWindowStateChanged(ui::PlatformWindowState::kMinimized, + ui::PlatformWindowState::kNormal); EXPECT_TRUE(widget->GetNativeWindow()->IsVisible()); }
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index cb78da7..0acbf22 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -30,6 +30,8 @@ #import "ui/base/test/scoped_fake_full_keyboard_access.h" #include "ui/compositor/layer.h" #include "ui/compositor/recyclable_compositor_mac.h" +#include "ui/display/screen.h" +#include "ui/display/test/scoped_screen_override.h" #import "ui/events/test/cocoa_test_event_utils.h" #include "ui/events/test/event_generator.h" #import "ui/gfx/mac/coordinate_conversion.h" @@ -202,6 +204,31 @@ DISALLOW_COPY_AND_ASSIGN(NativeWidgetMacTest); }; +// Uses the native screen instance to match test expectations when +// display::Screen is compared with values from direct OS API calls. +class NativeWidgetMacWithNativeScreenTest : public WidgetTest { + public: + NativeWidgetMacWithNativeScreenTest() = default; + NativeWidgetMacWithNativeScreenTest( + const NativeWidgetMacWithNativeScreenTest&) = delete; + NativeWidgetMacWithNativeScreenTest& operator=( + const NativeWidgetMacWithNativeScreenTest&) = delete; + ~NativeWidgetMacWithNativeScreenTest() override = default; + + void SetUp() override { + WidgetTest::SetUp(); + + native_screen_ = base::WrapUnique(display::CreateNativeScreen()); + scoped_screen_override_ = + std::make_unique<display::test::ScopedScreenOverride>( + native_screen_.get()); + } + + private: + std::unique_ptr<display::Screen> native_screen_; + std::unique_ptr<display::test::ScopedScreenOverride> scoped_screen_override_; +}; + class WidgetChangeObserver : public TestWidgetObserver { public: explicit WidgetChangeObserver(Widget* widget) : TestWidgetObserver(widget) {} @@ -1886,7 +1913,7 @@ } // Test the expected result of GetWorkAreaBoundsInScreen(). -TEST_F(NativeWidgetMacTest, GetWorkAreaBoundsInScreen) { +TEST_F(NativeWidgetMacWithNativeScreenTest, GetWorkAreaBoundsInScreen) { Widget widget; Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index cf6e7510..dc157d3 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/debug/alias.h" #include "base/feature_list.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" @@ -35,6 +36,9 @@ namespace views { +// Debug information for https://crbug.com/1215247. +int g_instance_count = 0; + //////////////////////////////////////////////////////////////////////////////// // DialogDelegate::Params: DialogDelegate::Params::Params() = default; @@ -44,6 +48,8 @@ // DialogDelegate: DialogDelegate::DialogDelegate() { + ++g_instance_count; + WidgetDelegate::RegisterWindowWillCloseCallback( base::BindOnce(&DialogDelegate::WindowWillClose, base::Unretained(this))); UMA_HISTOGRAM_BOOLEAN("Dialog.DialogDelegate.Create", true); @@ -382,10 +388,26 @@ } void DialogDelegate::AcceptDialog() { + // https://crbug.com/1215247 is a crash in this function, possibly a + // use-after-free on `this`. Empirically the steady state instance count with + // no dialogs open is 0. If it's still 0, someone deleted `this` before + // calling AcceptDialog(). + CHECK_GT(g_instance_count, 0); + + // This line might trigger a crash if `this` is deleted. + Widget* widget = GetWidget(); + + // Copy the dialog widget name onto the stack so it appears in crash dumps. + DEBUG_ALIAS_FOR_CSTR(last_widget_name, widget->GetName().c_str(), 64); + CHECK(IsDialogButtonEnabled(ui::DIALOG_BUTTON_OK)); if (already_started_close_ || !Accept()) return; + // Check for Accept() deleting `this` but returning false. + // https://crbug.com/1215247 + CHECK_GT(g_instance_count, 0); + already_started_close_ = true; GetWidget()->CloseWithReason( views::Widget::ClosedReason::kAcceptButtonClicked); @@ -406,6 +428,7 @@ DialogDelegate::~DialogDelegate() { UMA_HISTOGRAM_LONG_TIMES("Dialog.DialogDelegate.Duration", base::TimeTicks::Now() - creation_time_); + --g_instance_count; } ax::mojom::Role DialogDelegate::GetAccessibleWindowRole() {
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h index 47bf36d..556912ea 100644 --- a/ui/views/window/dialog_delegate.h +++ b/ui/views/window/dialog_delegate.h
@@ -279,7 +279,9 @@ // 2) Depending on their return value, close the dialog's widget. // Neither of these methods can be called before the dialog has been // initialized. - void AcceptDialog(); + // NOT_TAIL_CALLED forces the calling function to appear on the stack in + // crash dumps. https://crbug.com/1215247 + void NOT_TAIL_CALLED AcceptDialog(); void CancelDialog(); // This method invokes the behavior that *would* happen if this dialog's
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn index ff5e86df..feb3b9bd 100644 --- a/weblayer/BUILD.gn +++ b/weblayer/BUILD.gn
@@ -720,6 +720,7 @@ "//components/translate/content/android", "//components/version_info/android:channel_getter", "//components/webauthn/android", + "//google_apis", "//services/resource_coordinator/public/cpp/memory_instrumentation:browser", "//ui/android", "//url:gurl_android",
diff --git a/weblayer/browser/content_view_render_view.cc b/weblayer/browser/content_view_render_view.cc index 144cb2f..cbf19d89b 100644 --- a/weblayer/browser/content_view_render_view.cc +++ b/weblayer/browser/content_view_render_view.cc
@@ -24,6 +24,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/android/resources/resource_manager.h" #include "ui/android/view_android.h" #include "ui/android/window_android.h" @@ -36,67 +37,6 @@ namespace weblayer { -namespace { - -// Setting the page's various background color is convoluted and brittle and -// buggy. This is code inspired from chromeos views and should be considered -// temporary until content API can be fixed to be more robust. This is -// effectively only passing 1 bit of information, whether the background color -// is fully transparent or not, as the actual color isn't used by anything. -class WebContentsSetBackgroundColor - : public content::WebContentsObserver, - public content::WebContentsUserData<WebContentsSetBackgroundColor> { - public: - static void Set(content::WebContents* web_contents, - SkColor background_color) { - if (auto* set = FromWebContents(web_contents)) { - set->SetBackgroundColor(background_color); - return; - } - - // SupportsUserData::Data takes ownership over the - // WebContentsSetBackgroundColor instance and will destroy it when the - // WebContents instance is destroyed. - web_contents->SetUserData( - UserDataKey(), base::WrapUnique(new WebContentsSetBackgroundColor( - web_contents, background_color))); - } - - ~WebContentsSetBackgroundColor() override = default; - - private: - friend class content::WebContentsUserData<WebContentsSetBackgroundColor>; - WebContentsSetBackgroundColor(content::WebContents* web_contents, - SkColor color) - : content::WebContentsObserver(web_contents), color_(color) {} - - // content::WebContentsObserver: - void RenderViewHostChanged(content::RenderViewHost* old_host, - content::RenderViewHost* new_host) override { - new_host->GetWidget()->GetView()->SetBackgroundColor(color_); - } - - void SetBackgroundColor(SkColor background_color) { - if (color_ == background_color) - return; - - color_ = background_color; - web_contents() - ->GetRenderViewHost() - ->GetWidget() - ->GetView() - ->SetBackgroundColor(color_); - } - - SkColor color_; - - WEB_CONTENTS_USER_DATA_KEY_DECL(); -}; - -WEB_CONTENTS_USER_DATA_KEY_IMPL(WebContentsSetBackgroundColor) - -} // namespace - ContentViewRenderView::ContentViewRenderView(JNIEnv* env, jobject obj, gfx::NativeWindow root_window) @@ -136,11 +76,8 @@ InitCompositor(); content::WebContents* web_contents = content::WebContents::FromJavaWebContents(jweb_contents); - if (web_contents_) { - WebContentsSetBackgroundColor::Set( - web_contents_, - Java_ContentViewRenderView_getBackgroundColor(env, java_obj_)); - } + if (web_contents_) + web_contents_->SetPageBaseBackgroundColor(absl::nullopt); if (web_contents_layer_) web_contents_layer_->RemoveFromParent(); @@ -271,12 +208,9 @@ void ContentViewRenderView::UpdateWebContentsBaseBackgroundColor() { if (!web_contents_) return; - JNIEnv* env = base::android::AttachCurrentThread(); - WebContentsSetBackgroundColor::Set( - web_contents_, - use_transparent_background_ - ? SK_ColorTRANSPARENT - : Java_ContentViewRenderView_getBackgroundColor(env, java_obj_)); + web_contents_->SetPageBaseBackgroundColor( + use_transparent_background_ ? absl::make_optional(SK_ColorTRANSPARENT) + : absl::nullopt); } } // namespace weblayer
diff --git a/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc b/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc index 9ae9d91b7..23bf9047 100644 --- a/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc +++ b/weblayer/browser/safe_browsing/safe_browsing_browsertest.cc
@@ -18,6 +18,7 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/test/test_utils.h" +#include "google_apis/gaia/gaia_constants.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "weblayer/browser/browser_context_impl.h" @@ -453,7 +454,8 @@ GURL b_url(embedded_test_server()->GetURL("a.com", "/simple_page.html")); NavigateAndWaitForCompletion(a_url, shell()->tab()); - std::set<std::string> safe_browsing_scopes = {safe_browsing::kAPIScope}; + std::set<std::string> safe_browsing_scopes = { + GaiaConstants::kChromeSafeBrowsingOAuth2Scope}; EXPECT_TRUE(access_token_fetch_delegate()->has_received_request()); EXPECT_EQ(safe_browsing_scopes, access_token_fetch_delegate()->scopes_from_most_recent_request()); @@ -472,7 +474,8 @@ GURL a_url(embedded_test_server()->GetURL("a.com", "/simple_page.html")); NavigateAndWaitForCompletion(a_url, shell()->tab()); - std::set<std::string> safe_browsing_scopes = {safe_browsing::kAPIScope}; + std::set<std::string> safe_browsing_scopes = { + GaiaConstants::kChromeSafeBrowsingOAuth2Scope}; EXPECT_TRUE(access_token_fetch_delegate()->has_received_request()); EXPECT_EQ(safe_browsing_scopes, access_token_fetch_delegate()->scopes_from_most_recent_request());
diff --git a/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl.cc b/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl.cc index 1eca96e..4b834296 100644 --- a/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl.cc +++ b/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl.cc
@@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/memory/weak_ptr.h" +#include "google_apis/gaia/gaia_constants.h" #include "weblayer/public/google_account_access_token_fetch_delegate.h" namespace weblayer { @@ -36,7 +37,7 @@ // In contrast, this object does *not* have a determined lifetime relationship // with |delegate|. delegate->FetchAccessToken( - {safe_browsing::kAPIScope}, + {GaiaConstants::kChromeSafeBrowsingOAuth2Scope}, base::BindOnce(&SafeBrowsingTokenFetcherImpl::OnTokenFetched, weak_ptr_factory_.GetWeakPtr(), request_id)); } @@ -48,8 +49,8 @@ if (!delegate) return; - delegate->OnAccessTokenIdentifiedAsInvalid({safe_browsing::kAPIScope}, - invalid_access_token); + delegate->OnAccessTokenIdentifiedAsInvalid( + {GaiaConstants::kChromeSafeBrowsingOAuth2Scope}, invalid_access_token); } void SafeBrowsingTokenFetcherImpl::OnTokenFetched(
diff --git a/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl_unittest.cc b/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl_unittest.cc index 8456946..6afeefac 100644 --- a/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl_unittest.cc +++ b/weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl_unittest.cc
@@ -5,6 +5,7 @@ #include "weblayer/browser/safe_browsing/safe_browsing_token_fetcher_impl.h" #include "content/public/test/browser_task_environment.h" +#include "google_apis/gaia/gaia_constants.h" #include "testing/gtest/include/gtest/gtest.h" #include "weblayer/public/google_account_access_token_fetch_delegate.h" @@ -38,7 +39,8 @@ // All access token requests made by SafeBrowsingTokenFetcherImpl should be // for the safe browsing scope. - std::set<std::string> expected_scopes = {safe_browsing::kAPIScope}; + std::set<std::string> expected_scopes = { + GaiaConstants::kChromeSafeBrowsingOAuth2Scope}; EXPECT_EQ(expected_scopes, scopes); outstanding_callbacks_[most_recent_request_id_] = std::move(callback); @@ -48,7 +50,8 @@ const std::string& token) override { // All invalid token notifications originating from // SafeBrowsingTokenFetcherImpl should be for the safe browsing scope. - std::set<std::string> expected_scopes = {safe_browsing::kAPIScope}; + std::set<std::string> expected_scopes = { + GaiaConstants::kChromeSafeBrowsingOAuth2Scope}; EXPECT_EQ(expected_scopes, scopes); invalid_token_ = token;
diff --git a/weblayer/renderer/content_renderer_client_impl.cc b/weblayer/renderer/content_renderer_client_impl.cc index b6483bd..4b28627f6 100644 --- a/weblayer/renderer/content_renderer_client_impl.cc +++ b/weblayer/renderer/content_renderer_client_impl.cc
@@ -27,7 +27,6 @@ #include "components/webapps/renderer/web_page_metadata_agent.h" #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" -#include "content/public/renderer/render_view.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_runtime_features.h" #include "ui/base/resource/resource_bundle.h" @@ -154,7 +153,7 @@ if (!render_frame->IsMainFrame()) { auto* main_frame_no_state_prefetch_helper = prerender::NoStatePrefetchHelper::Get( - render_frame->GetRenderView()->GetMainRenderFrame()); + render_frame->GetMainRenderFrame()); if (main_frame_no_state_prefetch_helper) { // Avoid any race conditions from having the browser tell subframes that // they're no-state prefetching.
diff --git a/weblayer/test/BUILD.gn b/weblayer/test/BUILD.gn index de30e40e..dcfdb35 100644 --- a/weblayer/test/BUILD.gn +++ b/weblayer/test/BUILD.gn
@@ -301,6 +301,7 @@ ":run_all_unittests", "//components/favicon/core:database", "//components/site_isolation", + "//google_apis", ] sources = [ "../browser/favicon/favicon_backend_wrapper_unittest.cc",